Bonsoir xeron,
Envoyé par
xeron33
Envoyé par
fsmrel
Mais si l'on vous suit, Raoul ne pourra être affecté qu’un seul jour à la rotation r1... A partir du lendemain, il faudra affecter quelqu’un d’autre à cette rotation, est-ce bien raisonnable ?
Et ma réponse était : C'est ce qu'il se passe...
Soit... Admettons maintenant que Raoul soit affecté à la rotation r1 le 11 mai 2015. Si malgré tout il doit à nouveau être affecté à r1 le 12 mai 2015, on peut supposer que, dans la table JONCTION2 (que j’ai renommée ci-dessous en AFFECTATION), le triplet (Raoul, r1, 2015-05-11) sera remplacé au moment opportun par le triplet (Raoul, r1, 2015-05-12). Autre façon de voir les choses : le triplet n’est pas remplacé, auquel cas on pourra interpréter le triplet (Raoul, r1, 2015-05-11) comme suit : Raoul est affecté à la rotation r1 depuis le 11 mai 2015. A vous de voir quel scénario est pertinent.
Quoi qu’il en soit, en ce qui concerne les affectations normales, le diagramme pourrait être le suivant :
Sans oublier ce qui n’apparaît pas ici, mais devra être présent dans le CREATE TABLE AFFECTATION, sous forme de clé alternative (contrainte UNIQUE) :
— Dans le cas normal, à une date donnée, un opérateur n’est affectée qu’à une rotation ;
— Dans le cas normal, à une date donnée, à une rotation n’est affecté qu’un opérateur.
Envoyé par
xeron33
A mon sens cette deuxième association entre les entités Rotation et Armoire permet de rajouter de façon exceptionnelle une ou plusieurs armoires à une rotation, en rajoutant le champ Code_Armoire_Plus dans la table Rotation.
CREATE TABLE ROTATION
(
RotationId INT NOT NULL,
RotationNom VARCHAR(64) NOT NULL,
Code_Armoire_Plus Int Null,
CONSTRAINT ROTATION_PK PRIMARY KEY (RotationId),
Constraint ROTATION_FK FOREIGN KEY (Code_Armoire_Plus)
REFERENCES ARMOIRES (ArmoireId)
) ;
L’énoncé et l’instruction CREATE TABLE sont contradictoires. Selon l’énoncé, il s’agit de pouvoir ajouter plusieurs armoires à une rotation, tandis que selon l’instruction, on ne peut ajouter qu’une seule armoire.
Supposons que ce soit l’énoncé qui soit juste. Supposons encore que, dans le cas général, les armoires a21, a22 fassent partie de la rotation r2. Supposons qu’exceptionnellement, le 15 mai 2015, l’armoires a21 soit rattachée à la rotation r1 et l’armoire a22 à la rotation r3. Le diagramme (MySQL Workbench) pourrait devenir le suivant :
Normalement, les clés de la table RATTACHEMENT_EXCEPTIONNEL sont les suivantes :
K1 = {ArmoireId, RattachementDate}
K2 = {RotationId, RattachementDate}
Elles découlent des contraintes suivantes :
A une date donnée, une armoire peut être exceptionnellement rattachée à une et une seule rotation qui n’est pas sa rotation normale.
A une date donnée, à une rotation donnée peut être exceptionnellement rattachée une et une seule armoire qui normalement ne lui appartient pas.
Par exemple, l’armoire a21 fait normalement partie de la rotation r2, mais peut être exceptionnellement rattachée à la rotation r1 le 11 mai 2015. Comme c’est Raoul qui ce jour là s’occupe de la rotation r1, ça sera automatiquement lui qui s’occupera de cette armoire. Aucun autre rattachement exceptionnel d’armoire ne pourra être fait pour r1 ce jour-là.
De même, l’armoire a22 fait elle aussi normalement partie de la rotation r2, mais peut être exceptionnellement rattachée à la rotation r3 le 11 mai 2015. Comme c’est Fernand qui ce jour là s’occupe de la rotation r3, ça sera automatiquement lui qui s’occupera de cette armoire. Aucun autre rattachement exceptionnel d’armoire ne pourra être fait pour r3 ce jour-là.
Avec ACCESS
Script SQL
-- -----------------------------------------------------
-- Table ROTATION
-- -----------------------------------------------------
CREATE TABLE ROTATION
(
RotationId INT NOT NULL,
RotationNom VARCHAR(64) NOT NULL,
CONSTRAINT ROTATION_PK PRIMARY KEY (RotationId)
) ;
-- -----------------------------------------------------
-- Table OPERATEUR
-- -----------------------------------------------------
CREATE TABLE OPERATEUR
(
OperateurId INT NOT NULL,
OperateurCode VARCHAR(5) NOT NULL,
OperateurNom VARCHAR(64) NOT NULL,
OperateurPrenom VARCHAR(64) NOT NULL,
CONSTRAINT OPERATEUR_PK PRIMARY KEY (OperateurId),
CONSTRAINT OPERATEUR_AK UNIQUE (OperateurCode)
) ;
-- -----------------------------------------------------
-- Table AFFECTATION
-- -----------------------------------------------------
CREATE TABLE AFFECTATION
(
RotationId INT NOT NULL,
OperateurId INT NOT NULL,
AffectationtDate DATE NOT NULL,
CONSTRAINT AFFECTATION_PK PRIMARY KEY (RotationId, OperateurId),
CONSTRAINT AFFECTATION_AK1 UNIQUE (RotationId, AffectationtDate),
CONSTRAINT AFFECTATION_AK2 UNIQUE (OperateurId, AffectationtDate),
CONSTRAINT AFFECTATION_ROTATION_FK FOREIGN KEY (RotationId) REFERENCES ROTATION (RotationId),
CONSTRAINT AFFECTATION_OPERATEUR_FK FOREIGN KEY (OperateurId) REFERENCES OPERATEUR (OperateurId)
) ;
-- -----------------------------------------------------
-- Table ARMOIRE
-- -----------------------------------------------------
CREATE TABLE ARMOIRE
(
ArmoireId INT NOT NULL,
ArmoireCode CHAR(4) NOT NULL,
ArmoireNom VARCHAR(64) NOT NULL,
RotationId INT NOT NULL,
CONSTRAINT ARMOIRE_PK PRIMARY KEY (ArmoireId),
CONSTRAINT ARMOIRE_AK UNIQUE (ArmoireCode),
CONSTRAINT ARMOIRE_ROTATION_FK FOREIGN KEY (RotationId) REFERENCES ROTATION (RotationId)
) ;
-- -----------------------------------------------------
-- Table RANGEMENT
-- -----------------------------------------------------
CREATE TABLE RANGEMENT
(
ArmoireId INT NOT NULL,
RangementDate DATE NOT NULL,
CONSTRAINT RANGEMENT_PK PRIMARY KEY (ArmoireId, RangementDate),
CONSTRAINT RANGEMENT_ARMOIRE_FK FOREIGN KEY (ArmoireId) REFERENCES ARMOIRE (ArmoireId)
) ;
-- -----------------------------------------------------
-- Table DOSSIER
-- -----------------------------------------------------
CREATE TABLE DOSSIER
(
ArmoireId INT NOT NULL,
RangementDate DATE NOT NULL,
NbDossiersRecus INT NOT NULL,
NbDossiersRenvoyes INT NOT NULL,
CONSTRAINT DOSSIER_PK PRIMARY KEY (ArmoireId, RangementDate),
CONSTRAINT DOSSIER_RANGEMENT_FK FOREIGN KEY (ArmoireId, RangementDate) REFERENCES RANGEMENT (ArmoireId, RangementDate)
) ;
-- -----------------------------------------------------
-- Table RATTACHEMENT_EXCEPTIONNEL
-- -----------------------------------------------------
CREATE TABLE RATTACHEMENT_EXCEPTIONNEL
(
ArmoireId INT NOT NULL,
RattachemenDate DATE NOT NULL,
RotationId INT NOT NULL,
CONSTRAINT RATTACHEMENT_EXCEPTIONNEL_PK PRIMARY KEY (ArmoireId, RattachemenDate),
CONSTRAINT RATTACHEMENT_EXCEPTIONNEL_AK UNIQUE (RotationId, RattachemenDate),
CONSTRAINT RATTACHEMENT_EXCEPTIONNEL_ARMOIRE_FK FOREIGN KEY (ArmoireId) REFERENCES ARMOIRE (ArmoireId),
CONSTRAINT RATTACHEMENT_EXCEPTIONNEL_ROTATION_FK FOREIGN KEY (RotationId) REFERENCES ROTATION (RotationId)
) ;
Commence-t-on à se rapprocher de ce qu'attend l'utilisateur ?
Partager