两个外键引用相同的主键

时间:2012-07-01 18:04:42

标签: asp.net sql vb.net normalization rdbms

可以在一个表中引用两个外键引用其他表的一个主键吗?

EmployeeID是employee表中的主键,在时间表表中两次显示为外键。

很少有管理员会代表其他员工填写时间表。

在帖子表格字段中,“TimsheetFor”将拥有处理项目的人员的employeeID,并且字段“EnteredBy”或“FilledBy”将拥有填写此时间表的那个人的employeeid。

以下哪个选项是正确的?

注意:表格仅显示与此问题相关的字段。

enter image description here

4 个答案:

答案 0 :(得分:21)

我会选择选项1 。在另一个表中引用相同主键列的两个外键列完全没问题,因为每个外键值将引用相关表中的不同记录。

我确定选项2 会起作用,但您在TIMESHEET_TABLETIMESHEET_FILLED_BY之间基本上会有一对一的关系,因此不需要两个表格难以维持。

事实上,如果成对需要ENTERED_BYTIMESHEET_FOR,则使用选项1 会更有意义,因为数据库和外键会自动执行此操作。

答案 1 :(得分:3)

是的,没有问题...你可以使用其他表中一个表的主键作为外键两次。

答案 2 :(得分:2)

选项1是一个完美的解决方案。您可以将外键约束定义为以下

Timesheet_For列的第一个外键约束

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

Entered_By列的第二个外键约束

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

答案 3 :(得分: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

使用此查询,您将获得所需的结果。