
Envoyé par
CinePhil
Oui, l'identifiant est nécessaire car c'est lui qui servira de clé étrangère dans d'autres tables, tout comme l'identifiant de la table sujet et clé étrangère dans la table sous-sujet.
Petite précision : Ca sera le couple id, id_sujet de la table sous sujet qui sera référence d'un éventuelle FOREIGN KEY.
Cette pratique a un nom : l'identification relative. Dans le cas de sujets et sous-sujets, je ne conseillerais pas ce type d'identification pour des raisons de maintenance et d'évolution. L'identification relative implique une dépendance très forte (c'est presque de l'héritage). Il sera donc délica de déplacer un sous sujet dans un autre car la seconde partie de l'identification dépend de la première.
Ici utiliser un simple auto_increment est quelque peu simpliste car le but de l'identification relative est de gagner des identifiants en réattribuant une même partie de la clé primaire dans d'autres enregistrement.
Par exemple il y aura plusieurs sous sujet d'id 1, mais ils seront présents dans des sujets différents. La clé primaire étant composée cela ne posera pas de problèmes.
L'utilisation de l'auto_increment rendra inutile l'identification relative (car toutes les clés seront différentes) , et il deviendrait plus logique d'utiliser uniquement id comme identifiant, et id_sujet serait qu'une FOREIGN KEY.
Pourquoi c'est une mauvaise idée d'utiliser de l'identification relative dans ce cas de figure?
En fait imaginons que nous utilisons de l'identifications relatives, et que nous ayons les données suivantes :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| CREATE TABLE SUJET(
ID INTEGER PRIMARY KEY
);
CREATE TABLE SOUS_SUJET(
ID INTEGER PRIMARY_KEY,
ID_SUJET INTEGER REFERENCES SUJET(ID)
);
INSERT INTO SUJET VALUES
(1),
(2),
(3);
INSERT INTO SOUS_SUJET VALUES
(1,1),
(1,2),
(2,2); |
Que se passe il si je déplace mon sous sujet 1 de mon sujet 1 vers le sujet 2 ?
UPDATE SOUS_SUJET SET ID_SUJET = 2 WHERE ID = 1 AND ID_SUJET = 1;
Le contrôle de l'intégrité refusera alors l'insertion, et il faudra revoir l'identifiant du sujet déplacé ce qui mène à deux problèmes :
- Il va falloir écrire du code (et donc risquer des bugs).
- Bien pire : nous devront modifier l'identifiant d'une occurrence !
Je conseillerais donc d'avoir une simple FOREIGN KEY qui lira les deux tables. Cela se traduit au niveau logique, d'identifier sous_sujets uniquement par ID, et non plus par le couple ID / ID_SUJET. Dans ce cas il deviendra convenable de poser un auto_increment sur l'identifiant de SOUS_SUJET.
Partager