Bonjour ordigil,
Examinons un peu plus en détail la solution précédemment proposée :
Comme on l’a vu, avec cette solution, toute affectation d’un moteur concerne au moins un camion. Par exemple, pendant la période p11, le moteur m1 est affecté au camion c1, puis pendant la période p12 il n’est affecté à aucun camion, puis pendant la période p13 il est affecté au camion c2, puis pendant la période p14 il n’est affecté à aucun camion, puis pendant la période p15 il est affecté au camion c3.
Les périodes p12 et p14 posent un problème : le local où se trouve alors le moteur m1 n’est pas un camion...
(a) Le temps de ces périodes, on pourrait marquer à NULL l’attribut CamionId de la table MOTEUR_AFFECTATION, mais c’est une mauvaise idée, car la clé étrangère {CamionId} référençant la table CAMION contiendrait un attribut marqué NULL et c’est une source d’ennuis, et un des défis d’une modélisation correcte est qu’une clé étrangère ne contienne pas d’attribut marqué NULL.
(b) On pourrait considérer le local contenant les moteurs non affectés comme un camion un peu particulier, avec par exemple la valeur de clé primaire CamionId = 0, mais les effets de bord font surface. Considérons en effet la contrainte qu’on avait établie :
La paire {CamionId, MoteurAffectationPeriode} est clé alternative de la table MOTEUR_AFFECTATION, c'est-à-dire qu’elle garantit la contrainte selon laquelle, pendant une période donnée, un camion ne peut avoir qu’un seul moteur.
La contrainte est contredite, car le local (considéré comme camion) doit pouvoir stocker plus d’un moteur à une date donnée. Il faudra au stade SQL aménager cette contrainte, en supprimant la clé alternative (pourtant bien pratique), et en passer par une assertion (ou plutôt d’un trigger dans le cas de votre SGBD), selon laquelle, pendant une période donnée, un camion ne peut avoir qu’un seul moteur, sauf si CamionId = 0.
A mon sens, cette solution n’est pas très satisfaisante, les clé étrangères contenant des attributs marqués NULL et l’utilisation de camions fictifs relève du bricolage, tout cela et laid et peut poser des problèmes inattendus. On verra dans un autre message une solution alternative.
Quelques instances :
MOTEUR {MoteurId ...}
m1
m2
m3
CAMION {CamionId ...}
c1
c2
c3
MOTEUR_AFFECTATION {MoteurId MoteurAffectationId CamionId MoteurAffectationPeriode}
m1 1 c1 p11
m1 2 0 p12
m1 3 c2 p13
m1 4 0 p14
m1 5 c3 p15
A noter que je considère que le parc de camions peut être très conséquent, le modèle doit pouvoir s’adapter à toutes situations.