Aller au contenu principal

Du MCD au modèle relationnel

Ce que ce chapitre apporte 4 points
  • Tirer d'un énoncé les entités, les associations et leurs cardinalités
  • Traduire un modèle conceptuel en tables : placer chaque clé étrangère, créer les tables de liaison
  • Écrire en SQL les tables d'un modèle, avec leurs clés et leurs contraintes
  • Choisir pour chaque clé étrangère entre CASCADE, RESTRICT et SET NULL

Le service de scolarité d'une école tient ses inscriptions dans un tableur : une ligne par étudiant et par cours, avec le nom de l'étudiant, l'intitulé du cours, le nom de son enseignant et la note. Trois accidents s'y répètent. Une enseignante change de nom, et il faut corriger les quarante lignes de ses cours ; le nom d'un étudiant inscrit à trois cours finit écrit de trois façons ; un cours retiré du catalogue emporte avec ses lignes les notes de ses inscrits. La scolarité veut une base qui rende ces accidents impossibles. Combien de tables lui faut-il, dans laquelle ranger la note, et que doit faire la base quand on supprime un cours qui a encore des inscrits ? Ce chapitre s'appuie sur les dépendances fonctionnelles du chapitre sur les systèmes d'information.

Pourquoi modéliser ?

La méthode Merise modélise en trois niveaux, du plus proche du métier au plus proche de la machine :

NiveauObjectifReprésentationActeur
MCD (Modèle Conceptuel des Données)Décrire le « quoi » sans penser à la techniqueEntités, associations, cardinalitésAnalyste / Client
MLD (Modèle Logique des Données)Traduire en tables relationnellesTables, et les colonnes qui les relientConcepteur
MPD (Modèle Physique des Données)Implémenter dans le logiciel de la baseSQL, types des colonnes, contraintesDéveloppeur

Le MCD décrit le monde réel, ses objets et leurs liens, sans penser à SQL : la technique n'arrive qu'avec le MLD. Le SGBD (système de gestion de base de données) est le logiciel qui stocke la base et exécute les requêtes : MySQL, par exemple, dont l'installation sur une machine a son propre chapitre.

MCD : Modèle Conceptuel des Données

Les quatre composants fondamentaux

Un MCD est composé de quatre briques.

Entité

Une entité représente un objet ou un acteur du monde réel que le système doit mémoriser. Elle est représentée par un rectangle.

Critère : si on peut en dresser une liste et stocker des informations dessus, c'est probablement une entité.

Exemples

Client, Produit, Commande, Enseignant, Cours

Attribut

Un attribut est une propriété d'une entité. C'est une information simple et atomique (une seule valeur).

Exemples

Pour Client : idClient, nom, email, dateNaissance

Association

Une association exprime un lien entre deux entités (ou plus). Elle est représentée par un losange.

Exemples : Passe (entre Client et Commande), Enseigne (entre Enseignant et Cours), Habite (entre Personne et Ville)

Le mot « relation » est à éviter ici, même si on l'entend souvent : dans le modèle relationnel, et dans le chapitre sur l'algèbre relationnelle, une relation est une table. Merise dit association pour le losange.

Cardinalité

La cardinalité indique combien de fois une occurrence de l'entité, c'est-à-dire un client ou une commande en particulier, peut participer à une association. Elle s'écrit (min, max) de chaque côté de l'association.

Un premier MCD

Modèle conceptuel de données
Client
idClient
nom
email
0,N
Passe
1,1
Commande
idCommande
dateCommande
statut

Rectangle : entité, identifiant souligné. Losange : association. Les couples min,max portés sur les pattes se lisent depuis l'entité la plus proche.

Lecture : un client peut passer 0 à N commandes. Une commande est passée par exactement 1 client.

La dissymétrie des deux cardinalités décidera plus loin de la façon de relier les deux tables.

Les cardinalités en détail

Les cardinalités se lisent toujours du côté de l'entité vers l'association : « cette entité participe à cette association au minimum X fois et au maximum Y fois. »

CardinalitéSignificationExemple concretQuestion à se poser
(0,1)Facultatif, au plus une foisUn employé peut avoir 0 ou 1 voiture de fonction« Peut ne pas avoir de... »
(1,1)Obligatoire, exactement une foisUne commande appartient à exactement 1 client« A toujours exactement un... »
(0,N)Facultatif, zéro ou plusieursUn client peut avoir passé 0 ou plusieurs commandes« Peut avoir plusieurs... »
(1,N)Obligatoire, au moins une foisUn cours a au moins 1 étudiant inscrit« A toujours au moins un... »

Méthode : « Un(e) [entité A] peut/doit participer à [association] ... fois. »

Pour [Auteur] --(1,N)-- <Ecrit> --(1,1)-- [Livre] :
→ Un auteur écrit au moins 1 livre (1,N)
→ Un livre est écrit par exactement 1 auteur (1,1)

