是否所有关系数据库设计都需要联结或关联 table 来实现多对多关系?
Do all relational database designs require a junction or associative table for many-to-many relationship?
我是数据库的新手,正在尝试理解为什么在创建多对多关系时需要联结或关联 table。
我在 Whosebug 和其他地方找到的大部分内容要么用高度技术性的关系理论术语来描述它,要么只是描述为“这就是它完成的方式”而没有限定原因。
是否有任何关系数据库设计可以在不使用关联的情况下支持多对多关系 table?例如,为什么不可能在 table 上有一个列来保存与另一个的关系,反之亦然。
例如,包含课程列表的课程 table 和包含大量学生信息的学生 table — 每门课程可以有很多学生,每个学生可以选修很多 类。
为什么在 table(可能是 csv 格式)中的每一行都不可能包含与列表或类似内容中其他列的关系?
在关系数据库中,每行中没有一列多于一个值。因此,您永远不会将 "CSV format" 或任何其他多值系统中的数据存储在关系数据库的单个列中。也不允许创建包含同一项目实例(Course1、Course2、Course3 等)的重复列。这是关系数据库设计的第一条规则,称为第一范式。
这些规则的存在有很好的理由(验证、约束和查询数据要容易得多)但是无论您是否相信这些规则的好处,none-the-less,关系数据库定义的一部分。
我不知道你的问题的答案,但我可以回答一个类似的问题:为什么我们对数据库中的 many-to-many 关系使用联结 table?
首先,如果学生 table 跟踪学生所在的课程,课程跟踪其中的学生,那么我们就会出现重复。这可能会导致问题。如果学生知道它在课程中,但课程不知道它有那个学生怎么办。每次更改课程时,您都必须确保在两个 table 中都进行更改。不可避免地不会每次都发生这种情况并且数据会变得不一致。
第二,我们会将这些信息存储在哪里?列表不是数据库中字段的可能类型。那么我们是否在学生 table 中放置一个课程列?不,因为那将只允许每个学生选修一门课程,即学生与课程之间的 many-to-one 关系。我们是否在课程 table 中放置了一个学生栏?不是,因为那样我们每门课只有一个学生。
有用的是新的 table 每行有一个学生和一门课程。这告诉我们,一个学生在 class 中,没有重复任何数据。
"Junction tables"来自ER/ORMpresentations/methods/products,对关系模型不太了解。
在关系模型(以及原始 ER 信息建模)中,应用程序关系由 relations/tables 表示。每个 table 包含值的元组,这些值彼此处于那种关系中,即如此相关,即满足该关系,即参与该关系。
关系独立于任何特定情况表达为谓词,fill-in-the-(named-)空白语句。填充命名空白以在特定情况下给出谓词的真实陈述的行进入 table。我们选择足够的谓词(因此基础 tables)来描述每种情况。 many-to-1 和 many-to-many 应用程序关系都得到 tables.
之所以没有看到很多 many-to-many 关系以及关于参与者的列而不是关于他们参与关系的列,是因为这样的 table 更好地拆分分为关于参与者的和关于关系的。例如 many-to-many table 中关于参与者的列 1. 不能对不参与的实体说任何话 2. 每次参与时都对实体说同样的话。专注于首先识别独立实体类型然后它们之间的关系的信息建模技术往往会导致设计很少出现此类问题。您在两个 table 中看不到 many-to-many 关系的原因是这是多余的并且容易受到 table 不同意错误的影响。 collection-valued 列 (sequences/lists/arrays) 的问题是您不能使用通常的查询符号和实现来一般地查询它们的部分,因为 DBMS 看不到组织成 table 的部分。
见this recent answer or this one。
我是数据库的新手,正在尝试理解为什么在创建多对多关系时需要联结或关联 table。
我在 Whosebug 和其他地方找到的大部分内容要么用高度技术性的关系理论术语来描述它,要么只是描述为“这就是它完成的方式”而没有限定原因。
是否有任何关系数据库设计可以在不使用关联的情况下支持多对多关系 table?例如,为什么不可能在 table 上有一个列来保存与另一个的关系,反之亦然。
例如,包含课程列表的课程 table 和包含大量学生信息的学生 table — 每门课程可以有很多学生,每个学生可以选修很多 类。
为什么在 table(可能是 csv 格式)中的每一行都不可能包含与列表或类似内容中其他列的关系?
在关系数据库中,每行中没有一列多于一个值。因此,您永远不会将 "CSV format" 或任何其他多值系统中的数据存储在关系数据库的单个列中。也不允许创建包含同一项目实例(Course1、Course2、Course3 等)的重复列。这是关系数据库设计的第一条规则,称为第一范式。
这些规则的存在有很好的理由(验证、约束和查询数据要容易得多)但是无论您是否相信这些规则的好处,none-the-less,关系数据库定义的一部分。
我不知道你的问题的答案,但我可以回答一个类似的问题:为什么我们对数据库中的 many-to-many 关系使用联结 table?
首先,如果学生 table 跟踪学生所在的课程,课程跟踪其中的学生,那么我们就会出现重复。这可能会导致问题。如果学生知道它在课程中,但课程不知道它有那个学生怎么办。每次更改课程时,您都必须确保在两个 table 中都进行更改。不可避免地不会每次都发生这种情况并且数据会变得不一致。
第二,我们会将这些信息存储在哪里?列表不是数据库中字段的可能类型。那么我们是否在学生 table 中放置一个课程列?不,因为那将只允许每个学生选修一门课程,即学生与课程之间的 many-to-one 关系。我们是否在课程 table 中放置了一个学生栏?不是,因为那样我们每门课只有一个学生。
有用的是新的 table 每行有一个学生和一门课程。这告诉我们,一个学生在 class 中,没有重复任何数据。
"Junction tables"来自ER/ORMpresentations/methods/products,对关系模型不太了解。
在关系模型(以及原始 ER 信息建模)中,应用程序关系由 relations/tables 表示。每个 table 包含值的元组,这些值彼此处于那种关系中,即如此相关,即满足该关系,即参与该关系。
关系独立于任何特定情况表达为谓词,fill-in-the-(named-)空白语句。填充命名空白以在特定情况下给出谓词的真实陈述的行进入 table。我们选择足够的谓词(因此基础 tables)来描述每种情况。 many-to-1 和 many-to-many 应用程序关系都得到 tables.
之所以没有看到很多 many-to-many 关系以及关于参与者的列而不是关于他们参与关系的列,是因为这样的 table 更好地拆分分为关于参与者的和关于关系的。例如 many-to-many table 中关于参与者的列 1. 不能对不参与的实体说任何话 2. 每次参与时都对实体说同样的话。专注于首先识别独立实体类型然后它们之间的关系的信息建模技术往往会导致设计很少出现此类问题。您在两个 table 中看不到 many-to-many 关系的原因是这是多余的并且容易受到 table 不同意错误的影响。 collection-valued 列 (sequences/lists/arrays) 的问题是您不能使用通常的查询符号和实现来一般地查询它们的部分,因为 DBMS 看不到组织成 table 的部分。
见this recent answer or this one。