数据库中同一个表的多个外键?

时间:2014-10-23 09:10:51

标签: sql-server database-design

我有一个SQL Server数据库,它包含一个记录员工薪水的表。

它有3列声明为外键,并引用employee表的列employee_id

  • employee_id
  • submitted_by
  • confirmed_by

但最佳做法是将其全部作为FK,还是只需要employee_id

因为在我的应用程序中,submitted_byconfirmed_by将被下拉列表选中并假设它存在于员工表中。

感谢您的建议。

enter image description here

2 个答案:

答案 0 :(得分:3)

是的,因为系统的所有用户也是Employees由您的系统建模的,如果您希望在数据库中强制执行Referential Integrity (RI),则所有三列都应该将外键返回到引用的{ {1}}表。请注意,由于employee听起来像是工作流程过程的一部分,因此在插入记录时用户确认可能不可用,您可以在表格confirmed by中创建字段confirmed_by < em> nullable (EmployeeSalary),在这种情况下,RI只会在实际填充字段的后期强制执行。

您应该通过在外键中表示角色来适当地命名每个外键,例如

  • confirmed_by INT NULL
  • FK_EmployeeSalary_SalariedEmployee
  • FK_EmployeeSalary_EmployeeSubmittedBy

虽然前端可能会通过下拉菜单限制选择,但引用完整性仍然有用:

  • 防止错误,例如员工提交的内容(如果是非可空的FK)或FK_EmployeeSalary_EmployeeConfirmedBy表中不存在提供的员工。
  • 防止意外删除与外键数据相关联的员工。

对RI有一个(很小的)性能损失,因此DB需要检查employees表中PK的存在 - 在大多数情况下,这可以忽略不计。

答案 1 :(得分:2)

任何引用另一个表中的键的列都应声明为外键。这样,如果您错误地尝试将不存在的值放在那里,数据库将报告错误。