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