2010-08-12 77 views
1

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

然而,他们从不提供WHY我们应该这样做的原因。我很好奇,想知道为什么,如果你只是保留了两个表,因为它是没有关联索引表可能发生问题和实例。

回答

2

使用关系数据库,您无法以任何其他方式创建多对多关系。也就是说,如果你有一个名为“人”的表,你不能创建一个“朋友”列,并期望把许多朋友的用户ID放在那里。你必须建立一个单独的表来保存关系本身。

+0

不幸的是,你正在混淆术语“关系”和“关系”,这意味着两件完全不同的事情。你当然不是唯一的一个,我注意到混淆这两者的趋势越来越普遍 - 但对于试图了解关系模型的人来说,这一定是非常混乱的。 – sqlvogel 2010-08-12 10:58:04

+0

对不起。我与语言的关系是“一对多”,我是一个人,语言很多。 (而英文不是我的第一个) – Jonny 2010-08-12 16:13:23

0

如果您不创建第三个表,则无处存储关系。

通过一对一或一对多关系,您可以将关系存储在其中一个表中。有了多对多的关系,你必须分开存储关系。 (当然,理论上你店作为一个逗号分隔两个表中的身份列表中,但是这将是一场噩梦使用和维护。)

0

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

  • 变化关系水煤浆在assoc命令

  • 店等关联信息。表

  • 性能增强

  • 存储增强

2

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

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

所以这并不是说“多对多关系”与其他关系有任何不同。只是规范化常常导致带有复合键的表的常见模式,而没有其他非键属性。有些人喜欢把这种模式称为关联表 - 尽管我个人觉得这个术语没有什么帮助。