2.5 关系数据库设计
关系数据库是以关系模型为基本结构的数据库,在现实生活中所使用的数据库绝大多数是关系数据库。
在Access中创建数据库之前,先要设计好数据库的结构等内容。预先设计数据库是一个不可忽视的重要环节。有了合理的数据库设计,才能使创建的数据库成为存储信息、反映信息的结构化体系,从而有效、准确、及时地完成所需要的各项功能。
2.5.1 关系数据库的设计步骤
数据库的设计一般要经过需求分析、确定数据库中的表、确定表中的字段、确定主关键字、确定表间关系等步骤。下面以“教学管理系统”数据库的设计为例,介绍数据库设计的基本步骤。
1.需求分析
在本步骤范畴内,要做好充分的系统调查研究工作,采集原始数据资料,分析建立数据库的目的,明确系统的工作流程、数据流程以及用户的详细需求。
一个成功的数据库设计方案应将用户的需求融入其中。因此,需要先分析为什么要建立数据库以及所建数据库应完成的任务。在分析中,数据库设计者应与数据库的最终用户进行交流,了解现行工作的处理过程,共同讨论使用数据库应该解决的问题和应该完成的任务,并以此为基础,进一步讨论应保存哪些数据,怎样保存这些数据。另外,还应尽量收集与当前业务有关的各种数据资料,如报表、合同、档案、单据、计划等,所有这些材料是后面数据库设计工作的基础。
以教学管理数据库的设计为例,经过前期调研,可以发现某校的教学管理工作主要通过手工管理方式,随着信息时代的到来,教师及学生对教学管理信息的需求量越来越大,对信息处理的要求也越来越高,手工管理的弊端日益显现出来。手工管理方式处理数据的能力有限、工作效率低;不能及时为教师、学生以及教学管理者提供所需的信息;各种数据得不到充分利用,造成数据的极大浪费;更严重的是同一信息在不同位置可能存在不一致性。解决这些问题的最好办法是实现教学信息管理的自动化,用计算机处理代替手工处理。利用计算机中最为友好、最为方便的窗体界面,用键盘轻松地完成数据的录入、浏览、查询、统计、打印等操作。因此可以确定建立教学管理数据库的目的是为了解决教学信息的组织和管理问题,从而提高教学管理工作的效率和准确度。
在调查过程中,应该采集现实世界的原始资料,例如,采集到的“学生选课成绩表”内容如表2-6所示。
表2-6 学生选课成绩表
在第一阶段,还要根据用户的日常业务过程,确定数据库的基本功能需求,根据这些功能需求,设计相应的功能模块来满足用户需要。经过前期调查,教学管理的日常工作主要包括以下这些方面:
①教师业务档案的录入、修改、查询及打印。
②教师开课计划的录入、修改、查询。
③课程信息的录入、修改、查询。
④专业教学计划的录入、修改、查询。
⑤学生成绩的录入及修改、查询。
⑥学生成绩的统计分析与打印。
⑦学生选课信息的录入与查询。
⑧学生基本信息情况的录入、查询。
除了以上8个方面的工作外,教学管理活动中,还有一些辅助性工作,如教师课时统计等,均可作为用户需求加入进来。经过分析归纳,可将以上内容总结为教师管理、学生管理、选课及成绩管理3个方面,这3个方面的需求将来会演化为教学管理数据库的3个大的功能模块,在每个功能模块下,可以加以细化,得到一张模块结构图,如图2-16所示,这张模块结构图是后期数据库实现阶段的行动大纲。
2.确定数据库中的表
表是数据库的基础。确定表是数据库设计的关键,表设计的好坏直接影响数据库中其他对象的设计及使用。设计表是数据库设计比较困难的工作。一般情况下,设计者不要急于在Access中建立表,而应先在纸上进行设计。为了能够更合理地确定数据库中应包含的表,应该遵循以下两个基本原则:
图2-16 教学管理模块结构图
(1)每一个表只能包含一个主题信息
用通俗的话说,本原则要求“每个表只能有一个中心思想”。如果每个表只包含一个主题信息,那么就可以独立于其他主题来维护表。例如,将学生信息和教师信息分开,保存在不同的表中,这样当删除某个学生信息时不会影响教师信息。
(2)表中不要包含重复信息
如果每条信息只保存在一个表中,那么只需在一处进行更新,这样效率更高,而且可以避免信息不一致的情况出现。除了表之间起关联作用的字段外,同一个数据库中同一个字段不要同时出现在两个表中。
在教学管理数据库中,经过前期工作,获取了原始数据“学生选课成绩表”,如表2-6所示。经分析发现,该表包含了3个方面的信息。一是学生信息,如学号、姓名等;二是课程信息,如课程编号、课程名称、课程类别、学分等;三是学生成绩信息。如果将这些信息放在一个表中,必然出现大量的重复,不符合信息分类的原则。因此,根据教学管理数据库应完成的任务以及信息分类原则,应将教学管理数据分为教师、学生、成绩等几类,即将教学管理数据存放在多个不同类的表中。教学管理活动中基本表有教师表、学生表、课程表、选课成绩表、开课计划表、系部表。
除了可以参考以上两个原则确定数据库中的表以外,还可以采用数据库规范化处理的技术手段来帮助确定数据库中的表,该内容将在2.5.2小节加以介绍。
3.确定表中的字段
对于前面已经确定的每一个表,还要设计它的结构,即确定该表应该包含哪些字段。在Access数据库中,每个表所包含的信息都应该属于同一主题,因此,在确定所需要字段时,要注意每个字段包含的内容应该与表的主题有关,而且应包含相关主题所需的全部信息。注意,表中不要包含需要推导或计算的数据,一定要以最小逻辑部分作为字段来保存。在命名字段时,应符合Access字段命名规则:
(1)字段名长度为1~64个字符。
(2)字段名可以包含字母、汉字、数字、空格和其他字符。
(3)字段名不能包含“.”“!”“[]”“'”。
4.确定主关键字
为了使保存在不同表中的数据产生联系,Access数据库中的每个表必须有一个字段能唯一标识每条记录,这个字段称为主关键字,简称主键。主键可以是一个字段,也可以是一组字段。主键用来与其他表中的外键建立关联。为确保主键的唯一性,Access不允许在主键中存入重复值或空值。教学管理数据库中6个表均应建立各自的主键。如学生表的主键是“学号”,它唯一能标识每个学生的字段。学生表中“姓名”字段不能作为主键,因为现实生活中存在同名同姓学生的可能,如果将“姓名”字段作为主键,则同名同姓的两个学生则不能存入学生表中了。同理,教师表中“教师编号”字段作为主键,课程表中“课程编号”字段作为主键,开课计划表中“开课代码”字段作为主键。即选课成绩表中的主键比较特别,由“选课代码”与“学号”两个字段联合起来作为“联合主键”,表明同一个学生只能选某个开课计划一次。
5.确定表与表之间的关系
关系是指在两个表的公共字段之间所建立的联系。关系可以为一对一、一对多、多对多。关系的主要作用是为了实现多表数据查询,可称之为“牵一发而动全身”,例如通过学号,查询学生的基本情况和学生的学习成绩,这一要求是建立在“学生表”和“选课成绩表”的基础之上的,如果没有关系,则会出现张冠李戴的结果,即可能把李四的成绩放到张三的头上,造成数据匹配错误。
通过某表的主键字段与其他表中的外键来建立关系。通过所建立的关系告知Access如何以有意义的方法将相关信息重新结合到一起。
教学管理数据库中6个表之间的关系可以用图2-17来描述,如何建立表之间的关系,将在后面的章节加以介绍。
图2-17 教学管理数据库关系图
2.5.2 关系数据库的规范化处理
表是数据库最重要的对象,表的设计如果做得不好,就如同一栋高楼的地基没有打好一样。数据库的规范化处理是使表的设计更加科学正确的一种技术手段。利用这一手段,可以更加容易地找出前期设计的表中所隐含的问题。因此,使用规范化处理方法对表的设计进行补充修正,成为数据库设计中的必要工作。
数据库的规范化处理是指根据数据库范式理论,对所设计的表进行标准化处理。这里所说的范式可以理解为“规范化的样式”。常见的规范化处理的要求有3种:第一范式、第二范式、第三范式。在数据库设计过程中,如果所设计的表能够满足这3个范式要求,则这些表是符合数据库理论规范的,在此基础上建立的数据库应用设计才是科学合理的,否则会造成数据重复冗余、统一性不足、更新修改困难等问题,给后期的数据库实现工作带来较大的麻烦。
1.第一范式
第一范式的要求是表中的每个字段都是不可分的最小数据单位,即数据具有原子性。可用“不可分割”4个字来形容第一范式。第一范式要求将信息分成最小的逻辑部分。满足第一范式是关系数据库设计的基本前提。
假设已经设计的“学生表”的主要字段和部分记录如表2-7所示。可以很容易发现,联系电话中包含两方面的信息,即“固定电话号码”与“移动电话号码”,因此“联系电话”字段不是最小数据单位,违背了“不可分割”的原则。
表2-7 学生表1
如果某个表违反了第一范式,解决办法很简单,可以将不具有原子性的字段拆分成多个字段,使拆分出的新列都是最小的逻辑单位。例如,可将“联系电话”字段分解为“固定电话”和“移动电话”两个字段,如表2-8所示。
表2-8 学生表2
2.第二范式
在第一范式的基础之上,如果某个表存在主键,该表中的其他非主键字段均由主键决定,即非主键与主键之间具有绝对相关性,则称该表满足第二范式,可用“唯一确定”4个字来形容第二范式。第二范式可以理解为当确定某个主键值时,其他非主键字段的值也是确定的,不可能存在两种可能。例如,在表2-8中,假设“学号”字段是主键,当确定一个学号值“2014020121018”时,其他非主键字段(“姓名”“性别”“出生日期”“固定电话”“移动电话”)都有一个唯一确定的值(“卢伟峰”“男”“1996-9-2”“87613390”“13684536201”)与学号值“2014020121018”相对应,所以表2-8是符合第二范式的。第二范式的要求保证了“每一个表只能包含一个主题信息”的数据库设计原则。满足第二范式的表中的每个字段都是关于特定主题的信息。
有以下两种较常见的违背第二范式的情况:
(1)单主键的表
在某些单主键的表中,非主键字段不由主键唯一确定,这样的表是不标准的,它违背了第二范式,如表2-9所示的课程表。
表2-9 课程表
课程表的主键是“课程编号”字段,表明该表的主题是与课程有关的信息,除了主键“课程编号”外的所有字段均应该由主键唯一决定。可以分析得出:当确定了“课程编号”的值时,“课程名”“课程类别”“学分”“学时”字段的值都具有唯一确定的,可是“任课教师”字段的值却不是唯一的,因为同一门课程有可能由多名教师分别讲授,故“任课教师”列无法填写具体的值,由此可见,表2-9违背了第二范式。
如果某个单主键的表违反了第二范式,规范化的处理手段是将具体违反原则的字段删除,即删除不由主键唯一决定的字段,然后利用删除的字段开一个新的主题,建一张新表。在表2-9所示的课程表中,删除“任课教师”字段,将该字段与其他补充字段一起,组成一个新表“教师表”。
(2)联合主键的表
如果某个表的主键是联合主键,则该表符合第二范式的要求是:非主键由联合主键共同决定,而不能由联合主键之一单独决定。例如,“选课成绩表”的主键由“选课代码”和“学号”共同担任,属于联合主键的情况,如表2-10所示。
表2-10 选课成绩表
在表2-10中,“平时成绩”和“考试成绩”是由联合主键共同决定的,即当“选课代码”与“学号”同时确定时,“平时成绩”和“考试成绩”字段的值是确定的。而“课程名称”字段的值则不是由联合主键共同决定的,它由“选课代码”字段单独决定,“选课代码”字段只是联合主键之一,并不是“选课成绩表”的主键。因此“课程名称”字段违背了第二范式的第二种情况。
对这种情况的规范化处理方法是,删除由联合主键之一单独决定的字段“课程名称”,将“课程名称”与“选课代码”以及其他补充字段一起组成一个新的主题表“开课计划表”。
3.第三范式
第三范式是指在第二范式的基础上,非主键字段之间不存在递推传递关系。可用“不可递推”4个字来形容第三范式。理解第三范式的关键是把握一个前提条件“非主键字段之间”,主键和非主键之间的递推是“应该的”,这是第二范式的要求所在,而非主键字段之间的递推传递才是非法的。
一张表如果违背第三范式,该表中的数据时效性较差,同时会产生重复冗余数据及更新困难等问题。违背第三范式的情况有两种:
(1)计算传递
如果可以由一个或多个非主键字段计算出另外一个非主键字段的值,则称为第三范式的“计算传递”情况。假如设计的学生表如表2-11所示。
表2-11 学生表3
在该表中“出生日期”和“年龄”字段均是非主键字段,这两个字段之间存在“计算传递”的关系,具体是由“出生日期”计算出“年龄”。可以看出表2-11中的年龄是学生在2016年的年龄,如果到了2017年,“年龄”字段的值将会是错误的。同时,如果在学生表中同时存在“出生日期”和“年龄”字段,在数据输入时的工作量非常大。
解决“计算传递”问题的方法是直接删除可以被计算出的字段,这里删除“年龄”字段,当需要年龄信息时,可用查询的方法得到,具体操作请参考第4章。
(2)逻辑递推
如果多个非主键字段之间存在递推确定关系,即某个非主键字段可以唯一确定其他非主键字段的值,则称为第三范式的“逻辑递推”情况。
假设设计的“教师表”如表2-12所示。
表2-12 教师表
经过分析发现,两个非主键字段“系编号”和“系别名称”之间存在逻辑上的递推传递关系。当确定了某条记录的“系编号”字段的值时,该记录“系别名称”字段的值是唯一确定的,可见该表违背了第三范式的“逻辑递推”情况。明显看出,当表违背第三范式时,会出现大量重复数据,这里的重复数据主要出现在“系别名称”字段中,同一个系名会出现多次。
解决这种问题的规范化处理手段是:第一步,先删除“教师表”中可由别的非主键字段推导而出的字段,这里是“系别名称”字段,值得注意的是:不要删除“教师表”中的“系编号”字段,该字段会作为外键与后面第二步建立的新表建立关系。第二步,将“系别名称”与“系编号”重新组合一张新表,新表的主题显然与学校系部情况有关,可称作“系部表”,注意,在新表中可以额外补充一些与新主题有关的字段,如“负责人”“系部电话”等。注意:新表中的记录数据应保证唯一性。如果新表是由教师表复制而来的,则应该对新表中重复的记录实施合并。新产生的“系部表”如表2-13所示。
表2-13 系部表
经过前面所述的数据库设计步骤及数据规范处理,可以得到教学管理数据库中的6个主要的表及表中的主要字段(加下画线的是表的主键):
①学生表(学号,姓名,性别,出生日期,是否团员,专业,所在系部,毕业学校,固定电话,移动电话,照片,备注)。
②教师表(教师编号,姓名,性别,所在系部,入校时间,政治面貌,学历,职称,联系电话)。
③课程表(课程编号,课程名称,课程类别,学分,学时,所属系部)。
④开课计划表(选课代码,课程编号,课程班级,教师编号,时间,地点,年级,备注)。
⑤选课成绩表(选课代码,学号,平时成绩,考试成绩,总评成绩,成绩等级)。
⑥系部表(系部编号,系部名称,负责人,联系电话)
2.5.3 优化数据库设计
设计完成需要的表、字段和关系后,就应该检查数据库设计,并找出任何可能存在的不足之处。因为现在改变数据库设计,要比以后更改已经填满数据的表容易得多。
在Access中创建表并指定表之间的关系,然后在每个表中输入充足的示例数据,以验证数据库设计。也可以创建查询,并根据是否得到预期结果来验证数据库中的关系。创建窗体和报表的草稿,检查显示数据是否是所期望的。最后查找不需要的重复数据,并将其删除。若发现问题,则对数据库设计进行修改。
除此以外,还可以使用Access系统的分析工具,这些分析工具的作用是帮助用户改进数据库设计。Access 2010系统提供了两个分析工具:
1.表分析器
表分析器一次能分析一张表的设计,能够建议生成新的表结构和关系。在合理的情况下拆分原来的表到新表中,它的基本功能是找出表中可能存在的重复信息。
表分析器可以通过单击“数据库工具”选项卡|“分析”组|“分析表”按钮启动,具体操作步骤略。
2.性能分析器
性能分析器用于分析整个数据库(包括表、查询、窗体、报表等全部对象的检查),做出推荐和建议来改善数据库。
性能分析器可以通过单击“数据库工具”选项卡|“分析”组|“分析性能”按钮启动,具体操作步骤略。