Comment transformer un schéma entité-association en un ensemble de tables prêtes à être créées : règles de passage, clés primaires, clés étrangères.
Tu as un MCD complet : entités, attributs, relations nommées, cardinalités. Tu sais aussi que chaque ligne d'une table doit avoir un identifiant unique. Il manque une étape : comment relier les tables entre elles pour matérialiser les relations du MCD.
L'objectif de ce cours est d'apprendre les règles de traduction d'un MCD vers un modèle logique de données — le MLD. À la fin, tu auras une liste de tables avec toutes leurs colonnes, prêtes à être créées dans le SGBDR au prochain cours.
À la fin de cette séquence, tu seras capable de :
0,n / 1,1 en clé étrangèreReprenons deux entités du MCD billetterie :
┌──────────────────┐ 0,n ┌─────────────┐ 1,1 ┌──────────────────┐
│ CLIENT │───────│ achète │───────│ TICKET │
│──────────────────│ │ ◇ │ │──────────────────│
│ nom │ └─────────────┘ │ prix │
│ prénom │ │ statut │
└──────────────────┘ └──────────────────┘
On a vu dans le cours sur les identifiants que chaque table aura un id :
client(id, nom, prenom)
ticket(id, prix, statut)
Mais avec juste ça, rien ne relie un ticket à son client. Si je regarde la ligne ticket n°42, je ne sais pas qui l'a acheté.
L'idée est simple : on ajoute dans la table ticket une colonne qui contient l'id du client propriétaire :
| id | prix | statut | client_id |
|---|---|---|---|
| 1 | 12 | payé | 3 |
| 2 | 12 | payé | 3 |
| 3 | 15 | réservé | 7 |
Tickets n°1 et n°2 appartiennent au client n°3. Ticket n°3 appartient au client n°7. La relation achète du MCD est maintenant matérialisée par cette colonne.
Cette colonne porte un nom précis : clé étrangère (🇬🇧 foreign key, FK). Elle est étrangère parce qu'elle référence la clé primaire d'une autre table.
💡 Règle d'or : une clé étrangère contient toujours une valeur qui existe dans la clé primaire de la table référencée. Le SGBDR refusera d'insérer un ticket avec
client_id = 999si aucun client n°999 n'existe.
Pour chaque entité du MCD :
id comme clé primaire (INT AUTO_INCREMENT)Entité ÉVÉNEMENT (titre, date, prix_base)
│
▼
Table evenement (id, titre, date, prix_base)
0,n / 1,1 devient une clé étrangèreC'est le cas le plus fréquent et celui qui te servira partout.
Principe : la clé étrangère est placée du côté 1,1.
Pourquoi ? Parce que du côté 1,1, chaque occurrence pointe vers exactement un élément de l'autre côté — une seule colonne suffit pour stocker cette référence.
CLIENT ────0,n─── achète ───1,1───► TICKET
(↑ la FK va ici : client_id)
À l'inverse, du côté 0,n, un client peut avoir plusieurs tickets — on ne pourrait pas stocker plusieurs ids dans une seule colonne.
Résultat sur le MCD billetterie :
client (id, nom, prenom, email, telephone)
evenement (id, titre, date, prix_base)
ticket (id, prix, statut, date_achat, #client_id, #evenement_id)
Le # signale une clé étrangère. La table ticket reçoit deux clés étrangères parce qu'elle participe à deux relations 0,n / 1,1 (avec client et avec evenement).
0,1 / 0,n se traite pareilMême logique : la FK va du côté du maximum à 1. La différence avec 1,1 : la colonne peut être vide (NULL autorisé).
LIEU ────0,n─── accueille ───0,1───► ÉVÉNEMENT
(FK : lieu_id, NULL autorisé)
Un événement peut ne pas avoir de lieu encore défini → lieu_id peut être NULL.
Sur papier (ou dans un cahier), on écrit un MLD avec les conventions suivantes :
#→ (ou une note) précise vers quelle table pointe la FKclient (id, nom, prenom, email, telephone)
─
evenement (id, titre, date, prix_base)
─
ticket (id, prix, statut, date_achat, #client_id, #evenement_id)
─ └──→ client.id
└──→ evenement.id
Cette écriture est suffisante pour créer ensuite les tables dans le SGBDR. Toutes les informations nécessaires sont là.
Au moment de créer la table, le SGBDR exigera un type pour chaque colonne. Voici les plus utiles à ce stade :
| Type | Pour stocker | Exemple |
|---|---|---|
INT |
un entier | un id, un prix en centimes, un nombre |
VARCHAR(n) |
du texte court (max n caractères) |
un nom, un email, un titre |
TEXT |
du texte long sans limite pratique | une description, un commentaire |
DATE |
une date AAAA-MM-JJ |
une date d'événement |
DATETIME |
une date + heure | une date d'achat précise |
DECIMAL(p,d) |
un nombre à virgule fixe | un prix : DECIMAL(6,2) = jusqu'à 9999,99 |
BOOLEAN |
vrai / faux | un statut binaire |
⚠️ Évite
FLOATpour de l'argent.DECIMALgarantit la précision exacte ;FLOATarrondit subtilement et provoque des erreurs de centimes.
client (
id INT PK AUTO_INCREMENT
nom VARCHAR(100) NOT NULL
prenom VARCHAR(100) NOT NULL
email VARCHAR(150)
telephone VARCHAR(20)
)
evenement (
id INT PK AUTO_INCREMENT
titre VARCHAR(200) NOT NULL
date DATETIME NOT NULL
prix_base DECIMAL(6,2) NOT NULL
)
ticket (
id INT PK AUTO_INCREMENT
prix DECIMAL(6,2) NOT NULL
statut VARCHAR(20) NOT NULL
date_achat DATETIME NOT NULL
client_id INT FK → client.id NOT NULL
evenement_id INT FK → evenement.id NOT NULL
)
C'est ce que tu vas littéralement encoder dans HeidiSQL au prochain cours.
0,1 / 0,1Plus rare, mais ça arrive : deux entités liées au maximum une seule fois de chaque côté.
Exemple : un employe est rattaché à au plus un casier, et un casier est attribué à au plus un employé.
EMPLOYE ────0,1─── possède ───0,1───► CASIER
Règle : on peut placer la FK d'un côté ou de l'autre — peu importe techniquement. On choisit :
UNIQUE sur la FK pour interdire qu'elle se répète (sinon on retomberait sur du 0,n / 0,1)employe (id, nom, prenom)
casier (id, numero, #employe_id UNIQUE)
💡 Ce cas est rare en pratique. On préfère souvent regrouper les deux entités dans une seule table quand la relation est aussi exclusive. Mais c'est utile à connaître.
Quand tu reçois un MCD, voici la procédure à suivre :
id comme clé primaire0,n / 1,1 : ajouter une FK dans la table du côté 1,10,n / 0,1 : ajouter une FK dans la table du côté 0,1, autorisée à NULLSi tu termines avec autant de relations que de FK ajoutées, ton MLD est cohérent.
Voici un MCD simplifié :
┌──────────────┐ 0,n 1,1 ┌─────────────┐ 0,n 1,1 ┌──────────────┐
│ ELEVE │──── emprunte ──│ PRET │──── porte sur──│ LIVRE │
│──────────────│ │─────────────│ │──────────────│
│ nom │ │ date_pret │ │ titre │
│ prenom │ │ date_retour │ │ auteur │
│ classe │ └─────────────┘ │ isbn │
└──────────────┘ └──────────────┘
Questions :
eleve_id ? La clé étrangère livre_id ?Sans consulter la Partie 3, écris le MLD complet du système de billetterie en notation textuelle. Compare ensuite avec la correction.
Reprends le MCD que tu as construit en séquence 4 (garage, formation, Discord, ou autre). Applique la procédure de la Partie 6 et écris le MLD complet — types compris.
⚠️ Vérification finale : chaque relation du MCD doit avoir donné lieu à exactement une clé étrangère dans ton MLD. Ni plus, ni moins.
id comme clé primaire.0,n / 1,1 (ou 0,n / 0,1) : la FK va du côté 1.Tu as maintenant un MLD prêt à l'emploi. Dans le prochain cours, on ouvre HeidiSQL, on lance MySQL via Laragon, et on crée concrètement la première base et ses premières tables. Les clés étrangères, elles, auront leur cours dédié juste après.