多对多关系是否应定义除关系之外的任何其他内容

时间:2009-03-06 18:12:50

标签: database-design

将典型的产品/类别与多对多关系相比,您通常会有如下关系:

table -- ProductsCategories
column - ProductId
column - CategoryId

不建议在该关系中添加其他属性,这些属性仅存在于该特定关系中。如(请原谅我可怕的例子,我不擅长例子):

table -- ProductsCategories
column - ProductId
column - CategoryId
column - DiscountForProductsInThisCategory
column - CategoryImageForProductsInThisCategory

7 个答案:

答案 0 :(得分:6)

多对多关系只是一个包含2个一对多关系的表,将其视为具有2个关系的3个表,而不是2个具有关系的表和与之关联的数据。实施没有区别。

无论哪种方式,它都是完全可以接受的。

答案 1 :(得分:6)

除非数据专门针对该特定关系,否则请避免这种情况,因为您最终会复制大量数据。在您的示例中,图像链接到类别,因此应存储在那里。但是,指示何时建立和编辑关系的时间戳以及创建和修改关系的用户ID应该在该表中。

答案 2 :(得分:5)

当然你可以在那里存储这些信息。在其他任何地方,它都不会正常化。

答案 3 :(得分:3)

例如,如果你有一个运动员表和一个种族表。联赛表AthleteRace表示该运动员参加该比赛,因此您也可以在那里参加比赛。

你有两个例子:

column - DiscountForProductsInThisCategory
column - CategoryImageForProductsInThisCategory

属于Category表,因为它们与类别相关,而不属于类别中产品的成员资格。

答案 4 :(得分:2)

这个问题不是需要考虑的问题。

如果是一列,例如。 DiscountForProductsInThisCategory是1:1且PK为Category,那么唯一正确的位置是Category。在ProductCategory中,它将是一个大规模的数据重复。

如果列是1 :: 1且关系为(ProductId + CategoryId),那么唯一正确的位置是ProductCategory。

答案 5 :(得分:1)

关系可以有属性,IMO。虽然有些设计大师不这么认为。

考虑学生和课程之间的“注册”关系。如果学生可以注册学分或作为审核员,则将此属性存储在其键为(StudentID,CourseID)的表中是有意义的。该表是关联表,其中列出了哪些学生在哪些课程中注册。

答案 6 :(得分:0)

我认为在此表中添加其他字段完全没问题。我所做的事情的一个例子是我通常添加一个时间戳字段,以便我知道两个entites之间何时建立了关系。