可以在数据库图表中的表之间创建关系,以显示一个表中的列与另一个表中的列是如何相链接的。
在一个关系型数据库中,利用关系可以避免多余的数据。例如,如果设计一个可以跟踪图书信息的数据库,您需要创建一个名为 titles
的表,它用来存储有关每本书的信息,例如书名、出版日期和出版社。您也可能保存有关出版社的信息,诸如出版社的电话、地址和邮政编码。如果您打算在 titles
表中保存所有这些信息,那么对于某出版社出版的每本书都会重复该出版社的电话号码。
更好的方法是将有关出版社的信息在单独的表,publishers
,中只保存一次。然后可以在 titles
表中放置一个引用出版社表中某项的指针。
为了确保您的数据同步,可以实施 titles
和 publishers
之间的参照完整性。参照完整性关系可以帮助确保一个表中的信息与另一个表中的信息相匹配。例如,titles
表中的每个书名必须与 publishers
表中的一个特定出版社相关。如果在数据库中没有一个出版社的信息,那么该出版社的书名也不能添加到这个数据库中。
为了更好地理解表关系,请参阅:
定义表关系
关系的确立需要通过匹配键列中的数据(通常是两表中同名的列)。在大多数情况下,该关系会将一个表中的主键(它为每行提供了唯一标识)与另一个表的外部键中的某项相匹配。例如,通过创建 titles
表中的 title_id
(主键)与 sales
表中的 title_id
列(外部键)之间的关系,则销售额就与售出的特定书名相关联了。
表之间有三种关系。所创建关系的类型取决于相关列是如何定义的。
一对多关系
一对多关系是最普通的一种关系。在这种关系中,A 表中的一行可以匹配 B 表中的多行,但是 B 表中的一行只能匹配 A 表中的一行。例如,publishers
和 titles
表之间具有一对多关系:每个出版社出版很多书,但是每本书名只能出自一个出版社。
只有当一个相关列是一个主键或具有唯一约束时,才能创建一对多关系。
多对多关系
在多对多关系中,A 表中的一行可以匹配 B 表中的多行,反之亦然。要创建这种关系,需要定义第三个表,称为结合表,它的主键由 A 表和 B 表的外部键组成。例如,authors
和 titles
表具有多对多关系,这是由于这些表都与 titleauthors
表具有一对多关系。titleauthors
表的主键是 au_id
列(authors
表的主键)和 title_id
列(titles
表的主键)的组合。
一对一关系
在一对一关系中,A 表中的一行最多只能匹配于 B 表中的一行,反之亦然。如果相关列都是主键或都具有唯一约束,则可以创建一对一关系。
这种关系并不常见,因为一般来说,按照这种方式相关的信息都在一个表中。可以利用一对一关系来:
- 分割具有多列的表。
- 由于安全原因而隔离表的一部分。
- 保存临时的数据,并且可以毫不费力地通过删除该表而删除这些数据。
- 保存只适用于主表的子集的信息。
实施参照完整性
参照完整性是一个规则系统,能确保相关表行之间关系的有效性,并且确保不会在无意之中删除或更改相关数据。
当实施参照完整性时,必须遵守以下规则:
- 如果在相关表的主键中没有某个值,则不能在相关表的外部键列中输入该值。但是,可以在外部键列中输入一个 null 值。例如,不能将一项工作分配给一位没有包含在
employee
表中的雇员,但是可以在employee
表的job_id
列中输入一个 null 值,表明一位雇员没有分配工作。
- 如果某行在相关表中存在相匹配的行,则不能从一个主键表中删除该行。例如,如果在
employee
表中表明某些雇员分配了某项工作,则不能在jobs
表中删除该工作所对应的行。
- 如果主键表的行具有相关行,则不能更改主键表中的某个键的值。例如,如果一位雇员分配了
jobs
表中的某项工作,则不能从employee
表中删除该雇员。
当符合下列所有条件时,才可以设置参照完整性:
- 主表中的匹配列是一个主键或者具有唯一约束。
- 相关列具有相同的数据类型和大小。
- 两个表属于相同的数据库。