我有一个SQL Server数据库,它包含一个记录员工薪水的表。
它有3列声明为外键,并引用employee
表的列employee_id
:
但最佳做法是将其全部作为FK,还是只需要employee_id
?
因为在我的应用程序中,submitted_by
和confirmed_by
将被下拉列表选中并假设它存在于员工表中。
感谢您的建议。
答案 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_EmployeeSalary_EmployeeConfirmedBy
表中不存在提供的员工。对RI有一个(很小的)性能损失,因此DB需要检查employees
表中PK的存在 - 在大多数情况下,这可以忽略不计。
答案 1 :(得分:2)
任何引用另一个表中的键的列都应声明为外键。这样,如果您错误地尝试将不存在的值放在那里,数据库将报告错误。