我有以下情况。我的表是:
表:CompanyEmployees
我还想存储每位员工的销售信息。我有这个:
表:DealsCompleted
我的问题是 - 如果CompanyEmployees中有一个名为“DealsCompletedID”的列直接引用DealsCompleted中的ID列,或者它是否只接受在两个Employee ID列之间创建外键?这会不利于设计还是可能会扭曲标准化?
我不清楚我是否应该在CompanyEmployees中添加额外的列是什么规则。
编辑请假设每位员工在交易表中只有一行。
答案 0 :(得分:2)
FOREIGN KEY
应该从父表中的一个表指向其引用的行,这两个表通常不应该相互引用(在两者中都定义了外键)。
FOREIGN KEY
表格中DealsCompleted
的定义最为恰当,后者指向CompanyEmployees.EmployeeID
。以这种方式考虑 - CompanyEmployees
表存储关于员工的信息。他们完成的交易并不真正算作关于员工的信息。但是,完成交易的员工是有关交易的信息的一部分,因此密钥属于那里。
拥有DealsCompleted.EmployeeID
将允许员工与交易之间建立适当的一对多关系。也就是说,一名员工可以根据需要在DealsCompleted
中拥有尽可能多的相关行。另一方面,在DealsCompleted
表中包含CompanyEmployees
列,需要您重复关于员工的行,这会破坏规范化,或者包含多个{{ 1}}列中的值也是不正确的。
上面编辑后更新即使您只计划一对一关系(每位员工一笔交易),在{{DealCompletedID
中引用EmployeeID
仍然更合适1}}而不是相反(或两种方式)。 ......当需要时,它允许你扩展到一对多。
答案 1 :(得分:1)
假设关系始终是一对一的,如您所述,那么答案取决于域模型中的主要实体。如果这个数据库的核心是一个关于Deals的数据库,而员工数据是辅助的,那么我会在Deal表中添加一个EmployeeId FK列。如果是otoh,这是一个关于Employees的数据库,并且Deals是辅助的,那么删除Deal表中的EmployeeId列,并将一个DealId FK列添加到Employeee表中。