多对多关系
一个
表
中的多个
记录
与另一个表中的多个记录相关联时即产生多对多关系。例如,客户和产品之间存在多对多关系:客户可以购买多个产品,产品也可以由多个客户购买。
关系数据库系统通常不允许您在两个表之间实施直接的多对多关系。请考虑跟踪发票的示例。如果多个发票具有相同编号,您的一位客户要求查询此发票号,您将无法知道他们要找的是哪个编号。这就是为每张发票指定唯一编号原因之一。
为避免这一问题,可以通过使用称为联接表的第三个表,将多对多关系拆分为两个
一对多关系
。联接表中的每个记录都包含一个匹配字段,该字段包含其联接的两个表的
主键
值。(在联接表中,这些匹配字段是
外键
。)当从联接表联接的任何一个表创建联接表的记录时,会为这些外键字段填充数据。
学生与班级之间的关系便是多对多关系的典型示例。一个学生可以注册多个班级,一个班级可以有多个学生。
以下示例有一个学生表,每个学生在其中都有一个记录;还有一个班级表,每个班级在其中都有一个记录。联接表“入学注册”创建了两个一对多关系,与两个表中的任何一个之间都存在一个这种关系。
主键“学生 ID”唯一标识学生表中的每个学生。主键“班级 ID”唯一标识班级表中的每个班级。入学注册表包含外键“学生 ID”和“班级 ID”。
要为多对多关系建立联接表:
1.
使用上例,创建一个名为“入学注册”的表。此表将成为联接表。
2.
在入学注册表中,创建一个“学生 ID 字段”和一个“班级 ID”字段。
联接表通常存储可能对任何其他表都无意义的字段。您可以向入学注册表添加字段,例如添加“日期”字段来跟踪学生何时开始加入某个班级;添加“费用”字段来跟踪学生参加某个班级所需的费用。
3.
在表中两个“学生 ID”字段之间创建关系。然后在表中两个“班级 ID” 字段之间创建关系。
这样设置后,如果某个学生注册了三个班级,该学生将在学生表中有一个记录,在注册表中有三个记录,因为学生注册的每个班级都有一个记录。
注释
•
联接表可以访问各个表的字段和数据,不必创建单独的关系。例如,要显示某位学生注册的所有班级的列表,可以根据学生表,在
布局
上创建
入口
。将入口设计为显示班级表的相关记录。然后从班级向入口添加适当的字段。当您浏览学生布局中的记录时,入口会显示特定学生注册的所有班级。
相关主题