Merise et les diagrammes de classes placent les nombres à l'opposé

En Merise, la cardinalité s'écrit du côté de l'entité qu'elle décrit : Auteur (1,N) dit qu'un auteur écrit au moins un livre. Dans un diagramme de classes UML (Unified Modeling Language, la notation de modélisation des développeurs), comme dans le chapitre Modéliser avec UML du parcours Génie logiciel, le même fait s'écrit Auteur 1 ---- 1..* Livre : le 1..* est placé du côté des livres, et se lit depuis la classe opposée. Avant de lire un schéma, regarder d'abord quelle notation il emploie.

Les trois types d'associations

La combinaison des cardinalités de chaque côté détermine le type d'association :

TypeCardinalitésExemple
1, 1(0,1) et (1,1) ; (0,1) et (0,1) ; (1,1) et (1,1)Une personne a au plus un passeport
1, N(1,1) ou (0,1) d'un côté, (0,N) ou (1,N) de l'autreUn département contient plusieurs employés
N, M(0,N) ou (1,N) des deux côtésDes étudiants s'inscrivent à des cours

La figure suivante dessine un exemple de chaque type.

Modèle conceptuel de données
Association 1-1
Personne
0,1
Possede
1,1
Passeport
Association 1-N
Departement
1,N
Contient
1,1
Employe
Association N-M
Etudiant
0,N
Inscription
note
0,N
Cours

Rectangle : entité, identifiant souligné. Losange : association. Les couples min,max portés sur les pattes se lisent depuis l'entité la plus proche.

Comparer les trois lignes sur le seul second nombre de chaque cardinalité, le maximum : un 1 des deux côtés, un N d'un seul côté, un N des deux côtés. Ce coup d'œil suffit à décider de la traduction en tables.

Associations réflexives

Une association peut lier une entité à elle-même. On parle d'association réflexive (ou récursive). La difficulté qu'elle pose n'est pas le dessin mais le vocabulaire : les deux extrémités portant le même nom d'entité, il faut nommer les deux rôles pour les distinguer.

Exemples d'associations réflexives
Modèle conceptuel de données
Un employé en supervise plusieurs, et n'a au plus qu'un supérieur
Employe
idEmploye
nom
0,N
Supervise
0,1
Employe
Des personnes peuvent être amies entre elles, sans limite de part et d'autre
Personne
0,N
EstAmieDe
0,N
Personne

Rectangle : entité, identifiant souligné. Losange : association. Les couples min,max portés sur les pattes se lisent depuis l'entité la plus proche.

Lire les maxima comme pour deux entités distinctes, le fait qu'elles soient identiques n'y change rien. Supervise porte un N d'un seul côté : c'est une association 1-N. EstAmieDe porte un N des deux côtés : c'est une association N-M. Leur traduction en tables vient avec la règle 5, plus bas.

Les attributs d'association

Certains attributs n'appartiennent ni à une entité ni à l'autre, mais à l'association elle-même. Ils décrivent un fait qui n'existe que lorsque les deux entités sont liées.

Modèle conceptuel de données
Etudiant
0,N
Inscription
note, dateInscription
0,N
Cours

Rectangle : entité, identifiant souligné. Losange : association. Les couples min,max portés sur les pattes se lisent depuis l'entité la plus proche.

La note n'appartient pas à l'étudiant seul, qui en obtient une par cours, ni au cours seul, où elle change d'un étudiant à l'autre : elle est écrite dans le losange. Le test : cet attribut a-t-il un sens sans l'association ? Si non, il lui appartient, sous la condition qui suit.

Une association ne porte d'attribut que si ses deux maxima valent N

Si une entité participe au plus une fois à l'association ((1,1) ou (0,1)), chaque lien est entièrement déterminé par cette entité : un attribut posé sur le losange dépend donc d'elle seule, et c'est dans son rectangle qu'il doit aller. dateCommande sur <Passe> est l'erreur type : une commande n'est passée qu'une fois, sa date est celle de la commande. Le test se fait avec les dépendances fonctionnelles du chapitre 1 : on écrit A → B, et on lit « A détermine B », quand chaque valeur de A ne va qu'avec une seule valeur de B. L'attribut doit dépendre de tous les identifiants reliés par l'association, pas d'un seul.

Vérification rapideon peut se reprendre

1.Une compagnie aérienne fixe ses règles : un vol est assuré par un seul avion ; un avion assure plusieurs vols, ou aucun quand il est en maintenance. Quelle cardinalité s'écrit du côté d'Avion, dans l'association Assure ?

2.Une table range les lignes (1, 3, 14), (1, 5, 9) et (2, 3, 11) dans les colonnes idEtudiant, idCours et note. La dépendance idEtudiant → note est-elle vérifiée ?

Construire un MCD à partir d'un énoncé

Construire un MCD depuis un texte suit une démarche méthodique en quatre étapes.

Étape 1, Lire et annoter le texte

