Skills/mcd-mld-designer/examples/ecommerce-sample.md

7.6 KiB

End-to-End Database Design Example: E-Commerce Platform

This reference demonstrates the exact structure and content required for db/mcd.md and db/mld.md in a project named ECOMMERCE (Database Trigram: ECO).


1. File: db/mcd.md (Conceptual Data Model)

# Modèle Conceptuel de Données (MCD) - E-Commerce Platform

**Projet**: E-Commerce Platform  
**Trigramme Base de Données**: `ECO`  
**Dernière mise à jour**: 2026-09-12  
**Version**: 1.0.0

---

## 1. Dictionnaire des Données

| Code Propriété | Libellé / Description | Type | Contraintes | Entité Source |
| :--- | :--- | :--- | :--- | :--- |
| `CUS_ID` | Identifiant unique du client | INT | PK, NOT NULL | CUSTOMER |
| `CUS_FIRST_NAME` | Prénom du client | VARCHAR(50) | NOT NULL | CUSTOMER |
| `CUS_LAST_NAME` | Nom de famille du client | VARCHAR(50) | NOT NULL | CUSTOMER |
| `CUS_EMAIL` | Adresse e-mail du client | VARCHAR(150) | UNIQUE, NOT NULL | CUSTOMER |
| `CUS_CREATED_AT` | Date d'inscription | TIMESTAMP | NOT NULL | CUSTOMER |
| `ORD_ID` | Identifiant unique de la commande | INT | PK, NOT NULL | ORDER |
| `ORD_DATE` | Date de la commande | TIMESTAMP | NOT NULL | ORDER |
| `ORD_TOTAL_AMOUNT` | Montant total de la commande | DECIMAL(10,2) | NOT NULL, >= 0 | ORDER |
| `ORD_STATUS` | Statut de la commande (PENDING, PAID, SHIPPED) | VARCHAR(20) | NOT NULL | ORDER |
| `PRO_ID` | Identifiant unique du produit | INT | PK, NOT NULL | PRODUCT |
| `PRO_NAME` | Nom du produit | VARCHAR(100) | NOT NULL | PRODUCT |
| `PRO_PRICE` | Prix unitaire hors taxe | DECIMAL(10,2) | NOT NULL, >= 0 | PRODUCT |
| `PRO_STOCK` | Quantité en stock | INT | NOT NULL, >= 0 | PRODUCT |
| `CAT_ID` | Identifiant de la catégorie | INT | PK, NOT NULL | CATEGORY |
| `CAT_NAME` | Nom de la catégorie | VARCHAR(50) | UNIQUE, NOT NULL | CATEGORY |
| `ITE_QUANTITY` | Quantité commandée pour un produit | INT | NOT NULL, > 0 | CONTIENT (ASSOCIATION) |
| `ITE_UNIT_PRICE` | Prix unitaire facturé au moment de l'achat | DECIMAL(10,2) | NOT NULL | CONTIENT (ASSOCIATION) |

---

## 2. Règles de Gestion & Associations

1. **PASSER (PLACE)** :
   - Un client peut passer 0 ou plusieurs commandes : `CUSTOMER (0,N)`.
   - Une commande est passée par exactement un client : `ORDER (1,1)`.
2. **CONTIENT (CONTAIN)** :
   - Une commande contient 1 ou plusieurs produits : `ORDER (1,N)`.
   - Un produit peut figurer dans 0 ou plusieurs commandes : `PRODUCT (0,N)`.
   - Propriétés de l'association : `ITE_QUANTITY`, `ITE_UNIT_PRICE`.
3. **CLASSIFIER (CLASSIFY)** :
   - Une catégorie peut contenir 0 ou plusieurs produits : `CATEGORY (0,N)`.
   - Un produit appartient obligatoirement à une et une seule catégorie : `PRODUCT (1,1)`.

---

## 3. Diagramme Conceptuel (MCD)

