Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database design 多对多关系是否应该定义除关系之外的任何内容_Database Design - Fatal编程技术网

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