37

1 つのテーブルに 2 つの外部キーがあり、他のテーブルの 1 つの主キーを参照していても問題ありませんか?

EmployeeID は従業員テーブルの主キーであり、タイムシート テーブルでは外部キーとして 2 回表示されます。

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

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

次の選択肢のうち、正しいものはどれですか?

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

ここに画像の説明を入力

4

4 に答える 4

26

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

オプション2は機能すると確信していますが、基本的にとの間には1対1の関係がTIMESHEET_TABLEありTIMESHEET_FILLED_BY、2つのテーブルが不要になり、保守がより困難になります。

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

于 2012-07-01T18:08:54.897 に答える
4

オプション 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)
于 2015-10-12T08:57:49.840 に答える
2

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

于 2012-07-01T18:08:22.010 に答える
1

あなたのようなクエリ:

SELECT t.EMPLOYEE_ID, a.NAME as TimeSheetFor, b.NAME as EnteredBy 
FROM timesheet t
JOIN employee a ON t.timesheet_for =a.employee_id
JOIN employee b ON t.entered_by = b.employee_id

このクエリを使用すると、必要な結果が得られます。

于 2020-09-23T12:51:27.917 に答える