在现实世界中,事物之间存在着联系,这种联系反映到数据库中就体现为表之间的联系。
例一、在图1中,学生表存储学生信息,系表存储系的信息。但学生表和系表之间是有联系的:每个学生都属于一个系,而一个系有多个学生。
(图1)
在数据库中,如何存储这种联系的信息呢?就要借助“主键-外键”关系实现。例一中,“系号“是系表的主键,学生表中“系号”就是外键,(主外键关系的前提是两张表中有相同的属性)。
主键-外键就是连接两个表的纽带。通过主键和外键的等值连接,就可以将不同表里的相关记录连接在一起,从而实现数据合并。利用主键-外键,可以查询每个学生所在系的信息,也可以查询某系所包含的学生信息。
当两个表通过“外键-主键”建立了联系之后,就要保持两表数据的一致性。例如在插入学生记录的同时,外键的值(系号)必须是系表中主键的有效值(必须有这个系),或者是空值(学生的系暂未确定);又如,在删除系表记录时,如果在学生表里还有该系学生的记录(该系还有学生在就读),那么系记录就不能删除。
例二、下面再分析一个员工信息管理系统的例子。该数据库中建有员工基本信息表(person)、部门编码表(deparment)和学历编码表(education),如图2所示:
(图2)
部门表保存了部门编号和部门名称,部门编号(DepID)是主键,部门编号在表中具有唯一性,这样就可以用部门编号来标识一条记录。
学历表保存了学历编号和学历名称,学历编号(EduID)是主键,学历编号在表中具有唯一性,这样就可以用学历编号来标识一条记录。
员工表存储员工的基本信息,包括工作证号、姓名、部门编号、学历编号等字段,工作证号(ID)是该表的主键。在该表中,Department列是一个外键,匹配部门表中的DepID主键;Education列也是一个外键,匹配学历表中的EduID主键。利用外键-主键的连接,就可以查询出张三的部门是经理室,学历是硕士。
利用“外键-主键”关系能简化数据库设计,减少数据冗余。