
1.3 数据库设计基础
数据库设计是数据库应用的核心,其任务是根据用户的需求设计出性能良好的数据库。在创建数据库之前,应先对数据库进行设计。合理地设计数据库结构是保障系统高效、准确完成任务的前提。
1.3.1 数据库设计步骤
设计数据库的关键,在于明确数据的存储方式与关联方式。在各种类型的数据库管理系统中,为了能更有效、更准确地为用户提供信息,往往需要将关于不同主题的数据存放在不同的表中,Access也是如此。
比如,一个学生成绩管理数据库,至少应该有3个表,第一个表用来存放学生基本情况,第二个表用来存放课程情况,第三个表用来存放学生选课及考试成绩情况(这个表建立了学生和课程的联系)。
因此,在设计数据库时,首先要把数据分解成不同相关内容的组合,再分别存放在不同的表中,然后告诉Access这些表相互之间是如何进行关联的。
说明
虽然可以使用一个表来同时存储学生数据和课程数据,但这样数据的冗余度太高,而且无论是对数据库的设计者来说还是对使用者来说,在数据库的创建和管理上都将非常麻烦。
设计数据库可按以下步骤进行。
1. 需求分析
设计数据库的第一个步骤是确定新建数据库所需要完成的任务和目的。需要明确用户希望从数据库中得到什么信息,需要解决什么问题,并说明需要生成什么样的报表,要充分与用户交流,并收集当前使用的各种记录数据的表格。
2. 确定需要的表
要根据需求和输出的信息确定要创建的表,每个表应该只包含一个主题的信息,而且各表不应该包含重复的信息。
3. 确定所需要的字段
一个表包含一个主题的信息,表中的各个字段都是该主题的组成部分。
4. 定义主关键字
为了唯一确定一条记录,需要为每个表定义一个主关键字。
5. 确定表之间的联系
将数据按不同主题保存在不同的表中,并在确定主关键字后,通过外部关键字将相关的数据建立起联系。
6. 优化设计
可以在各表中加入一些数据作为例子,然后对这些例子进行操作,看是否能得到希望的结果。如果发现设计不完备,可以对设计做一些调整。
在最初的设计中,不必担心出现错误或遗漏。若在数据库设计的初始阶段出现一些错误,在Access中是极易进行修改的。但一旦数据库中拥有了大量数据,并且被用到查询、报表、窗体,再进行修改就非常困难了。因此,在设计数据库之前,一定要做适量的测试和分析工作,排除其中错误和不合理的设计。
1.3.2 数据库设计原则
为了合理组织数据,应遵从以下基本设计原则。
(1)避免在表之间出现重复字段。
(2)表中的字段必须是原始数据和基本数据单元,尽量不要出现可计算出来的信息,如总成绩等。
(3)使用关键字和外部关键字实现数据完整性,保证数据库中数据的正确性和一致性。
(4)设计关系时,应遵从概念单一化的原则,一个关系尽量只表示一个事物。
1.3.3 数据库设计实例
下面以“学生成绩管理”应用系统为例,介绍数据库设计的一般过程。
1. 需求分析
首先考虑“为什么要建立DB及建立DB要完成的任务”。这是DB设计的第一步,也是DB设计的基础。然后考虑与DB的最终用户进行交流,了解现行工作的处理过程,讨论应保存及怎样保存要处理的数据,要尽量收集与当前处理有关的各种数据表格。
建立“学生成绩管理”数据库的目的是为了实现成绩信息管理,包括对学生、课程、教师、成绩等相关数据进行管理。
功能方面的要求是:在“学生成绩管理”数据库中,至少存放有关学生的情况、课程的情况、授课教师的情况、学生选课及考试成绩等方面的数据;要求可以从中查询每个学生各门课程的成绩、每门课程由哪位教师负责、哪些学生选修了哪些课、各门课程的考试成绩等信息;如有可能,应尽量用表格的形式来描述这些数据。
2. 确定数据库中的表
从需求分析中不一定能够找出生成这些表格结构的线索。因此,不要急于建立表,而应先进行设计。
为了能更合理地确定出DB应包含的表,应按下列原则对信息进行分类。
(1)每条信息只保存在一个表中。当数据发生变化的时候,只需在一处进行更新,更新效率高,同时也消除了包含不同信息的重复项的可能性。
(2)每个表应该只包含一个主题的信息,可以独立于其他主题来维护每个主题的信息。
因此,在“学生成绩管理”数据库中,应将教师、课程、学生的信息分开。这样当删除一个学生信息时,不会影响其他信息。
根据上述分析,可以初步拟定该数据库应包含4个数据表,即“教师”表、“学生”表、“课程”表、“成绩”表。
3. 确定表中的字段
表确定后,就要确定每张表应该包含哪些字段。在确定所需字段时,要注意遵循数据库的设计原则。
根据数据库的设计原则,可以为“学生成绩管理”数据库的各个表设置表结构,如表1-13~表1-16所示。
表1-13 “学生”表结构

表1-14 “课程”表结构

表1-15 “教师”表结构

表1-16 “成绩”表结构

4. 确定主键及建立表之间的关系
到目前为止,已经把不同主题的数据项分在不同的表中,且每个表都可以存储各自的数据。在Access中,各表之间不是完全孤立的,表与表之间可能相互联系。例如,在“学生成绩管理”数据库中,“学生”表和“成绩”表都有“学号”字段,通过这个字段,就可以建立起这两个表之间的关系。
(1)主键
表中的每一条记录都对应现实世界的一个实体,现实世界的每一个实体都是不同的,因此每条记录也是不同的。每个表都有一个能够唯一确定每条记录的字段或字段组合,这个字段或字段组合就是主关键字,简称主键。
例如,“学生”表的主键是“学号”,“课程”表的主键是“课程号”,“教师”表的主键是“教师号”,“成绩”表的主键是字段组合(学号,课程号)。
(2)建立表之间的关系
在“学生”表和“成绩”表之间通过“学号”建立两者之间的一对多联系;在“课程”表和“成绩”表之间通过“课程号”建立两者之间的一对多联系;在“教师”表和“成绩”表之间通过“教师号”建立两者之间的一对多联系。