Bonsoir cervo,
Vous avez à juste titre fait une remarque concernant les boucles (cycles).
Cela dit, prenez l’exemple d’une nomenclature : une pièce est composée d’autres pièces :
Il y a là une magnifique boucle, serait-elle donc peccamineuse ? Elle est pourtant inévitable...
Il est vrai que, confié à des mains inexpérimentées, le traitement d’une boucle peut comporter des risques, et c’est pourquoi, il est le plus souvent répété qu’il faut les éviter, mais j’ajoute aussitôt pour ma part : « quand c’est possible ! » car, sur le terrain, dans le concret des projets des entreprises, ces boucles (ou cycles) sont souvent inévitables, pour ne pas dire omniprésentes, voyez un l’exemple caractéristique des devis et factures. Mais quand il est dit qu’il faut éviter les boucles, en fait cela signifie qu’il faut être vigilant lorsqu’elles sont inévitables, et se donner alors les moyens de faire en sorte qu’elles ne mettent pas en danger l’intégrité de la base de données.
Revenons à l’apprentissage des matières par des étudiants d’une école, et partons de règles de gestion des données du genre :
(R01) Un professeur est habilité à enseigner de 1 à N matières ;
(R02) Une matière est enseignée par 1 à N professeurs ;
(R03) Une classe est composée de 1 à N étudiants ;
(R04) Un étudiant fait partie d’au moins et au plus une classe ;
(R05) Un professeur ne peut donner un cours sur une matière donnée qu’à condition d’être habilité à enseigner cette matière ;
(R06) Un cours ayant pour objet telle matière est dispensé tel jour et à telle heure, par tel professeur, à telle classe.
Fournissons une représentation graphique de ces règles, à l’aide par exemple de l’outil MySQL Workbench :
Dans ce diagramme tabulaire, se dissimule un risque, du fait de la boucle dans laquelle sont parties prenantes les tables PROFESSEUR, ENSEIGNER, MATIERE et COURS. En effet, rien n’interdit qu’un professeur fasse à une classe donnée un cours ayant pour objet une matière qu’il n’est pas habilité à enseigner...
En l’occurrence, on forcera un professeur à ne faire cours que pour des matières qu’il est habilité à enseigner :
La boucle s’est évaporée, le système est blindé (au moins pour cette partie...) : on a ici l’exemple d’une boucle qui a pu être évitée.
Indépendamment de cela on observera que la table COURS a pour clé primaire le triplet {professeurId, dateCours, heureCours}, c'est-à-dire qu’à un instant donné un professeur ne fait cours qu’à une seule classe, sur une seule matière. Cependant, rien n’empêche qu’au même moment, une classe étudie plusieurs matières, sous la houlette de plusieurs professeurs... Le minimum est de mettre en oeuvre une contrainte d’unicité, symbolisée ci-dessous par un trio de mickeys verts, signifiant qu’à un instant donné, une classe étudie une seule matière, sous la houlette d’un seul professeur :
Bien entendu, il est sous-entendu que l’attribut dateCours est du type période, ce qui ne simplifie pas les choses quand on en arrive au niveau SQL, mais chaque chose en son temps. Tout cela peut paraître compliqué, toutefois vous avez bien dit dans votre message initial que vous vouliez quelque chose de robuste... Le diagramme est incomplet, mais à vous quand même de chercher les loups qui peuvent encore se cacher...
A suivre...
Partager