2012-07-01 26 views
20

Czy można w jednym stole mieć dwa klucze obce odnoszące się do jednego klucza głównego innej tabeli?Dwa klucze obce odnoszące się do tego samego klucza podstawowego

EmployeeID jest kluczem podstawowym w tabeli pracowników i pojawia się jako dwa klucze zagraniczne w tabeli czasu pracy.

Będzie niewielu administratorów wypełniających arkusze kalkulacyjne w imieniu innych pracowników.

W polu tabeli arkuszy kalkulacyjnych "TimsheetFor" będzie mieć ID pracownika tej osoby, która pracowała nad projektami, a pole "EnteredBy" lub "FilledBy" będzie miało employeeid tej osoby, która wypełniła tę grafikę.

Która z poniższych opcji jest poprawna?

UWAGA: Tabele pokazują tylko te pola, które są powiązane z tym pytaniem.

enter image description here

+1

Tak, to jest w porządku, aby mieć dwa FK do ten sam pk w jednej tabeli. – Glenn

+2

Tak - ** oczywiście! ** Dlaczego pytasz? Jaki problem/problem widzisz? –

+0

Chciałem zadać to samo pytanie. Cieszę się, że jestem obok tej wspaniałej strony! Dziękuję za odpowiedź :) –

Odpowiedz

3

tak, nie ma problemu z tym, że ... można użyć klucza podstawowego z jednej tabeli w drugiej tabeli jako klucz obcy dwa razy.

20

Wybrałbym opcję z opcją 1. Dobrze jest mieć dwie kolumny klucza obcego odwołujące się do tej samej kolumny klucza głównego w innej tabeli, ponieważ każda wartość klucza obcego odwoła się do innego rekordu w powiązanej tabeli.

Jestem pewien opcja 2 będzie działać, ale czy mają zasadniczo relacji 1-do-1 między TIMESHEET_TABLE i TIMESHEET_FILLED_BY, co dwa stoły niepotrzebne i trudniejsze do utrzymania.

W rzeczywistości, jeśli zarówno ENTERED_BY i TIMESHEET_FOR wymagane są w parach, przy użyciu opcję 1 sprawia znacznie więcej sensu, bo to jest automatycznie wykonywane przez bazę danych i kluczy obcych.

+2

Jestem SSS i popieram tę odpowiedź :) – SSS

+0

Działa, ale tylko wtedy, gdy obie FK ma opcję Usuń i Aktualizuj na BRAK DZIAŁANIA. Jeśli umieścisz "Kaskada" lub inne opcje, spowoduje to błąd. Mam taką samą sytuację na moim serwerze SQL 2008, na którym mam dwie tabele: Waluta i WalutaHistoria. Waluta ma wartość IdCurrency jako klucz podstawowy, a druga tabela ma wartości IdCurrency i IdCurrencyRefference, która musi być tą samą kolumną identyfikatora z tabeli Waluta. Tak więc, usunięcie lub aktualizacja muszę zrobić to z kodu, programowo. To jest to :) –

2

Opcja 1 to idealne rozwiązanie. Można zdefiniować klucz obcy następująco

1 klucz obcy dla kolumny Timesheet_For

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

2-ty ograniczenie klucza obcego dla kolumny Entered_By

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