Deux clés étrangères faisant référence à la même clé primaire

Est-ce normal d'avoir deux clés étrangères dans un tableau faisant référence à une clé primaire d'une autre table?

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

il y aura peu d'utilisateurs admin qui rempliront les timsheets au nom des autres employés.

dans le champ timsheet table 'TimsheetFor' aura l'identification d'employé de la personne qui a travaillé sur des projets et le champ 'EnteredBy' ou' FilledBy' avez employé de la personne qui a rempli cette fiche.

Laquelle des options suivantes est correcte?

Nota: Les tableaux n'indiquent que les champs qui se rapportent à cette question.



enter image description here

22
demandé sur user1263981 2012-07-01 22:04:41

3 réponses

je voudrais aller 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 un tableau différent puisque chaque valeur de clé étrangère référencera un enregistrement différent dans le tableau correspondant.

je suis sûr que option 2 fonctionnerait, mais vous auriez essentiellement une relation de 1 à 1 entre TIMESHEET_TABLE et TIMESHEET_FILLED_BY, ce qui rend deux tables inutiles et plus difficiles à entretenir.

En fait, si les deux ENTERED_BY et TIMESHEET_FOR sont nécessaires par paires, en utilisant option 1 fait beaucoup plus de sens parce que cela est appliqué automatiquement par la base de données et les clés étrangères.

21
répondu Kevin Aenmey 2012-07-01 18:15:18

oui, il n'y a pas de problème avec ça...vous pouvez utiliser une clé primaire d'une table dans une autre table que la clé étrangère à deux reprises.

3
répondu Rab 2012-07-01 18:14:26

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

1ère contrainte de clé étrangère pour Timesheet_For column

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

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

ALTER TABLE TIMESHEETTABLE 
ADD CONSTRAINT fk_TimesheetTable_EmployeeTable_1
FOREIGN KEY (ENTERED_BY)
REFERENCES EMPLOYEETABLE(EMPLOYEE_ID)
2
répondu Ashish Shukla 2015-10-12 08:57:49