- Access 2013数据库应用案例课堂
- 刘玉红
- 7747字
- 2025-02-20 09:00:37
4.5 建立表之间的关系
良好的数据库设计目标之一就是消除数据冗余(重复数据)。要实现这一目标,可将数据拆分为多个基于主题的表,以使每个记录只显示一次。然后,可通过在相关表中放置公共字段将拆分的信息组合到一起。而为了把不同表的数据组合在一起,必须建立表间的关系。
在Access 2013中,有3种类型的表关系。
1. 一对一关系
在一对一关系中,第一个表中的每条记录在第二个表中只有一个匹配记录,而第二个表中的每条记录在第一个表中也只有一个匹配记录。这两个表通常是基于同一个主题。这种关系并不常见,因为多数与此方式相关的信息都存储在一个表中。事实上,一对一关系通常都应该避免,因为它违反了规范化的规则。但在某些特殊情况下,可以使用一对一关系将一个表分成许多字段,或出于安全原因隔离表中的部分数据,或存储仅应用于主表中子集的信息。创建此类关系时,这两个表必须共享一个公共字段,并且该公共字段必须具有唯一索引。
2. 一对多关系
假设有一个订单跟踪数据库,其中包含“客户”表和“订单”表。客户可以签署任意数量的订单。因此,“客户”表和“订单”表之间的关系就是一对多关系。
要在数据库设计中表示一对多关系,需要设置表关系“一方”的主键,并将其作为额外公共字段添加到关系“多方”的表中。例如在订单跟踪数据库中,需要将一个字段(即“客户”表中的主键“客户ID”字段)添加到“订单”表中。然后,Access就可以使用“订单”表中的“客户ID”号来查找每个订单的正确客户。
3. 多对多关系
要表示多对多关系,用户需要创建第三个表,该表通常称为连接表,它将多对多关系划分为两个一对多关系。用户可以将这两个表的主键都插入到第三个表中,或者将第三个表的主键插入到这两个表中。由此可知,第三个表可以作为一对多关系中的“一方”,也可以作为“多方”。
例如,在一个订单跟踪数据库中,还包含“订单纳税状态”表,一个订单纳税状态可以对应多张订单表,它与“订单”表是一对多的关系,而“客户”表与“订单”表也是一对多的关系。因此我们可以得出以下结论:“订单纳税状态”表和“客户”表是多对多的关系,而“订单”表即是第三个表(即连接表),它作为一对多关系中的“多方”连接这两个表,创建表关系时,用户需要将这两个表的主键字段插入到“订单”表中,如图4-70所示。

图4-70 “订单纳税状态”表和“客户”表是多对多的关系
若在订单跟踪数据库中,还包含“客户访问”表,一个客户可以多次访问公司,则“客户”表与“客户访问”表是一对多的关系。我们可以得出以下结论:“订单”表和“客户访问”表是多对多的关系,而“客户”表即是第三个表,它作为一对多关系中的“一方”连接这两个表。创建表关系时,用户需要将“客户”表的主键字段插入到这两个表中,如图4-71所示。

图4-71 “订单”表和“客户访问”表是多对多的关系
4.5.1 表的索引
索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。索引好比是一本书的目录,通过它可以快速锁定需要的章节。创建索引可以大大提高系统的性能。当然其也有缺点,它增加了数据库的存储空间耗用,并且当对表中的数据进行添加、删除或修改的时候,索引也要动态地维护,这样就降低了数据的维护速度。
在创建索引的时候,应考虑如何选用合适的列创建索引。一般来说,用户可以参考以下几点创建索引。
(1)在经常需要搜索的列上创建索引,这样可以加快搜索的速度。
(2)在作为主键的列上创建索引,这样可以强制该列的唯一性和组织表中数据的排列结构。
(3)在经常用的链接的列上创建索引,这些列主要是一些外键,可以加快链接的速度。
(4)在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的。
(5)在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间。
索引分为单字段索引和多字段索引。如果用户经常同时依据两个或更多个字段进行搜索或排序,则可以为该字段组合创建索引。创建多字段索引时,需要设置字段的次序。如果在第一个字段中的记录具有重复值,则Access会接着依据为索引定义的第二个字段来进行排序,以此类推。而在一个多字段索引中最多可以包含10个字段。
下面通过两种方法来创建单字段索引。
1. 通过字段属性列表框创建单字段索引
具体操作步骤如下。
step 01 启动Access 2013,打开“应用”数据库,并进入“客户”表的【设计视图】界面。
step 02 选中“客户ID”字段,在字段属性列表框中单击【索引】选项右侧的下拉按钮,弹出索引列表,包括【无】、【有(有重复)】和【有(无重复)】3个选项,如图4-72所示。

