2012-07-01 7 views
20

È possibile avere due chiavi esterne in una tabella che fa riferimento a una chiave primaria di un'altra tabella?Due chiavi esterne che fanno riferimento alla stessa chiave primaria

EmployeeID è una chiave primaria nella tabella dei dipendenti e viene visualizzata come una chiave esterna due volte nella tabella delle attività.

Ci saranno pochi utenti admin che riempiono fogli di tempo per conto di altri dipendenti.

Nel campo della tabella Timsheet "TimsheetFor" avrà ID dipendente di quella persona che ha lavorato ai progetti e il campo "EnteredBy" o "FilledBy" avrà l'employeeid di quella persona che ha riempito questa scheda attività.

Quale delle seguenti opzioni è corretta?

NOTA: le tabelle mostrano solo i campi correlati a questa domanda.

enter image description here

+1

Sì, è bene avere due fk al stesso pk in una tabella. – Glenn

+2

Sì - ** ovviamente! ** Perché lo chiedi? Qual è il problema/problema che stai vedendo? –

+0

Volevo fare la stessa domanda. Sono contento di essere parte di questo fantastico sito! Grazie per aver risposto :) –

risposta

3

Sì, non c'è nessun problema con questo ... è possibile utilizzare una chiave primaria di una tabella in altra tabella come stranieri due volte il tasto.

20

Vorrei andare con opzione 1. È perfettamente corretto disporre di due colonne di chiavi esterne che fanno riferimento alla stessa colonna di chiave primaria in una tabella diversa poiché ciascun valore di chiave esterna farà riferimento a un altro record nella tabella correlata.

sono sicuro opzione 2 avrebbe funzionato, ma si sarebbe in sostanza avere un rapporto 1 a 1 tra il TIMESHEET_TABLE e TIMESHEET_FILLED_BY, facendo due tavoli inutili e più difficile da mantenere.

Infatti, se entrambi ENTERED_BY e TIMESHEET_FOR sono tenuti a coppie, utilizzando opzione 1 rende molto più senso perché questo viene applicato automaticamente dal database e chiavi esterne.

+2

Io sono SSS e approvo questa risposta :) – SSS

+0

Funziona, ma solo se entrambi FK ha Opzioni Elimina e Aggiorna a NO ACTION. Se metti "Cascade", o altre opzioni, ti darà un errore. Ho la stessa situazione sul mio SQL 2008 Server, dove ho due tabelle, valuta e valuta storica. La valuta ha IdCurrency come chiave primaria e la seconda tabella ha IdCurrency e IdCurrencyRefference, che deve essere la stessa colonna Id della tabella Currency. Quindi, l'eliminazione o l'aggiornamento devo farlo dal codice, a livello di programmazione. Questo è tutto :) –

2

L'opzione 1 è una soluzione perfetta. È possibile definire vincolo di chiave esterna come segue

primo vincolo di chiave esterna per la colonna Timesheet_For

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

secondo vincolo di chiave esterna per la colonna Entered_By

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