Chercher :

  • Les noms → potentielles entités (personnes, objets, lieux, événements)
  • Les verbes → potentielles associations
  • Les quantificateurs (« un seul », « plusieurs », « au moins un ») → cardinalités

Étape 2, Identifier les entités

ExempleEntité ?Raison
Client✅ OuiOn stocke son nom, email, adresse...
Commande✅ OuiOn stocke sa date, son statut, ses lignes...
Rouge (couleur)❌ NonC'est un attribut de Produit, pas une entité
Achat (action ponctuelle)⚠️ DépendSi on a besoin de le tracer, oui ; sinon, c'est une association

Étape 3, Identifier les associations et cardinalités

Pour fixer la cardinalité, poser la question dans les deux sens :

« Un client peut passer combien de commandes ? » → (0,N) côté Client

« Une commande appartient à combien de clients ? » → (1,1) côté Commande

Les quantificateurs de l'énoncé se traduisent comme dans le tableau des cardinalités : « un seul » donne (1,1), « au moins un » (1,N), « plusieurs » (0,N), « au plus un » (0,1).

Étape 4, Définir les attributs

Règles à respecter :

  • Les attributs doivent être atomiques (une seule valeur par cellule).
  • Chaque entité a un identifiant (id...) unique et sans signification métier, le plus souvent un entier que la base attribue : pas le numéro de sécurité sociale, ni l'email.

Le type de chaque attribut (un texte VARCHAR, une date DATE, un nombre à virgule DECIMAL) ne se décide qu'au niveau physique, avec le SQL du chapitre sur les requêtes. La frontière entre entité et attribut se règle au même critère qu'à l'étape 2 : Ville reste un attribut tant qu'on n'en garde que le nom, et devient une entité dès qu'on stocke sa population ou sa région.

Exemple guidé pas à pas

La scolarité de l'ouverture commence par décrire son école en trois phrases, sans penser aux tables.

Énoncé

Une école gère ses enseignants, ses étudiants, et les cours proposés.
Chaque étudiant peut s'inscrire à plusieurs cours. Chaque inscription donne lieu à une note.
Chaque cours est dispensé par un seul enseignant, mais un enseignant peut enseigner plusieurs cours.

Étape 1, Annotation :

« Une école gère ses enseignants (entité), ses étudiants (entité), et les cours (entité) proposés. Chaque étudiant peut s'inscrire (association) à plusieurs (0,N) cours. Chaque inscription donne lieu à une note (attribut d'association). Chaque cours est dispensé (association) par un seul (1,1) enseignant, mais un enseignant peut enseigner plusieurs (0,N) cours. »

Étape 2, Entités : Etudiant, Cours, Enseignant

Un autre nom de l'énoncé, « inscription », ne devient pas une entité : une inscription n'existe que par le couple étudiant et cours qu'elle relie, et ne se liste pas pour elle-même. C'est une association.

Étape 3, Associations et cardinalités :

AssociationEntité ACard. ACard. BEntité BAttribut
InscriptionEtudiant(0,N)(0,N)Coursnote
DispenseEnseignant(0,N)(1,1)Cours

Étape 4, Attributs :

  • Etudiant : idEtudiant, nom, prenom, dateNaissance
  • Cours : idCours, intitule, volumeHoraire
  • Enseignant : idEnseignant, nom, prenom, specialite

MCD final :

Modèle conceptuel de données
Enseignant
idEnseignant
nom
prenom
specialite
0,N
Dispense
1,1
Cours
idCours
intitule
volumeHoraire
0,N
Inscription
note
0,N
Etudiant
idEtudiant
nom
prenom
dateNaissance

Rectangle : entité, identifiant souligné. Losange : association. Les couples min,max portés sur les pattes se lisent depuis l'entité la plus proche.

Reste à vérifier que chaque quantificateur de l'énoncé se retrouve dans une cardinalité : « plusieurs cours » a donné le (0,N) côté Étudiant, « un seul enseignant » le (1,1) côté Cours, « peut enseigner plusieurs cours » le (0,N) côté Enseignant. Un quantificateur sans cardinalité correspondante signale une contrainte oubliée.

MLD : Modèle Logique des Données

Le MLD traduit le MCD en tables relationnelles, prêtes à être implémentées dans un SGBD. L'identifiant de chaque entité y devient la clé primaire de sa table, notée PK (de l'anglais primary key), et une ligne en désigne une autre par une clé étrangère, notée FK (foreign key) : une colonne qui recopie la clé primaire de la ligne visée. Dans l'écriture Cours(idCours PK, idEnseignant FK -> Enseignant), la flèche se lit « désigne une ligne de » : chaque cours désigne une ligne de la table Enseignant.

Règles de passage MCD → MLD

Les règles sont systématiques selon le type d'association.

Règle 1, Chaque entité devient une table

