数据库设计中如何处理多对多关系

eternity 2022-07-15
3331

当一个表中的多个记录与另一个表中的多个记录相关时,就会出现多对多关系。

当规范化数据库或向现有数据库添加表时,我们需要能够将表相互关联。

一个表可以通过三种方式与另一个表关联:

1. 一对一 :一个表中的一条记录与另一个表中的一条记录相关。

2. 一对多 :一个表中的一条记录与另一个表中的多条记录相关。

3. 多对多 :一个表中的多个记录与另一个表中的多个记录相关。
通过将一个表的主键作为外键添加到另一个表中,可以处理一对一关系或一个或多个关系。

然而,对于多对多的关系来说,这有点不同。让我们看一个例子。

多对多关系:示例

假设我们正在为一所大学创建一个数据库(这是我经常使用的一个例子)。我们捕捉了学生上课的细节,以及其他信息。规则是:

一个学生一次可以参加多个班(例如,他们每个学期可能有三到四节课)。

一个班可以有很多学生(例如,一个班可能有20个学生)。

这意味着一个学生有很多班级,一个班级有很多学生。

我们不能将一个表的主键添加到另一个表中,或者两者都添加,因为这只存储一个关系,而我们需要很多关系。

我们不能这样做:

这意味着我们有一列用于存储多个值,这对于维护和查询来说非常困难。

对于类ID值,我们也不能有太多的列,因为这会变得混乱,并对关系的数量造成限制。

多对多关系

那么我们如何捕捉到这一点呢?

我们使用一个称为 连接表或桥接表 的概念。

连接表是位于多对多关系的其他两个表之间的表。其目的是为这两个表的每个组合存储一条记录。这看起来可能需要做一些工作,但它很简单,并且提供了更好的数据结构。

为了为本例创建一个表,我们可以创建一个名为class_Enrollment的新表。

现在,表的名称很重要。用表格描述很好。我看到过将其他两个表的两个名称连接在一起(例如student_class)。我认为这是有效的,并可以完成工作,但有一个更具描述性的名称是有帮助的,因为它告诉你更多关于表是什么。

所以,我们有一个新的表,叫做class_enrollment。它存储两列:一列用于另一个表中的每个主键。

我们的表看起来像这样:
这将为每个学生和班级的组合存储单独的记录。我们的学生表和班级表保持不变:

以这种方式使用我们的数据结构可以更容易地在表之间添加更多的关系,并更新我们的学生和班级,而且不会影响他们之间的关系。

原文标题:How to Handle a Many-to-Many Relationship in Database Design