```mermaid
flowchart LR
    %% ENTITIES
    CUSTOMER["CUSTOMER<br/>-------------------<br/>+ CUS_ID<br/>- CUS_FIRST_NAME<br/>- CUS_LAST_NAME<br/>- CUS_EMAIL<br/>- CUS_CREATED_AT"]
    
    ORDER["ORDER<br/>-------------------<br/>+ ORD_ID<br/>- ORD_DATE<br/>- ORD_TOTAL_AMOUNT<br/>- ORD_STATUS"]
    
    PRODUCT["PRODUCT<br/>-------------------<br/>+ PRO_ID<br/>- PRO_NAME<br/>- PRO_PRICE<br/>- PRO_STOCK"]
    
    CATEGORY["CATEGORY<br/>-------------------<br/>+ CAT_ID<br/>- CAT_NAME"]

    %% ASSOCIATIONS
    ASSOC_PASSER(["PASSER"])
    ASSOC_CONTIENT(["CONTIENT<br/>-------------------<br/>- ITE_QUANTITY<br/>- ITE_UNIT_PRICE"])
    ASSOC_CLASSIER(["CLASSIFIER"])

    %% CARDINALITIES
    CUSTOMER ---|"0,N"| ASSOC_PASSER
    ASSOC_PASSER ---|"1,1"| ORDER

    ORDER ---|"1,N"| ASSOC_CONTIENT
    ASSOC_CONTIENT ---|"0,N"| PRODUCT

    PRODUCT ---|"1,1"| ASSOC_CLASSIER
    ASSOC_CLASSIER ---|"0,N"| CATEGORY

    %% STYLING
    classDef entity fill:#e1f5fe,stroke:#0288d1,stroke-width:2px,color:#01579b;
    classDef assoc fill:#fff3e0,stroke:#f57c00,stroke-width:2px,color:#e65100;
    class CUSTOMER,ORDER,PRODUCT,CATEGORY entity;
    class ASSOC_PASSER,ASSOC_CONTIENT,ASSOC_CLASSIER assoc;

4. Historique des Modifications (Changelog)

Version Date Auteur Description des modifications
1.0.0 2026-09-12 AI Assistant Création initiale du MCD avec CUSTOMER, ORDER, PRODUCT, CATEGORY.

---

## 2. File: `db/mld.md` (Logical Data Model)

```markdown
# Modèle Logique de Données (MLD) - E-Commerce Platform

**Projet**: E-Commerce Platform  
**Trigramme Base de Données**: `ECO`  
**Dernière mise à jour**: 2026-09-12  
**Version**: 1.0.0

---

## 1. Schéma Relationnel Textuel