Entité [Etudiant] (idEtudiant, nom, prenom)
  → Table Etudiant(idEtudiant PK, nom, prenom)

Règle 2, Association 1-1 : clé étrangère dans une seule des deux tables

Une seule des deux tables porte la clé étrangère, et le choix n'est pas indifférent. La placer du côté dont la participation est obligatoire, celui qui porte (1,1).

Modèle conceptuel de données
Personne
0,1
Possede
1,1
Passeport

Rectangle : entité, identifiant souligné. Losange : association. Les couples min,max portés sur les pattes se lisent depuis l'entité la plus proche.

Se traduit par :

Modèle logique de données
Passeport
idPasseport
idPersonne→ Personne

clé primaire clé étrangère, avec la table visée

Tout passeport a un titulaire, mais toute personne n'a pas de passeport. C'est donc Passeport qui porte idPersonne, et cette colonne est alors renseignée sur chaque ligne. Le choix inverse aurait créé dans Personne une colonne idPasseport vide pour la majorité des lignes.

Le dessin ne montre pas une précaution : pour qu'une personne n'ait pas deux passeports, la colonne idPersonne doit être unique dans Passeport, sans quoi l'association 1-1 deviendrait une 1-N sans que personne ne l'ait décidé. En SQL : idPersonne INT NOT NULL UNIQUE, avec sa clause FOREIGN KEY.

Les deux autres associations 1-1 du tableau des types se tranchent autrement. Avec (0,1) des deux côtés, aucun côté n'est toujours rempli : la clé étrangère va dans l'une ou l'autre table, unique, et vide quand le lien manque. Avec (1,1) des deux côtés, les deux entités vont toujours ensemble, et leurs colonnes se rangent le plus souvent dans une seule table.

Règle 3, Association 1-N : clé étrangère du côté dont le maximum vaut 1

En Merise, le N s'écrit à côté de la table qui ne reçoit rien, ici Departement. Le repère sûr est le maximum qui vaut 1 : la clé étrangère va du côté (1,1) ou (0,1).

Modèle conceptuel de données
Departement
1,N
Contient
1,1
Employe

Rectangle : entité, identifiant souligné. Losange : association. Les couples min,max portés sur les pattes se lisent depuis l'entité la plus proche.

Se traduit par :

Modèle logique de données
Employe
idEmploye
idDepartement→ Departement

clé primaire clé étrangère, avec la table visée

Une colonne ne contient qu'une valeur : un employé n'appartenant qu'à un département, idDepartement suffit à retenir le lien, quand l'inverse logerait plusieurs identifiants d'employés dans une seule cellule de Departement.

Règle 4, Association N-M : table de liaison

L'association devient une nouvelle table avec les deux clés étrangères en clé primaire composite, c'est-à-dire faite de deux colonnes : aucune des deux ne suffit seule, c'est le couple qui ne se répète jamais. Les attributs de l'association rejoignent cette table.

Modèle conceptuel de données
Etudiant
0,N
Inscription
note
0,N
Cours

Rectangle : entité, identifiant souligné. Losange : association. Les couples min,max portés sur les pattes se lisent depuis l'entité la plus proche.

Se traduit par :

Modèle logique de données
Inscription
idEtudiant→ Etudiant
idCours→ Cours
note

clé primaire clé étrangère, avec la table visée

Aucune des deux tables de départ ne pouvait porter l'information, pour la raison inverse de la règle 3 : les deux côtés admettent plusieurs partenaires. Inscription existe donc pour le couple, et note l'y suit.

Règle 5, Association réflexive : nommer les deux rôles

Une association réflexive suit les règles 2 à 4 comme si ses deux extrémités étaient deux entités distinctes, avec ses deux noms de rôles. Supervise, une 1-N, pose une clé étrangère dans la table elle-même ; EstAmieDe, une N-M, demande une table de liaison :

Modèle logique de données
Employe
idEmploye
nom
idSuperviseur→ Employe
EstAmieDe
idPersonne→ Personne
idAmie→ Personne

clé primaire clé étrangère, avec la table visée

Dans les deux lignes, ce sont les noms de rôles qui portent le sens. idSuperviseur et idAmie désignent la même table que la colonne voisine : sans ces noms, deux clés étrangères identiques rendraient le modèle indéchiffrable. Une amitié étant réciproque, on évite de l'écrire deux fois, (1, 2) puis (2, 1), en imposant un ordre par une contrainte de vérification, que la base contrôle à chaque ligne écrite : CHECK (idPersonne < idAmie).

Règle 6, Association à trois pattes ou plus : une table, puis une clé à réduire

Certains faits relient trois entités à la fois : « tel enseignant fait cours dans telle salle à tel créneau ». Aucune paire n'y suffit, et l'association se traduit comme une N-M : une table qui reçoit les trois identifiants. Reste à trouver sa clé, en cherchant ce qu'une règle de gestion, c'est-à-dire une règle que l'organisation s'impose, détermine. Si une salle n'accueille qu'un enseignant à un créneau donné, la salle et le créneau déterminent l'enseignant, (idSalle, idCreneau) → idEnseignant, et la clé se réduit à ce couple :

