Association réflexive → MLD
Une association réflexive se traduit par une clé étrangère vers la même table, nommée d'après le rôle et le plus souvent nullable. Une réflexive n-n donne une table de liaison à deux clés.
- réflexive
- auto-référence
- hiérarchie
- rôle
- récursive
Syntaxe
(0,n)–(0,1) : t(cle PK, …, cle_role FK → t) nullable(0,n)–(0,n) : lien(cle_role1 FK → t, cle_role2 FK → t) clé primaire = (cle_role1, cle_role2)Exemple
MCD : EMPLOYE (0,n) encadrant ── ENCADRER ── (0,1) encadré EMPLOYEMLD : employe(num_employe PK, nom, num_encadrant FK → employe) nullable num_employe | nom | num_encadrant 1 | Léa | NULL ← directrice, sans encadrant 2 | Karim | 1 3 | Hugo | 2Réflexive n-n : COURS (0,n) ── NECESSITER ── (0,n) COURS → necessiter(code_cours FK → cours, code_prerequis FK → cours) clé primaire = (code_cours, code_prerequis)À retenir
- Nommez la clé étrangère d'après le rôle (num_encadrant, code_prerequis) : le nom num_employe est déjà pris par la clé primaire.
- La clé est nullable parce qu'il existe toujours un sommet de hiérarchie ; NOT NULL rendrait la première insertion impossible.
- Interdisez l'auto-référence si la règle l'exige : CHECK (num_encadrant <> num_employe). Les cycles plus longs (A encadre B qui encadre A) relèvent d'un contrôle applicatif.
- Pour parcourir toute la hiérarchie en SQL, on utilise une requête récursive (WITH RECURSIVE).
- Piège : créer une table encadrant séparée qui duplique les employés. Un encadrant est un employé : une seule table, deux rôles.
Voir aussi
- Cardinalités (x,n) — (x,1) : association fonctionnelleDans une association (x,n)–(x,1), la clé étrangère va dans la table dont la cardinalité maximale vaut 1. Elle est NOT NULL en (1,1) et nullable en (0,1) : c'est la règle la plus utilisée.
- Cardinalités (x,n) — (x,n) : table de liaisonUne association dont les deux cardinalités maximales valent n devient une table de liaison. Sa clé primaire réunit les deux clés étrangères, et les attributs du lien y deviennent des colonnes.
- Clé étrangère (FK)Une clé étrangère est une colonne qui reprend la clé primaire d'une autre table pour matérialiser un lien du MCD. Le SGBD vérifie alors que la ligne référencée existe bien.