web-dev-qa-db-ja.com

同じ主キーを参照する2つの外部キー

これは、他のテーブルの1つの主キーを参照する1つのテーブルに2つの外部キーがあっても大丈夫ですか?

EmployeeIDは、employeeテーブルの主キーであり、timesheetテーブルでは外部キーとして2回表示されます。

他の従業員に代わってティムシートに記入する管理ユーザーはほとんどいません。

Timsheetテーブルのフィールド 'TimsheetFor'には、プロジェクトに取り組んだその人のemployeeIDがあり、フィールド 'EnteredBy'または 'FilledBy'には、このタイムシートに記入したその人のemployeeidがあります。

次のうち正しいのはどれですか。

注:表には、この質問に関連するフィールドのみが表示されています。

enter image description here

28
user1263981

オプション1を使用します。各外部キー値は関連するテーブルの異なるレコードを参照するため、2つの外部キー列が異なるテーブルの同じ主キー列を参照することは完全に問題ありません。

きっとオプション2は機能しますが、基本的にはTIMESHEET_TABLETIMESHEET_FILLED_BYの間に1対1の関係があり、2つのテーブルが不要になり、保守が難しくなります。

実際、ENTERED_BYTIMESHEET_FORの両方がペアで必要な場合は、データベースと外部キーによって自動的に適用されるため、オプション1を使用する方がはるかに合理的です。

21
Kevin Aenmey

はい、問題ありません。あるテーブルの主キーを別のテーブルの外部キーとして2回使用できます。

3
Raab

オプション1は完璧なソリューションです。外部キー制約を次のように定義できます

Timesheet_For列の最初の外部キー制約

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

Entered_By列の2番目の外部キー制約

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