Modèle logique de données
Seance
idSalle→ Salle
idCreneau→ Creneau
idEnseignant→ Enseignant

clé primaire clé étrangère, avec la table visée

Règle 7, Héritage : une entité qui en précise une autre

Un enseignant et un élève sont deux sortes de personnes : ils partagent un nom et un prénom, et ont chacun leurs propres attributs. La traduction la plus sûre donne une table au parent et une table à chaque sorte, dont la clé est aussi une clé étrangère vers le parent :

Modèle logique de données
Personne
idPersonne
nom
prenom
Enseignant
idPersonne→ Personne
specialite
Eleve
idPersonne→ Personne
dateNaissance

clé primaire clé étrangère, avec la table visée

Tableau récapitulatif

Type d'associationTraduction MLDOù va la clé étrangère ?
1, 1Clé étrangère unique dans une tableCôté (1,1), là où la colonne est toujours remplie
1, NClé étrangère dans une tableCôté (1,1) ou (0,1) : la table dont chaque ligne ne désigne qu'une ligne d'en face
N, MNouvelle table de liaisonLes deux clés en PK composite
N, M avec attributTable de liaison + colonnesAttributs dans la table de liaison
RéflexiveMême règle que 1-N ou N-MDeux noms de rôles obligatoires
Trois pattes ou plusUne table, comme une N-MClé réduite selon les règles de gestion
HéritageUne table par entitéClé du parent, reprise comme clé étrangère dans chaque sorte

Le mot « côté N » revient dans beaucoup de cours, et c'est lui qui fait placer la clé du mauvais côté.

La clé étrangère du côté du N

Une seule étape est fausse. Désigner laquelle.

Un réseau de recharge pour véhicules électriques modélise ses stations et leurs bornes : une borne est installée dans une seule station, et une station compte au moins une borne, soit [Station] --(1,N)-- <Accueille> --(1,1)-- [Borne]. La station de la gare compte bb bornes.

Application sur l'exemple « École »

Modèle logique de données
Enseignant
idEnseignant
nom
prenom
specialite
Cours
idCours
intitule
volumeHoraire
idEnseignant→ Enseignant
Etudiant
idEtudiant
nom
prenom
dateNaissance
Inscription
idEtudiant→ Etudiant
idCours→ Cours
note

clé primaire clé étrangère, avec la table visée

Relire ces quatre lignes en cherchant les clés étrangères : il y en a trois. Celle de Cours est née du (1,1) de Dispense, une 1-N. Les deux d'Inscription viennent de l'association N-M, la seule à avoir créé une table : Inscription n'existait dans aucun rectangle.

C'est la première moitié de la réponse à la question de l'ouverture. La scolarité a besoin de quatre tables, et la note se range dans Inscription, la seule dont chaque ligne réunit un étudiant et un cours. Le nom d'une enseignante n'est plus écrit qu'une fois, dans Enseignant, et celui d'un étudiant une fois, dans Etudiant : les deux premiers accidents du tableur n'ont plus où se produire.

Vérification rapideon peut se reprendre

1.Une commande porte plusieurs produits, et un produit figure dans plusieurs commandes : [Commande] --(1,N)-- <Contient: quantite> --(0,N)-- [Produit]. Combien de tables compte le modèle relationnel ?

2.Dans ce modèle, où se range la colonne quantite ?

Compter les tables avant de les écrire

Les règles de passage se vérifient sur un modèle qui n'est pas dessiné. Un centre de formation décrit le sien en quatre phrases. Un formateur anime des sessions, et chaque session est animée par un seul formateur. Chaque session se tient dans une seule salle, qui en accueille beaucoup. Un stagiaire s'inscrit à autant de sessions qu'il veut, chaque session réunit plusieurs stagiaires, et chaque inscription reçoit une note. Un formateur maîtrise plusieurs compétences, que plusieurs formateurs partagent.

Le MLD d'un modèle décrit en quatre phrases

  • 1.

    Combien de tables compte le modèle relationnel ?

  • 2.

    Combien de clés étrangères compte-t-il en tout ?

  • 3.

    Combien de colonnes compte la table née des inscriptions ?

  • 4.

    Les sessions sont désormais animées à deux ou à trois formateurs. Combien de tables compte alors le modèle ?

Intégrité des données

Définition : L'intégrité désigne l'ensemble des règles qui garantissent que les données restent valides, cohérentes et fiables au fil du temps, malgré les insertions, modifications et suppressions.

Intégrité d'entité

Chaque enregistrement doit être identifiable de manière unique.

  • La clé primaire ne peut jamais être NULL, la marque d'une valeur absente.
  • Deux lignes ne peuvent avoir la même valeur de clé primaire.

