假设有一个包含表格Person(ID, Name)
和Product(ID, Name, Color)
的小型数据库。 ID列显然是每个表的主键。我想像往常一样添加一个多对多表Order(PersonID, ProductID, Date)
的关联。我的印象是表Order的主键是组合(PersonID, ProductID)
。但是在某些方法中,建议将组合(PersonID, ProductID, Date)
用作主键。有什么不同?我认为即使(PersonID, ProductID)
是主键,每个组合(PersonID, ProductID)
也只对应一个日期。如果后者为真,何时应将日期包含在主键中?
答案 0 :(得分:1)
如果只有一个日期与人/产品组合相关联,则PK应为(PersonID, ProductId)
。如果可以存在多个这样的关联,那么您应该只在PK中包含Date
,并且日期是它们的区别。如果在不需要时在PK中包含日期,如果您尝试创建具有相同人员/产品但具有不同日期的重复行,则数据库不会报告错误。
更新:
您对添加ID列的评论让我意识到这不太对。您只需要将(PersonID, ProductID)
声明为唯一键,它不必是主键。然后,您可以将ID字段作为主键;唯一键将防止重复。如果您将Date
添加到PK中,则可以执行相同的操作。
但是,在正确规范化的数据库中,主键应该是表中唯一的唯一键。关系是Key-> Data的映射,PK应该反映这种映射。