2012-11-01 173 views
2

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

回答

0

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

UPDATE:

你关于添加ID列注释使我意识到,这是不完全正确。您只需要声明(PersonID, ProductID)作为唯一密钥,它不必是主密钥。然后你可以有一个ID字段作为主键;唯一的密钥将防止重复。如果您将Date添加到PK,也可以做同样的事情。

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

+0

好的,自从我写下这个问题以来,我一直在仔细考虑,并得出了与答案中所述相同的结论。然而,它让我感到将日期添加到PK与将关键字添加到关联表相同,这是不恰当的。有一个共同的和可以接受的方法来克服这个问题吗? – arjacsoh

+0

查看关于唯一密钥verus主键的更新。 – Barmar