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.
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.
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.
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)