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