所有关系数据库设计是否都需要针对多对多关系的联结或关联表?

时间:2016-01-02 01:24:43

标签: database database-design relational-database relational

我是数据库的新手,并且在创建多对多关系时尝试理解为什么需要联结或关联表。

我在Stackoverflow和其他地方发现的大多数内容都是用高度技术性的关系理论术语描述的,或者它只是被描述为“它就是这样做的方式”,而没有限定原因。

是否存在任何支持具有多对多关系而不使用关联表的关系数据库设计?例如,为什么不可能有一个表上的列保持与另一个的关系,反之亦然。

例如,一个包含课程列表的课程表和一个包含大量学生信息的学生表 - 每个课程可以有很多学生,每个学生可以参加很多课程。

为什么不可能在任何一个表(可能是csv格式)中的每一行上都有一列,其中包含与列表中其他列表或类似内容的关系?

3 个答案:

答案 0 :(得分:2)

在关系数据库中,每行中没有列包含多个值。因此,您永远不会以" CSV格式存储数据" - 或任何其他多值系统 - 在关系数据库的单个列中。也不允许制作包含相同项(Course1,Course2,Course3等)实例的重复列。这是关系数据库设计的第一条规则,被称为第一范式。

这些规则的存在有很好的理由(验证,约束和查询数据非常容易),但是你是否相信这些规则带来的好处,尽管如此,关系数据库的定义。

答案 1 :(得分:1)

我不知道你问题的答案,但我可以回答一个类似的问题:为什么我们在数据库中使用联结表来实现多对多关系?

首先,如果学生表跟踪学生所在的课程,并且课程记录了哪些学生在其中,那么我们就有重复。这可能会导致问题。如果学生知道它在课程中,但课程不知道它有该学生,该怎么办?每次更改课程时,您都必须确保在两个表中进行更改。不可避免地,每次都不会发生这种情况,数据会变得不一致。

其次,我们会在哪里存储这些信息?列表不是数据库中字段的可能类型。那么我们在学生表中放置一个课程栏吗?不,因为这样只会让每个学生参加一门课程,从学生到课程的多对一关系。我们在课程表中放置了学生专栏吗?不,因为那时我们每个课程都有一名学生。

有一个新表有一个学生和每行一个课程是做什么的。这告诉我们学生在课堂上没有重复任何数据。

答案 2 :(得分:1)

“连接表”来自ER / ORM演示文稿/方法/产品,它们并不真正理解关系模型。

在关系模型中(以及在原始ER信息建模中),应用关系由关系/表表示。每个表都包含彼此处于该关系中的值的元组,即它们是如此相关,即满足该关系,即参与关系。

关系表示为独立于任何特定情况的谓词,即填充(命名)空白语句。填充命名空格以在特定情况下从谓词中给出真实语句的行将在表格中显示。我们选择足够的谓词(因此基表)来描述每种情况。多对多和多对多应用程序关系都可以获得表格。

你没有看到很多多对多关系以及关于参与者的专栏而不是他们参与关系的原因是这样的表更好地分为关于参与者和一个关于参与者的关系。关系。例如,关于参与者1的多对多表中的列不能说任何关于不参与的实体的事情.2。每次参与时对实体说同样的事情。信息建模技术首先关注于识别独立实体类型,然后是它们之间的关系,这往往导致设计中几乎没有这样的问题。您没有在两个表中看到多对多关系的原因是,这是多余的,并且容易受到表不一致的错误的影响。集合值列(序列/列表/数组)的问题在于,您无法使用通常的查询表示法和实现来一般性地查询其部件,因为DBMS没有将部件组织到表中。

请参阅this recent answerthis one