# 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)
```markdown
# 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
-------------------
+ CUS_ID
- CUS_FIRST_NAME
- CUS_LAST_NAME
- CUS_EMAIL
- CUS_CREATED_AT"]
ORDER["ORDER
-------------------
+ ORD_ID
- ORD_DATE
- ORD_TOTAL_AMOUNT
- ORD_STATUS"]
PRODUCT["PRODUCT
-------------------
+ PRO_ID
- PRO_NAME
- PRO_PRICE
- PRO_STOCK"]
CATEGORY["CATEGORY
-------------------
+ CAT_ID
- CAT_NAME"]
%% ASSOCIATIONS
ASSOC_PASSER(["PASSER"])
ASSOC_CONTIENT(["CONTIENT
-------------------
- ITE_QUANTITY
- 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** (CUS_ID, CUS_FIRST_NAME, CUS_LAST_NAME, CUS_EMAIL, CUS_CREATED_AT)
- **ECO_CATEGORY** (CAT_ID, CAT_NAME)
- **ECO_PRODUCT** (PRO_ID, PRO_NAME, PRO_PRICE, PRO_STOCK, #PRO_CAT_ID)
- **ECO_ORDER** (ORD_ID, ORD_DATE, ORD_TOTAL_AMOUNT, ORD_STATUS, #ORD_CUS_ID)
- **ECO_ORDER_ITEM** (#ITE_ORD_ID, #ITE_PRO_ID, ITE_QUANTITY, ITE_UNIT_PRICE)
*Note: Les clés primaires sont soulignées (PK) 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. |
```