Database design 多对多关系是否应该定义除关系之外的任何内容
以典型的产品/类别多对多关系为例,您通常会有如下关系:Database design 多对多关系是否应该定义除关系之外的任何内容,database-design,Database Design,以典型的产品/类别多对多关系为例,您通常会有如下关系: table -- ProductsCategories column - ProductId column - CategoryId 将其他属性添加到该关系中是不明智的,这些属性只存在于该特定关系中。例如(请原谅我糟糕的例子,我不擅长举例): 多对多关系只是一个具有2个一对多关系的表,可以将其视为具有2个关系的3个表,而不是具有与其相关联的关系和数据的2个表。在执行上没有区别 无论哪种方式,它都是完全可以接受的。我认为在这个表中添加其他字
table -- ProductsCategories
column - ProductId
column - CategoryId
将其他属性添加到该关系中是不明智的,这些属性只存在于该特定关系中。例如(请原谅我糟糕的例子,我不擅长举例):
多对多关系只是一个具有2个一对多关系的表,可以将其视为具有2个关系的3个表,而不是具有与其相关联的关系和数据的2个表。在执行上没有区别
无论哪种方式,它都是完全可以接受的。我认为在这个表中添加其他字段完全可以。我所做的一个例子是,我通常会添加一个时间戳字段,以便知道两个实体之间的关系是何时创建的。当然,您可以将此信息存储在那里。除非数据是专门针对特定关系的,否则请避免这种情况,因为最终会复制大量数据。在您的示例中,图像链接到类别,因此应该存储在那里。但是,该表中应包含指示何时建立和编辑关系的时间戳,以及创建和修改关系的用户ID。是 在我看来,一段关系可以有属性,尽管有些设计大师不这么认为
考虑学生和课程之间的“注册”关系。如果学生可以注册为学分或审计员,那么将此属性存储在键为(StudentID,CourseID)的表中是有意义的。此表是一个关系表,它列出了哪些学生参加了哪些课程 例如,如果你有一张运动员表和一张比赛表。join table AthleteRace表示该运动员在该比赛中的参与度,因此您也可以将他们的比赛时间包含在其中 您有两个示例:
column - DiscountForProductsInThisCategory
column - CategoryImageForProductsInThisCategory
属于类别表,因为它们与类别相关,而不是与类别内产品的成员资格相关。该问题不是要考虑的问题 如果某列(例如,
DiscountForProductsInThisCategory
的主键为1::1,则该列唯一正确的位置是Category。在ProductCategory中,这将是数据的大规模重复
如果列是1::1且具有关系(ProductId+CategoryId),那么它唯一正确的位置就是ProductCategory。+1:并且,还有“更高阶”的关系。三向关系,例如,中间表有两个以上的FK,也可能有属性。+1。如果这些属性依赖于两个(或多个)外键的唯一交集,则这是它们的正确位置。这两个字段可以存储在类别表中,同时仍处于标准化状态。它们的名字是“x…在这个类别中”,因此它们与这个类别相关。它们与“关系”本身无关。嗯,这里给出的特定egs是不正确的。缺乏规范化,大量重复。谢谢,这将是一个更好的例子。我很难给出合适的例子。我同意,我将使用CategoryID连接到一个表,该表包含该类别中产品的折扣,因为它属于该类别,而不是类别和产品之间的关系。添加时间戳与关系相关。
column - DiscountForProductsInThisCategory
column - CategoryImageForProductsInThisCategory