Bonsoir Cédric,

Envoyé par
cedrix57
Dans ma base de donnée j'ai un table Equipe, et une table Employe.
Un employé appartient à une équipe.
Une équipe a un employé chef.
Voici le schéma relationnel de mes tables :
Equipe(idEquipe, nomEquipe, idEmployeChef#)
Employe(idEmploye, nomEmp, prenomEmp, idEquipe#)
Du point de vue de la théorie relationnelle, il n’y a aucun problème : si les deux tables se référencent mutuellement, on a deux INSERT dans un même bloc d’instructions et les contrôles ne sont déclenchés que lorsque l’ensemble des instructions du bloc a été effectué.
Du point de vue SQL, c’est une autre paire de manches et Luc Orient vous l’a fait observer, disons que vous êtes confronté au problème de l'oeuf et de la poule. Maintenant, la norme SQL prévoit un paramètre Initially Deferred Deferrable utilisable pour la clause FOREIGN KEY, qui vous permet de déclencher par programme le contrôle de l’intégrité référentielle (instruction Set Constraints All Immediate), voire de le différer jusqu’au prochain point de COMMIT.
Certains SGBD SQL offrent cette possibilité (par exemple Oracle, PostgreSQL). A défaut, vous pouvez mettre en œuvre une table supplémentaire, appelons-la Direction, qui soit un appendice de la table Equipe et soit connectée sur la table Employe :
Equipe (idEquipe, nomEquipe)
Employe (idEmploye, nomEmp, prenomEmp, idEquipe#)
Direction (idEquipe#, idEmployeChef#)
L’attribut idEmployeChef# disparaît de la table Equipe.
La table Direction comporte une ligne par équipe. L’attribut idEquipe# en constitue la clé primaire et constitue aussi une clé étrangère référençant la table Equipe. L’attribut idEmployeChef# de la table Direction constitue la clé étrangère référençant la table Employe.
A noter que si un employé ne peut diriger qu’une équipe, l’attribut idEmployeChef# de la table Direction devra faire l’objet d’une clé alternative (contrainte UNIQUE).
En plus, si un employé ne peut diriger que l’équipe à laquelle il appartient, vous pourrez par exemple ajouter une surclé pour la table Employe :
Constraint Cx UNIQUE (idEmploye, idEquipe#)
Et définir une contrainte référentielle pour la table Direction :
Constraint Cy FOREIGN KEY (idEmployeChef#, idEquipe#)
A moins que vous ne préfériez mettre en œuvre un trigger, c’est vous qui voyez.
Exemple (SQL Server) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| CREATE TABLE Equipe
(
idEquipe CHAR(4) NOT NULL
, nomEquipe VARCHAR(32) NOT NULL
, CONSTRAINT C1 PRIMARY KEY (idEquipe)
) ;
CREATE TABLE Employe
(
idEmploye CHAR(4) NOT NULL
, idEquipe CHAR(4) NOT NULL
, nomEmp VARCHAR(32) NOT NULL
, CONSTRAINT C2 PRIMARY KEY (idEmploye)
, CONSTRAINT C3 UNIQUE (idEmploye, idEquipe)
, CONSTRAINT C4 FOREIGN KEY (idEquipe) REFERENCES Equipe (idEquipe)
) ;
CREATE TABLE Direction
(
idEquipe CHAR(4) NOT NULL
, idEmploye CHAR(4) NOT NULL
, CONSTRAINT C5 PRIMARY KEY (idEquipe)
, CONSTRAINT C6 UNIQUE (idEmploye)
, CONSTRAINT C7 FOREIGN KEY (idEquipe) REFERENCES Equipe (idEquipe)
, CONSTRAINT C8 FOREIGN KEY (idEmploye, idEquipe) REFERENCES Employe (idEmploye, idEquipe)
) ; |
Partager