web-dev-qa-db-fra.com

Deux clés étrangères référençant la même clé primaire

Est-ce correct d'avoir deux clés étrangères dans une table référençant une clé primaire d'une autre table?

EmployeeID est une clé primaire dans la table des employés et apparaît deux fois comme clé étrangère dans la table de feuille de temps.

Il y aura peu d'administrateurs remplissant des feuilles de temps au nom d'autres employés.

Dans le champ du tableau de la feuille de temps, 'TimsheetFor' aura l'employé de cette personne qui a travaillé sur des projets et le champ 'EnteredBy' ou 'FilledBy' aura l'employé de cette personne qui a rempli cette feuille de temps.

Laquelle des options suivantes est correcte?

REMARQUE: les tableaux affichent uniquement les champs liés à cette question.

enter image description here

28
user1263981

J'irais avec option 1. Il est parfaitement correct d'avoir deux colonnes de clé étrangère référençant la même colonne de clé primaire dans une table différente, car chaque valeur de clé étrangère fera référence à un enregistrement différent dans la table associée.

Je suis sûr option 2 fonctionnerait, mais vous auriez essentiellement une relation 1 à 1 entre TIMESHEET_TABLE et TIMESHEET_FILLED_BY, rendant deux tables inutiles et plus difficiles à gérer.

En fait, si les deux ENTERED_BY et TIMESHEET_FOR sont requis par paires, l'utilisation de option 1 est beaucoup plus logique car elle est automatiquement appliquée par la base de données et les clés étrangères.

21
Kevin Aenmey

oui, cela ne pose aucun problème ... vous pouvez utiliser deux fois la clé primaire d'une table dans une autre table comme clé étrangère.

3
Raab

L'option 1 est une solution parfaite. Vous pouvez définir la contrainte de clé étrangère comme suit

1ère contrainte de clé étrangère pour la colonne Timesheet_For

ALTER TABLE TIMESHEETTABLE 
ADD CONSTRAINT fk_TimesheetTable_EmployeeTable
FOREIGN KEY (TIMESHEET_FOR)
REFERENCES EMPLOYEETABLE(EMPLOYEE_ID)

2e contrainte de clé étrangère pour la colonne Entered_By

ALTER TABLE TIMESHEETTABLE 
ADD CONSTRAINT fk_TimesheetTable_EmployeeTable_1
FOREIGN KEY (ENTERED_BY)
REFERENCES EMPLOYEETABLE(EMPLOYEE_ID)
2
Ashish Shukla