Histoire de faire le point, je déterre un sujet que nous avions abordé il y a 3 ans et qui concerne les contraintes d’inclusion.

Looping permet de modéliser ces contraintes dans les MCD. J’avais pris comme exemple la contrainte proposée par le groupe 135 de l’afcet, contrainte selon laquelle un enseignant ne peut enseigner une matière à une classe que s’il sait enseigner cette matière :
Nom : Inclusion.jpg
Affichages : 1011
Taille : 172,2 Ko

Version Looping :

Nom : inclusion(looping)fsm.png
Affichages : 1046
Taille : 19,6 Ko


Las ! Le problème demeure quant à la production du code SQL : la contrainte est ignorée.

Comme dit Paprick, « la traduction correcte et automatique de tous les cas de contraintes d'inclusion, et autres contraintes inter-associations, paraît complexe... »

Certes. Néanmoins, dans le cas qui nous concerne, lors de la génération SQL, pour la table ENSEIGNE, il suffit de ne pas faire participer les « pivots » ENSEIGNANT et MATIERE, car les attributs enseignantId et matiereId sont hérités de la table SAIT_ENSEIGNER. Plus généralement, oser court-circuiter les pivots.

Merci Paprick de me proposer des contre-exemples.

J’ai évidemment dans ma besace une solution qui fera hurler les merisiens purs et durs, mais qui fournit le code SQL sans devoir en passer par l’outil Règle :

Nom : inclusion(looping)fsmIdrel.png
Affichages : 1014
Taille : 8,9 Ko

Code SQL proposé par Looping :

CREATE TABLE ENSEIGNANT(
   enseignantId INT,
   CONSTRAINT ENSEIGNANT_PK PRIMARY KEY(enseignantId)
);

CREATE TABLE MATIERE(
   matiereId INT,
   CONSTRAINT MATIERE_PK PRIMARY KEY(matiereId)
);

CREATE TABLE CLASSE(
   classeId INT,
   CONSTRAINT CLASSE_PK PRIMARY KEY(classeId)
);

CREATE TABLE SAIT_ENSEIGNER(
   enseignantId INT,
   matiereId INT,
   CONSTRAINT SAIT_ENSEIGNER_PK PRIMARY KEY(enseignantId, matiereId),
   CONSTRAINT SAIT_ENSEIGNER_ENSEIGNANT_FK FOREIGN KEY(enseignantId) REFERENCES ENSEIGNANT(enseignantId),
   CONSTRAINT SAIT_ENSEIGNER_MATIERE_FK FOREIGN KEY(matiereId) REFERENCES MATIERE(matiereId)
);

CREATE TABLE ENSEIGNER(
   enseignantId INT,
   matiereId INT,
   classeId INT,
   CONSTRAINT ENSEIGNER_PK PRIMARY KEY(enseignantId, matiereId, classeId),
   CONSTRAINT ENSEIGNER_SAIT_ENSEIGNER_FK FOREIGN KEY(enseignantId, matiereId) REFERENCES SAIT_ENSEIGNER(enseignantId, matiereId),
   CONSTRAINT ENSEIGNER_CLASSE_FK FOREIGN KEY(classeId) REFERENCES CLASSE(classeId)
);
Affaire à suivre...