将典型的产品/类别与多对多关系相比,您通常会有如下关系:
table -- ProductsCategories
column - ProductId
column - CategoryId
不建议在该关系中添加其他属性,这些属性仅存在于该特定关系中。如(请原谅我可怕的例子,我不擅长例子):
table -- ProductsCategories
column - ProductId
column - CategoryId
column - DiscountForProductsInThisCategory
column - CategoryImageForProductsInThisCategory
答案 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之间何时建立了关系。