关联表中的主键

时间:2012-11-01 07:45:12

标签: database associations primary-key composite-primary-key

假设有一个包含表格Person(ID, Name)Product(ID, Name, Color)的小型数据库。 ID列显然是每个表的主键。我想像往常一样添加一个多对多表Order(PersonID, ProductID, Date)的关联。我的印象是表Order的主键是组合(PersonID, ProductID)。但是在某些方法中,建议将组合(PersonID, ProductID, Date)用作主键。有什么不同?我认为即使(PersonID, ProductID)是主键,每个组合(PersonID, ProductID)也只对应一个日期。如果后者为真,何时应将日期包含在主键中?

1 个答案:

答案 0 :(得分:1)

如果只有一个日期与人/产品组合相关联,则PK应为(PersonID, ProductId)。如果可以存在多个这样的关联,那么您应该只在PK中包含Date,并且日期是它们的区别。如果在不需要时在PK中包含日期,如果您尝试创建具有相同人员/产品但具有不同日期的重复行,则数据库不会报告错误。

更新:

您对添加ID列的评论让我意识到这不太对。您只需要将(PersonID, ProductID)声明为唯一键,它不必是主键。然后,您可以将ID字段作为主键;唯一键将防止重复。如果您将Date添加到PK中,则可以执行相同的操作。

但是,在正确规范化的数据库中,主键应该是表中唯一的唯一键。关系是Key-> Data的映射,PK应该反映这种映射。