图4-72 索引列表
提示
【无】选项表示不在此字段上创建索引(或删除现有索引);
【有(有重复)】选项表示在此字段上创建索引;
【有(无重复)】选项表示在此字段上创建唯一索引。
step 03 “客户ID”字段为主键,且不会重复,因此选择【有(无重复)】选项,即可为该字段创建索引,如图4-73所示。

图4-73 选择【有(无重复)】选项
step 04 使用同样的方法,设置“客户姓名”字段索引属性为“有(有重复)”。
2. 通过索引设计器对话框创建单字段索引
下面为“客户”表的“联系电话”字段创建索引。具体操作步骤如下。
step 01 启动Access 2013,打开“应用”数据库,并进入“客户”表的【设计视图】界面。
step 02 切换到【设计】选项卡,单击【显示/隐藏】组中的【索引】按钮,如图4-74所示。

图4-74 单击【显示/隐藏】组中的【索引】按钮
step 03 弹出索引设计器,用户可以看到,Access已经自动为主键“客户ID”字段创建了索引,如图4-75所示。

图4-75 索引设计器
step 04 在【索引名称】列中输入新建的索引名称“联系电话”,单击【字段名称】列右侧的下拉按钮,在弹出的下拉列表中选择“客户姓名”字段,在【排序次序】列中选择【升序】选项,即完成使用索引设计器创建索引的操作,如图4-76所示。

图4-76 创建“联系电话”索引
在索引设计器下方,有【主索引】、【唯一索引】和【忽略空值】3个选项。利用这3个选项,用户还可以设计其他的索引属性。例如,若【主索引】选择【是】选项,表示设计该字段为主键,若【唯一索引】选择【是】选项,表示此字段中的值是唯一的,若【忽略空值】选择【是】选项,表示该索引将排除值为空的记录。
提示
数据类型为OLE对象或附件的字段不能创建索引。另外,Access还会自动为主键创建唯一索引。
4.5.2 创建表关系
表关系有助于合并两个不同表中的数据。每个关系由两个表中的字段组成,包含相对应的数据。Access中有3种不同的表关系,与此相对应的,创建表关系也应分为3种,即建立一对一表关系、一对多表关系以及多对多表关系。
1. 创建一对一表关系
一对一表关系在实际中运用得较少,但在某些情况下,还是非常有用的。假如在数据库中,有“客户”表和“原始信息”表,在这两个表中都是某个客户相关的信息,而且客户名单是完全一致的,因此可以建立一对一表关系,将这两个表合二为一。具体操作步骤如下。
step 01 启动Access 2013,打开“应用”数据库。切换到【数据库工具】选项卡,单击【关系】组中的【关系】按钮,如图4-77所示。

图4-77 单击【数据库工具】选项卡的【关系】按钮
step 02 此时进入【关系】工作窗口,用户可在此窗口中创建表关系,如图4-78所示。

图4-78 【关系】工作窗口
step 03 切换到【设计】选项卡,单击【关系】组中的【显示表】按钮,如图4-79所示;或者在【关系】工作窗口中,右击,在弹出的快捷菜单中选择【显示表】命令,如图4-80所示。

图4-79 单击【关系】组中的【显示表】按钮

图4-80 选择【显示表】命令
step 04 打开【显示表】对话框。在此对话框中,用户可以看到,共有【表】、【查询】和【两者都有】3个选项卡,如图4-81所示。

图4-81 【显示表】对话框
step 05 在【表】选项卡中,系统显示出当前“应用”数据库下包含的所有表对象。选择“客户”表,单击【添加】按钮,可将该表添加到【关系】工作窗口中,如图4-82所示。

图4-82 选择“客户”表
step 06 使用同样的方法,添加“原始信息”表到【关系】工作窗口中。操作完成后,单击【关闭】按钮,此时【关系】工作窗口中将出现这两个表的相关信息,如图4-83所示。