- **ECO_CUSTOMER** (<u>CUS_ID</u>, CUS_FIRST_NAME, CUS_LAST_NAME, CUS_EMAIL, CUS_CREATED_AT)
- **ECO_CATEGORY** (<u>CAT_ID</u>, CAT_NAME)
- **ECO_PRODUCT** (<u>PRO_ID</u>, PRO_NAME, PRO_PRICE, PRO_STOCK, #PRO_CAT_ID)
- **ECO_ORDER** (<u>ORD_ID</u>, ORD_DATE, ORD_TOTAL_AMOUNT, ORD_STATUS, #ORD_CUS_ID)
- **ECO_ORDER_ITEM** (<u>#ITE_ORD_ID</u>, <u>#ITE_PRO_ID</u>, ITE_QUANTITY, ITE_UNIT_PRICE)

*Note: Les clés primaires sont soulignées (<u>PK</u>) et les clés étrangères sont préfixées d'un dièse (#).*

---

## 2. Description des Tables & Contraintes

### 2.1 Table `ECO_CUSTOMER`
- `CUS_ID`: INT, PRIMARY KEY, AUTO_INCREMENT
- `CUS_FIRST_NAME`: VARCHAR(50), NOT NULL
- `CUS_LAST_NAME`: VARCHAR(50), NOT NULL
- `CUS_EMAIL`: VARCHAR(150), UNIQUE, NOT NULL
- `CUS_CREATED_AT`: TIMESTAMP, DEFAULT CURRENT_TIMESTAMP

### 2.2 Table `ECO_CATEGORY`
- `CAT_ID`: INT, PRIMARY KEY, AUTO_INCREMENT
- `CAT_NAME`: VARCHAR(50), UNIQUE, NOT NULL

### 2.3 Table `ECO_PRODUCT`
- `PRO_ID`: INT, PRIMARY KEY, AUTO_INCREMENT
- `PRO_NAME`: VARCHAR(100), NOT NULL
- `PRO_PRICE`: DECIMAL(10,2), NOT NULL, CHECK (PRO_PRICE >= 0)
- `PRO_STOCK`: INT, NOT NULL, DEFAULT 0, CHECK (PRO_STOCK >= 0)
- `PRO_CAT_ID`: INT, NOT NULL, FOREIGN KEY REFERENCES `ECO_CATEGORY(CAT_ID)`

### 2.4 Table `ECO_ORDER`
- `ORD_ID`: INT, PRIMARY KEY, AUTO_INCREMENT
- `ORD_DATE`: TIMESTAMP, NOT NULL, DEFAULT CURRENT_TIMESTAMP
- `ORD_TOTAL_AMOUNT`: DECIMAL(10,2), NOT NULL, CHECK (ORD_TOTAL_AMOUNT >= 0)
- `ORD_STATUS`: VARCHAR(20), NOT NULL, CHECK (ORD_STATUS IN ('PENDING', 'PAID', 'SHIPPED', 'CANCELLED'))
- `ORD_CUS_ID`: INT, NOT NULL, FOREIGN KEY REFERENCES `ECO_CUSTOMER(CUS_ID)`

### 2.5 Table `ECO_ORDER_ITEM` (Junction Table)
- `ITE_ORD_ID`: INT, NOT NULL, FOREIGN KEY REFERENCES `ECO_ORDER(ORD_ID)` ON DELETE CASCADE
- `ITE_PRO_ID`: INT, NOT NULL, FOREIGN KEY REFERENCES `ECO_PRODUCT(PRO_ID)`
- `ITE_QUANTITY`: INT, NOT NULL, CHECK (ITE_QUANTITY > 0)
- `ITE_UNIT_PRICE`: DECIMAL(10,2), NOT NULL, CHECK (ITE_UNIT_PRICE >= 0)
- **PRIMARY KEY**: `(ITE_ORD_ID, ITE_PRO_ID)`

---

## 3. Diagramme Logique (MLD)

```mermaid
erDiagram
    ECO_CUSTOMER {
        INT CUS_ID PK
        VARCHAR CUS_FIRST_NAME
        VARCHAR CUS_LAST_NAME
        VARCHAR CUS_EMAIL
        TIMESTAMP CUS_CREATED_AT
    }

    ECO_CATEGORY {
        INT CAT_ID PK
        VARCHAR CAT_NAME
    }

    ECO_PRODUCT {
        INT PRO_ID PK
        VARCHAR PRO_NAME
        DECIMAL PRO_PRICE
        INT PRO_STOCK
        INT PRO_CAT_ID FK
    }

    ECO_ORDER {
        INT ORD_ID PK
        TIMESTAMP ORD_DATE
        DECIMAL ORD_TOTAL_AMOUNT
        VARCHAR ORD_STATUS
        INT ORD_CUS_ID FK
    }

    ECO_ORDER_ITEM {
        INT ITE_ORD_ID PK,FK
        INT ITE_PRO_ID PK,FK
        INT ITE_QUANTITY
        DECIMAL ITE_UNIT_PRICE
    }

    ECO_CUSTOMER ||--o{ ECO_ORDER : "places"
    ECO_CATEGORY ||--o{ ECO_PRODUCT : "classifies"
    ECO_ORDER ||--|{ ECO_ORDER_ITEM : "contains"
    ECO_PRODUCT ||--o{ ECO_ORDER_ITEM : "ordered_in"

4. Historique des Modifications (Changelog)

Version Date Auteur Description des modifications
1.0.0 2026-09-12 AI Assistant Création initiale du MLD avec ECO_CUSTOMER, ECO_CATEGORY, ECO_PRODUCT, ECO_ORDER, ECO_ORDER_ITEM.