
4.2 表关系
通过表关系将有关系的表连接起来,使不同表之间的数据实现互动
优秀数据库的一大特点是可以大幅度地消减数据冗余,在Access数据库中实现消减数据冗余最为常见的做法是将数据拆分为基于不同主键的表,然后在相关表中防止公共字段来实现每个字段值(主键除外)只出现一次的目的。
在这个过程中,关系扮演着十分重要的角色。因此,要了解如何设计出优秀的Access数据库,了解一些关系的知识是必不可少的。
4.2.1 主键和外键——关系实现的方法
关系是通过主键和外键实现的,其中,主键是表的主索引,是用于保证表中记录唯一性和数据库实体完整性的最为重要的手段。外键是表的一个字段,它既可以是表的普通字段,也可以是表的主键或者主键的一部分,但是外键一定是其他的表的主键。
例如在“员工信息”表中,“员工编号”字段是主键,而在“工资管理”表中,“员工编号”既是主键也是外键。通过“员工编号”字段,就可以实现“员工信息”表和“工资管理”表之间的关联。
4.2.2 关系的类型
两个表之间的关系是建立在主键和外键的基础之上的,主键所在的表称为主表,使用外键作为主键的表称为子表。
表之间的关系有3种,分别为一对一、一对多和多对多的关系。
1.一对一关系
一对一关系是指主表中的一条记录只与子表中的一条记录对应。如图4-8所示,为员工管理数据库中,员工信息表和员工工资表之间的关系,由于一个员工对应一条工资记录,所以员工信息表和员工工资表是一对一关系。

图4-8 一对一关系
2.一对多关系
一对多关系是指主表中的一条记录与子表中的多条记录对应。如图4-9所示,为罗斯文数据库中,客户表与订单表之间的关系,由于一个客户可能对应有多个订单,但是每个订单都只能有一个客户,所以这两个表之间的关系是一对多关系。

图4-9 一对多关系
3.多对多关系
多对多关系可以看做两个表相互之间的一对多的关系。比如学生和课程之间的关系,一门课程可以有多个学生选修,一个学生也可以选修多门课程,所以学生和课程之间的关系为多对多的关系。
在Access中处理多对多关系的时候,一般都不直接在两个表之间创建关系,而是通过中间表将多对多的关系转换为两个一对多的关系,如图4-10所示,产品及其库存事务的关系就是一个多对多的关系,它们之间的多对多关系可以通过一个中间表转换为两个一对多关系。

图4-10 使用中间表转换多对多关系为一对多关系
4.2.3 创建表之间的关系
在创建表的过程中,有一些操作会创建表之间的关系,比如创建“查阅向导”数据类型的字段时,引用其他表中的字段值,就会创建这两个表之间的关系,如图4-11所示。
如果需要手动创建表之间的关系,可以通过“数据库工具”选项卡中的“关系”按钮和“关系工具设计”选项卡进行。下面以在“学生管理系统”数据库中创建表之间的关系为例,讲解创建关系的方法。

图4-11 查阅向导提示对话框
操作演练:创建表之间的关系
\素材\第4章\学生管理系统.accdb
\效果\第4章\学生管理系统.accdb
STEP 01 打开“关系”窗口
打开素材文件后,单击“数据库工具”选项卡中的“关系”按钮。

STEP 02 单击“显示表”按钮
单击“关系工具设计”选项卡中的“显示表”按钮,打开“显示表”对话框。

STEP 03 添加所有表到“关系”窗口
在打开的窗口中选择所有的表,然后单击“添加”按钮。

STEP 04 单击“编辑关系”按钮
单击“关系工具设计”选项卡中的“编辑关系”按钮,打开“编辑关系”对话框。

STEP 05 新建关系
在打开的对话框中单击“新建”按钮,打开“新建”对话框。

STEP 06 设置两个表的关系字段
在打开的对话框中设置关系表的名称和关系字段,然后单击“确定”按钮。

STEP 07 创建关系
在“编辑关系”对话框中单击“创建”按钮,创建新建的关系。

STEP 08 查看创建关系效果
返回“关系”窗口,查看创建关系的效果。两个表之间用一根线表示。

STEP 09 创建其余关系
重复第4~8步,创建其他的表之间的关系,最后可以得到所有表之间的关系。

读者提问
Q+A
Q:如何删除两个表之间的关系?
A:如果两个表之间的关系创建不当,或者需要更改某些字段,就可能需要删除这两个表之间的关系。删除关系十分简单,在“关系”窗口中选择两个表之间的关系线,按【Delete】键,就可以将这些关系删除。
4.2.4 实施关系参照完整性
实施关系参照完整性,可以在修改某一个表中的记录时,同步修改相关表中的相应记录,同时避免修改主键字段时破坏程序的可能。
实施关系参照完整性的操作是在“编辑关系”对话框中进行的,选中“实施参照完整性”复选框之后,然后选中“级联更新相关字段”或“级联删除相关记录”复选框即可,如图4-12所示。
♦ 级联更新相关字段:选择这个选项表示修改相关字段时,其他表中的这个字段也会相应改变。如果主表中的主键是几个表的相关字段,就需要在所有相关关系中选中该选项,否则不能够正常工作。
♦ 级联删除相关记录:在删除主表中的记录时如果希望删除子表中的所有相关记录,则需要选中该选项。

图4-12 实施参照完整性