图4-83 【关系】工作窗口
提示
用户也可以在导航窗格中选中这两个表,按住左键不放,将其拖动到【关系】工作窗口中。
step 07 选中“客户”表的“客户ID”字段,按住左键不放将其拖到“原始信息”表的“客户ID”字段处,松开鼠标后,弹出【编辑关系】对话框。在【关系类型】栏中可看到,当前的类型为“一对一”,如图4-84所示。

图4-84 【编辑关系】对话框
step 08 单击【创建】按钮,返回到工作窗口中,可以看到两个表的“客户ID”字段之间出现一条关系连接线,如图4-85所示。

图4-85 关系连接线
step 09 创建完成后,单击【保存】按钮,即可保存创建的表关系。在左侧导航窗格中,双击打开“客户”表,可以看到,每条记录的行首出现了标记。单击该标记,Access以子表的形式显示出每个客户的原始信息,如图4-86所示。

图4-86 “客户”表的子表
step 10 同理,在左侧导航窗格中,双击打开“原始信息”表,可以看到,每条记录的行首也出现了标记。单击该标记,Access以子表的形式显示出每个客户的详细信息。至此,即完成创建一对一表关系的操作,如图4-87所示。

图4-87 “原始信息”表的子表
2. 创建一对多表关系
一对多表关系在数据库中最为常见。在关系“一方”的字段必须具有唯一索引,该字段通常为主键,该表称为主表。关系“多方”的字段不应具有唯一索引,它可以有索引,但必须允许重复,该字段通常称为表关系的“外键”。当一个字段具有唯一索引而其他字段不具有唯一索引时,Access将创建一对多关系。
假设在订单跟踪数据库中,有“客户”表和“订单”表,一个客户可以有多个订单,而一个订单只能对应一个客户,因此,在一对多的表关系中,关系“一方”应为“客户”表,而关系“多方”应为“订单”表。下面就以这两个表为例,详细介绍如何创建一对多表关系。具体操作步骤如下。
step 01 打开“应用”数据库,进入“客户”表和“订单”表的【数据表视图】界面。
step 02 切换到【表】选项卡,单击【关系】组中的【关系】按钮,如图4-88所示,可进入【关系】工作窗口。

图4-88 单击【表】选项卡中的【关系】按钮
提示
若进入的是“客户”表的【设计视图】界面,切换到【设计】选项卡,单击【关系】组中的【关系】按钮,同样可以进入【关系】工作窗口,如图4-89所示。

图4-89 单击【设计】选项卡中的【关系】按钮
step 03 在【关系】工作窗口中,用户可看到之前创建的表关系,如图4-90所示。

图4-90 创建的表关系
step 04 为便于演示,选中“原始信息”表,切换到【设计】选项卡,单击【关系】组中的【隐藏表】按钮,将该表隐藏起来,如图4-91所示。

图4-91 单击【隐藏表】按钮
step 05 隐藏以后,单击【关系】组中的【显示表】按钮,弹出【显示表】对话框。选中“订单”表,单击【添加】按钮,如图4-92所示。

图4-92 【显示表】对话框
step 06 添加完成后,单击【关闭】按钮,返回到【关系】工作窗口。用户可以看到“订单”表已添加成功,如图4-93所示。

图4-93 添加“订单”表
step 07 选中“客户”表的“客户ID”字段,按住鼠标左键不放将其拖动到“订单”表的“客户ID”字段处,松开鼠标后,弹出【编辑关系】对话框。在【关系类型】栏中可看到,当前的类型为【一对多】,如图4-94所示。

图4-94 【编辑关系】对话框
step 08 单击【创建】按钮,返回到【关系】工作窗口中,可以看到这两个表的“客户ID”字段之间出现一条关系连接线,如图4-95所示。

图4-95 关系连接线
step 09 创建完成后,单击【保存】按钮,保存创建的表关系。切换到“客户”表的【数据表视图】界面,可以看到,每条记录的行首出现了标记。单击该标记,Access以子表的形式显示出每个客户的订单信息。至此,即完成创建一对多表关系的操作,如图4-96所示。

