在表中包含一个外键列?

时间:2013-01-27 16:38:07

标签: sql database database-design

我有以下情况。我的表是:

表:CompanyEmployees

  • 雇员
  • 出生日期
  • 加入日期

我还想存储每位员工的销售信息。我有这个:

表:DealsCompleted

  • ID
  • 雇员
  • 交易名称
  • 交易金额

我的问题是 - 如果CompanyEmployees中有一个名为“DealsCompletedID”的列直接引用DealsCompleted中的ID列,或者它是否只接受在两个Employee ID列之间创建外键?这会不利于设计还是可能会扭曲标准化?

我不清楚我是否应该在CompanyEmployees中添加额外的列是什么规则。

编辑请假设每位员工在交易表中只有一行。

2 个答案:

答案 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表中。