Merci champomy62.
Je subodore un gros problème avec DB-MAIN : l’exclusion ne serait applicable qu'entre des attributs d’une même entité-type, lesquels devraient donc constituer un groupe exigeant que ces attributs soient optionnels, d’où ouverture la porte au bonhomme Null, et là, halte ! Avez-vous une alternative ?
Sinon, supposons qu’un employé puisse être indifféremment opérateur ou superviseur, mais qu’il ne puisse pas jouer à la fois les deux rôles pour un test donné : avec DB-MAIN on doit donc autoriser la présence du bonhomme Null, et je dis donc : Niet ! En plus, on est obligé de passer au niveau MLD pour représenter la contrainte :
Je préfère alors agir au niveau SQL et fermer la porte au bonhomme (exemple avec SQL Server) :
CREATE TABLE EMPLOYE
(
EmpId INT NOT NULL
, EmpNom VARCHAR(32) NOT NULL
, CONSTRAINT EMPLOYE_PK PRIMARY KEY (EmpId)
) ;
CREATE TABLE TEST
(
TestId INT NOT NULL
, TestNom VARCHAR(32) NOT NULL
, OperateurId INT NOT NULL
, SuperviseurId INT NOT NULL
, CONSTRAINT TEST_PK PRIMARY KEY (TestId)
, CONSTRAINT TEST_EMPLOY_OPER_FK FOREIGN KEY (OperateurId) REFERENCES EMPLOYE (EmpId)
, CONSTRAINT TEST_EMPLOY_SUPER_FK FOREIGN KEY (SuperviseurId) REFERENCES EMPLOYE (EmpId)
, CONSTRAINT TEST_EXCLUSION_CHK CHECK (OperateurId <> SuperviseurId)
) ;
INSERT INTO EMPLOYE (EmpId, EmpNom) VALUES (1, 'Fernand') ;
INSERT INTO EMPLOYE (EmpId, EmpNom) VALUES (2, 'Raoul') ;
INSERT INTO EMPLOYE (EmpId, EmpNom) VALUES (3, 'Paul') ;
SELECT '' AS EMPLOYE, * FROM EMPLOYE ;
INSERT INTO TEST (TestId, TestNom, OperateurId, SuperviseurId) VALUES (1, 'test 1', 1, 2) ;
INSERT INTO TEST (TestId, TestNom, OperateurId, SuperviseurId) VALUES (2, 'test 2', 2, 3) ;
SELECT '' AS TEST, * FROM TEST ;
Votre avis ?
Partager