图4-96 “客户”表的子表
提示
在一对多表关系中,只有关系“一方”的数据表才能查看子表的信息。关系“多方”的数据表是无法出现子表的。
3. 创建多对多表关系
用户既可以如图4-70和图4-71所示来表示多对多表关系,也可以直接创建多对多表关系。下面为“客户访问”表和“订单”表创建多对多表关系。具体操作步骤如下。
step 01 打开“应用”数据库,切换到【数据库工具】选项卡,单击【关系】组中的【关系】按钮,进入【关系】工作窗口。用户在其中可以查看当前数据库中已存在的表关系,如图4-97所示。

图4-97 “应用”数据库的表关系
step 02 切换到【设计】选项卡,单击【关系】组中的【显示表】按钮,弹出【显示表】对话框,将“客户访问”表添加到【关系】工作窗口中,如图4-98所示。

图4-98 添加“客户访问”表
step 03 选中“客户访问”表的“客户ID”字段,按住鼠标左键不放将其拖动到“订单”表的“客户ID”字段处,松开鼠标后,弹出【编辑关系】对话框,如图4-99所示。

图4-99 【编辑关系】对话框
step 04 单击【创建】按钮,返回到【关系】工作窗口中,可以看到这两个表的“客户ID”字段之间出现一条关系连接线,如图4-100所示。

图4-100 关系连接线
step 05 创建完成后,单击【保存】按钮,即可保存创建的表关系。至此,就完成了创建多对多表关系的操作。
请注意,在数据库实际应用中,用户通常用两个一对多关系来表示多对多关系,而不是直接创建两个表的多对多关系。
4.5.3 查看与编辑表关系
表关系创建完成后,用户可对表关系进行查看、编辑、隐藏或删除等操作。这一系列的操作都可以通过【设计】选项卡中的【工具】和【关系】组来实现,如图4-101所示。

图4-101 【工具】组和【关系】组
具体操作步骤如下。
step 01 打开“应用”数据库,进入【关系】工作窗口。
step 02 单击“客户”表和“原始信息”表之间的关系连接线,此时连接线显示得较粗,表示其为选中状态,如图4-102所示。

图4-102 选中关系连接线
step 03 切换到【设计】选项卡,单击【工具】组中的【编辑关系】按钮,弹出【编辑关系】对话框。在该对话框中,可以设置实施参照完整性、连接类型和新建表关系等,如图4-103所示。

图4-103 【编辑关系】对话框
提示
双击关系连接线,或者右击,在弹出的快捷菜单中选择【编辑关系】命令,同样可以打开【编辑关系】对话框。
step 04 单击【工具】组中的【清除布局】按钮,弹出Microsoft Access对话框,提示是否将关系窗口的布局清除。若单击【是】按钮,将会删除当前创建的所有表关系,如图4-104所示。

图4-104 Microsoft Access对话框
step 05 单击【工具】组中的【关系报告】选项,Access将自动生成表关系的报表,并进入打印预览模式,用户可打印该报表,如图4-105所示。

图4-105 表关系的报表
step 06 选中“订单”表,单击【关系】组中的【隐藏表】按钮,可在【关系】工作窗口中隐藏该表,如图4-106所示。

图4-106 隐藏“订单”表
step 07 选中“客户”表,单击【关系】组中的【直接关系】按钮,可以显示并查看所有与该表有直接关系的表。即使这些表被隐藏,此时也会显示出来。例如这里显示出隐藏的“订单”表,如图4-107所示。

图4-107 显示直接关系
step 08 单击【关系】组中的【所有关系】按钮,用户可以查看“应用”数据库中所有的表关系,如图4-108所示。

图4-108 “应用”数据库中所有的表关系
step 09 单击【关系】组中的【关闭】按钮,退出【关系】工作窗口,如果窗口中创建的表关系没有保存,则会弹出对话框,提示是否保存,如图4-109所示。

图4-109 提示对话框
step 10 若要删除“客户”表和“订单”表的表关系,在【关系】工作窗口中删除关系连接线即可。首先选中这两个表的关系连接线(选中状态下显示得较粗),按Delete键,弹出Microsoft Access对话框,单击【是】按钮,即可删除表关系,如图4-110所示。或者选中关系连接线后,右击,在弹出的快捷菜单中选择【删除】命令,也可删除表关系,如图4-111所示。

图4-110 Microsoft Access对话框