L'instruction SQL CREATE TABLE crée une table colonne par colonne, avec le type de chacune : INT pour un entier, VARCHAR(50) pour un texte de 50 caractères au plus. Les contraintes s'écrivent à côté de leur colonne :

SQL
CREATE TABLE Etudiant (
idEtudiant INT PRIMARY KEY AUTO_INCREMENT, -- unique, jamais NULL
nom VARCHAR(50) NOT NULL,
prenom VARCHAR(50) NOT NULL
);

AUTO_INCREMENT laisse MySQL numéroter lui-même les lignes, et NOT NULL rend une colonne obligatoire. Dans la page, l'identifiant s'écrit INTEGER PRIMARY KEY, qui se numérote seul.

Intégrité référentielle

Une clé étrangère doit toujours pointer vers une valeur qui existe dans la table référencée.

SQL
CREATE TABLE Inscription (
idEtudiant INT NOT NULL,
idCours INT NOT NULL,
note DECIMAL(4,2),
PRIMARY KEY (idEtudiant, idCours),
FOREIGN KEY (idEtudiant) REFERENCES Etudiant(idEtudiant) ON DELETE CASCADE,
FOREIGN KEY (idCours) REFERENCES Cours(idCours) ON DELETE RESTRICT
);
ComportementON DELETE CASCADEON DELETE RESTRICTON DELETE SET NULL
Si la ligne visée est suppriméeLes lignes qui la désignent sont supprimées aussiErreur, impossible de supprimerLes lignes qui la désignent restent, leur clé étrangère passe à NULL
Utilisation typiqueDonnées dépendantes (inscriptions)Données indépendantes (cours)Lien facultatif (un produit et sa famille)

Les deux clauses de cette table ne se choisissent pas au hasard. Une inscription n'a aucun sens sans son étudiant, elle peut donc disparaître avec lui : CASCADE. Un cours existe indépendamment de ceux qui s'y inscrivent, et le supprimer alors qu'il reste des inscriptions détruirait de l'information : RESTRICT bloque l'opération et oblige à trancher. Une clé étrangère déclarée sans clause ON DELETE se comporte de la même façon : MySQL refuse la suppression, et l'absence de règle n'est pas une permission.

C'est la seconde moitié de la réponse à l'ouverture : le cours qui a encore des inscrits ne se supprime plus, et ses notes ne disparaissent plus avec lui. La scolarité doit d'abord décider de leur sort.

La base de démonstration de la page contient cette table Inscription avec ces deux clauses, et son moteur vérifie les clés étrangères comme MySQL :

requete.sql
Résultat
>_ Prêt à exécuter…
À manipuler
SELECT COUNT(*) compte les lignes qui vérifient la condition écrite après WHERE, et DELETE supprime celles qui la vérifient ; le chapitre sur les requêtes les détaillera. Lancer le bloc : l'étudiant 1 emporte ses trois inscriptions. Remplacer la ligne du milieu par DELETE FROM Cours WHERE idCours = 1; et relancer : FOREIGN KEY constraint failed, le cours 1 a encore des inscrits. Ajouter juste avant DELETE FROM Inscription WHERE idCours = 1; et relancer : le cours part, après ses inscriptions. RESTRICT oblige à décider de leur sort d'abord.

Une troisième règle garde la ligne dépendante et efface seulement le lien : ON DELETE SET NULL. Un produit dont la famille disparaît reste au catalogue, sans famille, jusqu'à ce qu'on lui en donne une autre.

requete.sql
Résultat
>_ Prêt à exécuter…
À manipuler
Lancer le bloc et noter la colonne idFamille des trois produits : les deux claviers restent au catalogue, leur idFamille vide ; l'écran garde la sienne. Remplacer SET NULL par CASCADE et relancer : les deux claviers disparaissent avec leur famille, et il ne reste qu'une ligne.

La colonne doit accepter NULL : déclarée NOT NULL, elle contredirait la règle, et la page refuserait la suppression de la famille.

Intégrité de domaine

Chaque colonne doit respecter un type et des contraintes de valeur.

SQL
CREATE TABLE Produit (
idProduit INT PRIMARY KEY AUTO_INCREMENT,
nom VARCHAR(100) NOT NULL,
prix DECIMAL(10,2) CHECK (prix >= 0), -- 10 chiffres, dont 2 après la virgule
stock INT DEFAULT 0,
actif BOOLEAN DEFAULT TRUE -- vrai ou faux
);
ContrainteRôle
NOT NULLValeur obligatoire
CHECK (...)Condition à respecter
DEFAULTValeur par défaut si non renseignée : une commodité plutôt qu'une contrainte, elle n'interdit rien
UNIQUEPas deux fois la même valeur dans cette colonne (plusieurs NULL restent permis) ; elle relève des clés plus que du domaine

