Database design 需要关联表的多对多关系

Database design 需要关联表的多对多关系,database-design,many-to-many,Database Design,Many To Many,在许多数据库设计教程/文章中,他们总是提出这样一个事实:如果两个表共享多对多关系,那么应该创建第三个表作为关联表来链接这两个表 然而,他们从来没有提供我们这样做的理由。我很想知道,如果只保留两个表,而没有关联表,为什么会出现问题以及可能出现的问题示例。使用关系数据库不能以任何其他方式建立多对多关系。也就是说,如果你有一个名为person的表,你就不能创建一个列friends并期望在其中放置许多friends的用户id。您必须创建一个单独的表来保存关系本身。您不能使用关系数据库以任何其他方式创建多

在许多数据库设计教程/文章中,他们总是提出这样一个事实:如果两个表共享多对多关系,那么应该创建第三个表作为关联表来链接这两个表


然而,他们从来没有提供我们这样做的理由。我很想知道,如果只保留两个表,而没有关联表,为什么会出现问题以及可能出现的问题示例。

使用关系数据库不能以任何其他方式建立多对多关系。也就是说,如果你有一个名为person的表,你就不能创建一个列friends并期望在其中放置许多friends的用户id。您必须创建一个单独的表来保存关系本身。

您不能使用关系数据库以任何其他方式创建多对多关系。也就是说,如果你有一个名为person的表,你就不能创建一个列friends并期望在其中放置许多friends的用户id。您必须创建一个单独的表来保存关系本身。

如果不创建第三个表,就没有地方存储关系


使用一对一或一对多关系,可以将该关系存储在其中一个表中。对于多对多关系,您必须单独存储这些关系。从理论上讲,可以将其存储为两个表中以逗号分隔的标识列表,但这将是一个使用和维护的噩梦。

如果不创建第三个表,则根本没有地方存储关系


使用一对一或一对多关系,可以将该关系存储在其中一个表中。对于多对多关系,您必须单独存储这些关系。理论上,你可以将它存储为两个表中以逗号分隔的身份列表,但这将是一个使用和维护的噩梦。

维基百科也描述了它。请看一看:


如果您仍然不相信多对多确实需要第三个表,那么只需尝试wikipedia文章中描述的Authors/Books示例,其中只有两个标准化的表。

wikipedia也介绍了这一点。请看一看:


如果您仍然不相信多对多确实需要第三个表,只需使用wikipedia文章中描述的Authors/Books示例,其中只有两个标准化的表。

如果DB Server可以为您创建第三个表,这将是不灵活的。如果会有这样的解决方案,你不会有太大的影响力

改变关系行为

将其他关联信息存储在关联表中

性能增强

存储增强功能


如果DB Server可以为您创建第三个表,那么这将是不灵活的。如果会有这样的解决方案,你不会有太大的影响力

改变关系行为

将其他关联信息存储在关联表中

性能增强

存储增强功能


在关系数据库中,所有关系仅以一种方式表示:关系对应于SQL中的表。具有两个属性的关系,例如R{A,B},表示A和B之间的二元关系。例如,该关系可以是一对多或多对多

如果由R{A,B}表示的关系是多对多的,这意味着A或B都不是候选键,因为如果其中一个是唯一的,那么显然该属性的每个值只允许一个元组。这意味着,第三范式的原理要求依赖于A或B的任何属性进入其他表中。原因是依赖于A或B的非键依赖性属性是一种冗余形式,可能导致异常和错误结果


因此,并不是说多对多关系与其他关系有什么不同。只是规范化通常会导致一种常见模式,即表具有复合键,而没有其他非键属性。有些人喜欢将这种模式称为关联表——尽管我个人认为这种术语没有多大帮助。

在关系数据库中,所有关系都只以一种方式表示:因为关系对应于SQL中的表。具有两个属性的关系,例如R{A,B},表示A和B之间的二元关系。例如,该关系可以是一对多或多对多

如果由R{A,B}表示的关系是多对多的,这意味着A或B都不是候选键,因为如果其中一个是唯一的,那么显然该属性的每个值只允许一个元组。这意味着,第三范式的原理要求依赖于A或B的任何属性进入其他表中。原因是依赖于A或B的非键依赖性属性是一种冗余形式,可能导致异常和错误结果

因此,并不是说多对多关系与其他关系有什么不同。这是绝对的
t规范化通常会导致一种常见模式,即表具有复合键,而没有其他非键属性。有些人喜欢将这种模式称为关联表——尽管我个人认为这种术语没有多大帮助。

让我们用一个例子来理解它。如果你有两张桌子,一张是苹果桌,另一张是人桌,他们之间有多对多的关系;这意味着一个人可以有多个苹果,一个苹果可以被多人分享吃掉

所以,如果我们在person表中的apple表中添加一个外键,那么这就给出了一个关系,一个苹果可以被多个人吃掉,但我们没有指定另一种关系。看到这张桌子了吗

类似地,如果我们在apple表中为person表添加一个外键,那么这将给出一个关系,即一个人可以吃多个苹果,但另一个人不能同时吃多个苹果。参见此表

下面是关联表。关联表用于两个对象之间的多对多关系。它们至少由2个外键组成,每个外键引用两个对象中的一个,关联表中的主键至少由2个外键组成。看到这张桌子了吗

参考:
让我们用一个例子来理解它。如果你有两张桌子,一张是苹果桌,另一张是人桌,他们之间有多对多的关系;这意味着一个人可以有多个苹果,一个苹果可以被多人分享吃掉

所以,如果我们在person表中的apple表中添加一个外键,那么这就给出了一个关系,一个苹果可以被多个人吃掉,但我们没有指定另一种关系。看到这张桌子了吗

类似地,如果我们在apple表中为person表添加一个外键,那么这将给出一个关系,即一个人可以吃多个苹果,但另一个人不能同时吃多个苹果。参见此表

下面是关联表。关联表用于两个对象之间的多对多关系。它们至少由2个外键组成,每个外键引用两个对象中的一个,关联表中的主键至少由2个外键组成。看到这张桌子了吗

参考:

不幸的是,您将术语“关系”和“关系”混为一谈,这两个词的含义截然不同。当然,你不是唯一一个,我注意到混淆两者的趋势越来越普遍,但对于那些试图学习关系模型的人来说,这肯定是非常令人困惑的。对不起。我与语言的关系是一对多的,我是一,语言是多种的。英文版不是我的第一本。不幸的是,你把关系和关系这两个词混为一谈了,这两个词的意思完全不同。当然,你不是唯一一个,我注意到混淆两者的趋势越来越普遍,但对于那些试图学习关系模型的人来说,这肯定是非常令人困惑的。对不起。我与语言的关系是一对多的,我是一,语言是多种的。英文版不是我的第一个,因为表格代表关系/关联。FK有时被称为关系,但它们不是&它们不需要记录或查询。它们是关于关系/关联和表的关联约束语句的一部分,用于保持多个表的一致性。因为表表示关系/关联。FK有时被称为关系,但它们不是&它们不需要记录或查询。它们是关于关系/关联和表的关联约束语句的一部分,用于保持多个表的一致性。