图4-111 选择【删除】命令
提示
删除表关系时,如果表关系中涉及的任何一个表处于打开状态,或正在被其他程序使用,则用户无法删除该表关系。
4.5.4 实施参照完整性
Access允许数据库实施参照完整性规则,从而保证数据不会丢失或遭到破坏。例如,“客户”表和“订单”表之间存在一对多关系,若想要删除一个客户,如果要删除的客户在“订单”表中具有订单,则删除该客户记录后,这些订单将成为“孤立记录”。这些订单仍然包含客户ID,但该ID不再有效,因为它所参照的记录已不存在。由此而知,使用参照完整性规则的目的就是防止出现孤立记录并保持参照同步。
实施参照完整性的方法是为表关系启用参照完整性。实施后,Access将拒绝违反表关系参照完整性的任何操作。下面在“应用”数据库中对表关系实施参照完整性。具体操作步骤如下。
step 01 打开“应用”数据库,切换到【数据库工具】选项卡,单击【关系】组中的【关系】按钮,如图4-112所示,进入【关系】工作窗口。

图4-112 单击【关系】组中的【关系】按钮
step 02 切换到【设计】选项卡,单击【关系】组中的【所有关系】按钮,显示出“应用”数据库的所有表关系,如图4-113所示。

图4-113 “应用”数据库中的所有表关系
step 03 双击“客户”表和“客户访问”表之间的关系连接线,弹出【编辑关系】对话框,选中【实施参照完整性】复选框,单击【确定】按钮,如图4-114所示。

图4-114 【编辑关系】对话框
step 04 返回到【关系】工作窗口,可以看到,这两个表的关系连接线上分别以和
符号标记出一对多的表关系,如图4-115所示。

图4-115 关系连接线上的符号
当用户对数据库实施参照完整性以后,系统将会严格限制主表和中间表的记录修改和更新操作。限制规则如下。
●如果在主表的主键字段中不存在某条记录,则不能在相关表的外键字段中输入该记录,否则会创建孤立记录。即不允许在“多方”的字段中输入“一方”主键中不存在的值。
●当“多方”的表中含有和主表相匹配的记录时,不能从主表中删除这条记录。例如,如果在“订单”表中有某客户的订单,则不能从“客户”表中删除该客户的记录。但是如果在【编辑关系】对话框中选中【级联删除相关记录】复选框,则用户在进行删除操作时,可以删除“客户”表中某个客户的记录,但是系统会同时删除“订单”表中该客户所有的订单记录,从而保证数据的完整性。
●当“多方”的表中含有和主表相匹配的记录时,不可从主表中改变相应的主键值。例如,如果在“订单”表中有某客户的订单,则不能从“客户”表中改变该客户的客户ID值。但是如果在【编辑关系】对话框中选中【级联更新相关字段】复选框,则允许完成此操作。
4.5.5 设置级联选项
用户有时可能需要更新或删除关系一方的值,那么关系另外一方的值会发生什么变化呢?对于数据库完整性而言,用户希望当关系一方的值更新或删除时,系统能自动更新或删除所有受影响的值。这样,数据库可以进行完整更新,有效地防止整个数据库呈现不一致的状态。
Access提供的【级联更新相关字段】选项和【级联删除相关记录】选项正好可以解决此问题。如果实施了参照完整性并选中【级联更新相关字段】复选框,当更新主键时,Access将自动更新参照主键的所有字段。同样地,如果选中【级联删除相关记录】复选框,当删除包含主键的记录时,Access会自动删除参照该主键的所有记录。
下面在“应用”数据库中对所有表关系实施参照完整性并设置级联选项。具体操作步骤如下。
step 01 打开“应用”数据库,切换到【数据库工具】选项卡,单击【关系】组中的【关系】按钮,进入【关系】工作窗口。
step 02 双击“客户”表和“订单”表之间的关系连接线,弹出【编辑关系】对话框,选中【实施参照完整性】复选框。此时用户可以看到,【级联更新相关字段】和【级联删除相关记录】两个复选框均变为可选状态,选中这两个复选框,单击【确定】按钮,如图4-116所示。

图4-116 【编辑关系】对话框
step 03 使用同样的方法,为其他表设置级联选项。这样就对数据库中的表都设置了参照完整性和级联选项,如图4-117所示。

图4-117 设置参照完整性和级联选项
提示
如果主键是自动编号字段,则选中【级联更新相关字段】复选框时将不起作用,因为系统无法更改自动编号字段中的值。