Les contraintes d'intégrité empêchent d'écrire des valeurs fausses. Elles ne disent rien d'une base qui écrit dix fois la même valeur juste : c'est l'objet de la normalisation, au chapitre suivant.

Vérification rapideon peut se reprendre

1.La scolarité enregistre les retards dans une table Retard(idEtudiant, dateRetard, minutes), dont idEtudiant désigne Etudiant. Quand un étudiant quitte l'école, ses retards ne doivent pas lui survivre. Quelle règle poser sur idEtudiant ?

2.On insère dans Inscription la ligne (42, 3, 12), alors qu'aucun étudiant n'a l'identifiant 42. Quelle règle refuse l'insertion ?

Écrire le MLD de l'école en SQL

Le MLD de l'école se traduit maintenant en tables, avec les clés et les clauses que la section précédente vient de poser.

Exercice : écrire puis vérifier

Les tables de l'école

Écrire les quatre CREATE TABLE du MLD de l'école, celui de la section « Application sur l'exemple École », dans une base qui part vide. Les noms des tables et des colonnes sont ceux du MLD ; les identifiants sont des INTEGER PRIMARY KEY, les autres colonnes des TEXT (du texte), des INTEGER (des entiers) ou des REAL (des nombres à virgule), et chaque clé étrangère s'écrit dans une clause FOREIGN KEY.

La vérification lit ce que la base a compris du script, une ligne par colonne : sa table, si elle appartient à la clé primaire (1), la table qu'elle désigne, si elle est obligatoire (pour une clé étrangère hors de la clé primaire), et si elle est déclarée par une clause FOREIGN KEY.

« Exécuter » joue le script et montre l'état de la base qu'il laisse ; « Vérifier » compare cet état à celui attendu, sur 1 cas.

Ressources complémentaires

  • Looping, site officiel : le logiciel de modélisation Merise du chapitre d'installation, avec ses exemples de schémas entité-association
  • Mocodo en ligne : dessine un MCD à partir d'un texte, et en déduit le modèle relationnel et le script SQL

Mettre en pratique

Une salle d'escalade décrit son activité en trois phrases. Combien de tables compte son modèle relationnel, et où va chaque clé étrangère ?

La salle gère ses abonnés, ses voies et ses ouvreurs, ceux qui tracent les voies au mur. Chaque voie est ouverte par un seul ouvreur, et un ouvreur en ouvre plusieurs, ou aucune quand il vient d'arriver. Un abonné peut évaluer chaque voie qu'il a grimpée, d'une seule note par voie, et une voie reçoit les notes de nombreux abonnés, ou d'aucun tant qu'elle est neuve.

Par où commencer ? Relever les noms dont la salle garde une liste, puis lire chaque verbe dans les deux sens, une fois depuis chaque entité.

Vérification rapideon peut se reprendre

Une étape du corrigé place la clé étrangère idOuvreur dans Voie, et non idVoie dans Ouvreur. Pourquoi ce côté ?

Le corrigé
  1. Relever les entités. Abonné, voie et ouvreur : la salle garde une liste de chacun, avec ses informations. La note n'est pas une entité, puisqu'elle n'existe que pour un couple formé d'un abonné et d'une voie.
  2. Lire chaque association dans les deux sens. Ouvre : une voie est ouverte par un seul ouvreur, (1,1) côté Voie ; un ouvreur en ouvre plusieurs ou aucune, (0,N) côté Ouvreur. Evalue : un abonné évalue plusieurs voies ou aucune, (0,N) ; une voie reçoit plusieurs notes ou aucune, (0,N).
  3. Classer par les maxima. Ouvre porte un N d'un seul côté : une 1-N. Evalue en porte deux : une N-M, qui reçoit l'attribut note, puisque la note dépend du couple.
  4. Traduire en tables. Chaque entité donne sa table ; la 1-N pose idOuvreur dans Voie, du côté (1,1) ; la N-M devient une table de liaison, de clé (idAbonne, idVoie), qui reçoit la note.
Modèle logique de données
Ouvreur
idOuvreur
nom
Voie
idVoie
couleur
idOuvreur→ Ouvreur
Abonne
idAbonne
nom
Evalue
idAbonne→ Abonne
idVoie→ Voie
note

clé primaire clé étrangère, avec la table visée

  1. Vérifier. Chaque quantificateur de l'énoncé a sa trace : « un seul ouvreur » le (1,1), « plusieurs, ou aucune » le (0,N) d'Ouvreur, « une seule note par voie » la clé (idAbonne, idVoie), qui refuse une deuxième note du même abonné sur la même voie. Le compte : trois entités et une N-M donnent quatre tables, et la 1-N une clé étrangère, la table de liaison deux, soit trois.
Un établissement scolaire suit ses élèves d'une année sur l'autre, redoublement compris. Quel modèle relationnel, et quelle clé pour l'inscription d'une année ?

Un établissement scolaire souhaite gérer ses élèves, ses classes et ses enseignants. Chaque année scolaire, un élève est inscrit dans une seule classe ; d'une année à l'autre, il change de classe ou, s'il redouble, reste dans la même. Chaque classe est encadrée par un enseignant responsable. Un enseignant peut être responsable de plusieurs classes, ou d'aucune. L'école organise aussi un tutorat : certains enseignants accompagnent individuellement certains élèves dans un rôle défini (« référent », « soutien »).

Par où commencer ? Chercher d'abord ce qui doit pouvoir se répéter d'une année à l'autre, et se demander si un simple lien entre l'élève et la classe suffit à le retenir.

Le corrigé
  1. Relever les entités, dont l'inscription d'une année. L'élève, la classe et l'enseignant, et une quatrième, moins visible :
EntitéAttributsRemarque
EleveidEleve, nom, prenom, dateNaissance
ClasseidClasse, nomClasseEx : « 5A », « 6B »
EnseignantidEnseignant, nom, prenom, dateEmbauche
InscriptionanneeUne par élève et par année

L'inscription devient ici une entité, et c'est tout le nœud de l'exercice. Une association EstInscrit entre Eleve et Classe ne pourrait pas représenter le redoublement : une occurrence d'association est identifiée par le couple qu'elle relie, si bien que le même élève ne pourrait être relié qu'une fois à la même classe. Une inscription, elle, se repère par l'élève et l'année : son identifiant est relatif à l'élève, l'année seule ne suffisant pas à la désigner.

  1. Lire les cardinalités dans les deux sens.
AssociationDeCard.Card.VersAttributs
ConcerneInscription(1,1)(1,N)Eleve
RattacheInscription(1,1)(0,N)Classe
ResponsableDeEnseignant(0,N)(1,1)Classe
TutoratEnseignant(0,N)(0,N)Eleverole
  1. Dessiner le modèle conceptuel.
Modèle conceptuel de données
Un enseignant est responsable de classes
Enseignant
0,N
ResponsableDe
1,1
Classe
Chaque année, une inscription rattache un élève à une classe
Classe
0,N
Rattache
1,1
Inscription
annee
1,1
Concerne
1,N
Eleve
Le tutorat, qui relie directement un enseignant à un élève, hors de la classe
Enseignant
0,N
Tutorat
role
0,N
Eleve

Rectangle : entité, identifiant souligné. Losange : association. Les couples min,max portés sur les pattes se lisent depuis l'entité la plus proche.

Le double lien d'Enseignant n'est pas une erreur : responsabilité d'une classe et tutorat d'un élève sont deux liens différents, et les fusionner perdrait le tutorat des élèves dont l'enseignant n'est pas responsable de la classe. Des deux pattes (1,1) d'Inscription, celle qui va vers Eleve fait en plus partie de l'identifiant : les logiciels de modélisation le marquent sur la patte, la figure non, le MLD le montre.

  1. Traduire en tables. Les deux 1-N posent une clé étrangère du côté (1,1), la N-M du tutorat devient une table de liaison qui reçoit le rôle.
Modèle logique de données
Enseignant
idEnseignant
nom
prenom
dateEmbauche
Classe
idClasse
nomClasse
idEnseignant→ Enseignant
Eleve
idEleve
nom
prenom
dateNaissance
Inscription
idEleve→ Eleve
annee
idClasse→ Classe
Tutorat
idEnseignant→ Enseignant
idEleve→ Eleve
role

clé primaire clé étrangère, avec la table visée

  1. Choisir la clé d'Inscription. La règle de l'énoncé, une seule classe par élève et par année, s'écrit (idEleve, annee) → idClasse : ce couple est la clé. Le redoublement s'y range sans peine, et l'inscription dans deux classes la même année devient impossible ; avec idClasse dans la clé, rien ne l'empêcherait.

  2. Vérifier sur des données. La figure met la clé à l'épreuve de quatre inscriptions, dont un redoublement.

Cliquer sur une dépendance pour regrouper le tableau par sa partie gauche.

Vérifiée sur les 4 lignes : chaque valeur de la partie gauche ne s'y rencontre qu'avec une seule valeur de la partie droite.

idEleveanneeidClasse
1120245A
2120255A
3220246B
4220255A

Les lignes sont regroupées par idEleve, annee (4 groupes). Dans chacun, idClasse garde la même valeur : la dépendance tient.

Un élève change de classe d'une année à l'autre, ou redouble dans la même : c'est le couple (élève, année) qui détermine la classe, et lui seul.
À manipuler
Cliquer sur idEleve → idClasse : l'élève 2, 6B en 2024 puis 5A en 2025, forme un groupe teinté en rouge ; l'élève 1, qui redouble, un groupe constant. Avec le seul élève 1, la dépendance aurait tenu, et l'on aurait été tenté de retirer l'année de la clé.

Chapitre révisé en octobre 2026 · Une erreur dans ce chapitre ?

Dans la bibliothèque d'exercices