1.2 数据库设计基础
设计合理的数据库可以让用户访问最新的、准确的信息。由于正确的设计对于实现使用数据库的目标非常重要,因此有必要投入时间学习良好设计的相关原则。这样才能设计出既能满足用户需求,又能轻松适应变化的数据库。
1.2.1 数据库基本设计流程
数据库设计是指在给定的数据库系统、操作系统和硬件环境下,如何表达用户的需求,并将其转换为有效的数据库结构,构成较好的数据库模式,这个过程称为数据库设计。数据库及其应用系统开发的全过程可分为两大阶段,一是数据库系统的分析与设计阶段;二是数据库系统的实施、运行与维护阶段。
数据库设计的任务是,根据一个单位的信息需求、处理需求和数据库的支撑环境,设计出数据模式(包括外模式、逻辑概念)、内模式以及典型的应用程序。其中,信息需求表示一个单位所需要的数据及其结构;处理需求表示一个单位需要经常进行的数据处理。前者表达了数据库的内容及结构的要求,也就是静态要求;后者表达了基于数据库的数据处理要求,也就是动态要求。
1.明确任务
进行数据库设计之前,必须了解与分析用户需求,包括数据与处理需求。在这一阶段用户需要完成的任务是明确设计任务的需求分析,包括收集资料、分析整理、形成数据流程图和数据字典、用户确认。其中数据流程图是指描述数据动态运动轨迹;数据字典是指定义数据本身的静态特征。
接下来是形成概念结构设计,这是整个设计的关键,是逻辑结构设计的先导。在概念设计阶段,设计人员仅从用户角度看待数据及其处理要求和约束,产生一个反映用户观点的概念模式,也称为“组织模式”。
概念模式能充分反映现实世界中实体间的联系,又是各种基本数据模型的共同基础,易于向关系模型转换。这样做的好处有如下两点。
数据库设计各阶段的任务相对单一化,设计复杂程度得到降低,便于组织管理。
概念模式不受特定数据库系统的限制,也独立于存储安排,因而比逻辑设计得到的模式更为稳定。
概念模式不含具体的数据库系统所附加的技术细节,更容易为用户所理解,因而能准确地反映用户的信息需求。
2.组织数据
组织数据是将概念模型转换成特定的数据库系统所支持的数据模型(层次型、网状型、关系型)。逻辑模型设计阶段的任务是将概念模型设计阶段得到的基本E-R图(实体-联系图)转换为与选用的数据库系统产品所支持的数据模型相符合的逻辑结构。
建立数据模型的主要目的是使数据库系统与它所描述的现实系统在整体上相符合,即在设计时使数据模型正确,有效地反映现实,在运行时保证数据库中的数据值真实地体现现实世界的状态。数据模型的建立一般分两个阶段完成。
第一个阶段:概念数据模型设计阶段。此阶段把现实世界中的信息抽象成信息世界中的实体和联系,结合有关数据库规范的理论,用一个概念数据模型将用户的数据需求明确地表达出来,为建立物理数据模型和设计应用程序打下坚实的基础。
第二个阶段:物理数据模型设计阶段。根据前一阶段建立起来的概念数据模型,并结合特定的数据库系统,按照一定的转换规则,把概念模型转换为依赖于数据库系统的物理数据模型。然后,再根据软硬件的运行环境,权衡各种利弊因素,确定一种高效的物理数据结构,使其既能节省存储空间,又能提高存取速度。有了这样一个物理数据模型,开发人员就可以在系统实现阶段建立数据库,并对数据库中的数据进行多种操作。
概念数据模型是一种面向问题的数据模型,它按照用户的观点对信息建模,主要用于数据库设计。下面对常见的名词术语进行简单介绍。
(1)实体
实体是现实世界中具有相同性质的同一类事物,可以是具体的对象,如客户、商品,也可以是抽象的概念和联系,如客户订购商品、商品出库等。实体是客观存在并且可以相互区别的事物,可以是具体的事物,也可以是抽象的事物。用来描述实体的特性称为实体的属性。一个实体是若干个属性的集合。具有相同属性的实体的集合称为实体集。一个实体应遵循两个基本规则:一是实体中的每个实例都必须可以唯一标识;二是实体之间是互斥的。
(2)属性
属性是指实体所具有的性质。通常一个实体由若干个属性刻画。例如,商品实体由商品编号、商品名称、规格、生产厂商、性能等属性组成。实体中每个实例都有用来唯一标识它的一个或多个属性,这些属性称为实体的标识符。
(3)域
域是某个或某些属性的取值范围。一个域可以被多个实体的属性共享使用。例如,定义一个电话号码域的数据类型为Char(8),它可以在许多实体中的电话属性中使用,一旦修改电话号码域的定义为Char(9),则使用该域的所有电话属性的定义都会随之改变。
(4)联系
联系是实体间有意义的连接,通常用实体间的一条连线表示。联系有两种方式:一种联系是强制的,即对于实体A的每一个实例,实体B中至少有一个实例与之关联;另一种联系是可选的,即对于实体A中的每一个实例,实体B中可以有也可以没有实例与之关联。在E-R图中,用“|”表示强制联系,用“o”表示可选联系。
按照实体中实例之间的数量对应关系,可以将联系分为一对一联系、一对多联系、多对多联系。
一对一联系(1:1)。实体集A中的一个实体至多与实体集B中的一个实体相对应,反之亦然,则称实体集A与实体集B为一对一的联系。记作1:1。如班级与班长、观众与座位、病人与床位。
一对多联系(1:n)。实体集A中的一个实体与实体集B中的多个实体相对应,反之,实体集B中的一个实体至多与实体集A中的一个实体对应。记作1:n。如班级与学生、公司与职员、省与市。
多对多(m:n)。实体集A中的一个实体与实体集B中的多个实体相对应,反之,实体集B中的一个实体与实体集A中的多个实体对应。记作m:n。如教师与学生、学生与课程、工厂与产品。
实际上,一对一联系是一对多联系的特例,而一对多联系又是多对多联系的特例。可以用图形表示两个实体型之间的这三类联系,如图1-4所示。
图1-4
由于一张入库单中可以包含多项入库商品,而每种商品可以出现在多张入库单中,因此,实体入库单内容中的属性不能完全标识实体入库单内容中的具体实例,必须结合具体的入库单实例,所以,实体入库单内容的标识符应该由实体入库单的标识符入库单编号和实体入库单内容中的属性入库商品共同组成,这样,实体入库单内容便依赖于实体入库单。
(5)业务规则
业务规则是业务活动中必须遵循的规则,是业务信息之间约束的表达式,反映了业务信息数据之间的一组完整性约束。业务规则有以下5种类型。
定义:这种规则可以定义系统中对象的特征。例如,向本公司采购商品的客户是企业或个人。
事实:这种规则可以描述系统的事实。例如,客户可以拥有一个或多个订单。
公式:这种规则可以描述系统中的计算公式。例如,金额=单价×数量。
要求:这种规则可以对系统中的功能进行详细说明。例如,客户在订购商品前,必须进行注册,经审核批准后才能订货。
校验:这种规则可以描述系统中数据之间的约束。例如,一个客户的订单总金额不能超过该客户的存款余额。
3.设计原型
数据库的物理结构主要是指数据库的存储记录格式、存储记录安排和存取方法。物理设计可分五步完成。
(1)存储记录结构设计
包括记录的组成,数据项的类型、长度,以及逻辑记录到存储记录的映射。
(2)确定数据存放位置
可以把经常同时被访问的数据组合在一起,“记录聚簇”技术能满足这个要求。
(3)存取方法的设计
存取路径分为主存取路径及辅存取路径,前者用于主键检索,后者用于辅助键检索。
(4)完整性和安全性考虑
设计者应在完整性、安全性、有效性和效率方面进行分析,做出权衡。
(5)程序设计
在逻辑数据库结构确定后,应用程序设计应当随之开始。物理数据独立性的目的是消除由于物理结构的改变而引起对应用程序的修改。当物理独立性未得到保证时,可能会引发对应用程序的修改。
4.构造程序
根据逻辑设计和物理设计的结果,在计算机系统上建立实际数据库结构,装入数据、测试和试运行的过程称为数据库的实施阶段。实施阶段主要有三项工作。
(1)建立实际数据库结构
对描述逻辑设计和物理设计结果的“程序源模式”,经数据库系统编译成目标模式并执行后,便建立了实际的数据库结构。
(2)装入试验数据,对应用程序进行调试
试验数据可以是实际数据,也可手动生成或用随机数发生器生成。应使测试数据尽可能覆盖现实世界的各种情况。
(3)装入实际数据,进入试运行状态
测量系统的性能指标是否符合设计目标。如果不符合,则返回到前面修改数据库的物理模型设计,甚至逻辑模型设计。
5.测试和完善
数据库系统正式运行,标志着数据库设计与应用开发工作的结束和维护阶段的开始。
运行维护阶段的主要任务有以下四个方面。
维护数据库的安全性与完整性。
检测并改善数据库运行性能。
根据用户要求对数据库现有功能进行扩充。
及时改正运行中发现的系统错误。
1.2.2 设计标准化数据库
良好的数据库设计应该是将信息划分到基于主题的表中,以减少冗余数据;向Access提供根据需要连接表中信息时所需的信息;可帮助支持和确保信息的准确性和完整性;可满足数据处理和报表需求。因此,数据库设计过程应特别注意以下两点。
一是信息的重复性(又称冗余数据),因为重复信息会浪费空间,会增加出错和不一致的可能性,因此要避免。
二是信息的正确性和完整性。如果数据库中包含不正确的信息,任何从数据库中提取信息的报表也将包含不正确的信息。因此,基于这些报表所做的任何决策都将提供错误信息。
Access数据库设计工作的内容大致包含以下几个方面。
确定数据库的用途:这是进行其他步骤的准备工作。
查找和组织所需的信息:收集可能希望在数据库中记录的各种信息,如产品名称和订单号。
将信息划分到表中:将信息项划分到主要的实体或主题中,如“产品”或“订单”。每个主题即构成一张表。
将信息项转换为列:确定在每张表中存储哪些信息。每项将成为一个字段,并作为列显示在表中。例如,“雇员”表中可能包含“姓氏”和“聘用日期”等字段。
指定主键:选择每张表的主键。主键是一个用于唯一标识每个行的列。例如,主键可以为“产品ID”或“订单ID”。
建立表关系:查看每张表,并确定各张表中的数据如何彼此关联。根据需要,将字段添加到表中或创建新表,以便清楚地表达这些关系。
优化设计:分析设计中是否存在错误;创建表并添加几条示例数据记录;确定是否可以从表中获得期望的结果;根据需要对设计进行调整。
应用数据规范化规则:以确定表的结构是否正确,根据需要对表进行调整。
1.2.3 数据库优化设计
确定所需的表、字段和关系后,就应创建表并使用示例数据来填充表,然后尝试通过创建查询、添加新记录等操作来使用这些信息。这些操作可帮助用户发现潜在的问题,例如,可能需要添加在设计阶段忘记插入的列,或者可能需要将一张表拆分为两张表,以消除重复。
在测试初始数据库时,可能会发现可改进之处。以下是要检查的事项。
是否忘记了任何列?如果是,该信息是否属于现有的表?如果是有关其他主题的信息,则可能需要创建另一张表,并为需要跟踪的每个信息项创建一列。如果无法通过其他列计算出信息,则可能需要为其创建一个新列。
是否存在可通过现有字段计算得到的不必要的列?如果某信息项可以从其他现有列计算得出(例如通过零售价计算出的折扣价),则进行计算会更好,并能够避免创建新列。
是否在某张表中重复输入相同的信息?如果是,则可能需要将这张表拆分为两张具有一对多关系的表。
是否存在具有很多字段,但记录数量有限,且各个记录中有很多空字段的表?如果有,则要考虑对该表进行重新设计,使其包含更少的字段和更多的记录。
表之间的所有关系是否已经由公共字段或第三张表加以表示?一对一和一对多关系要求使用公共列,而多对多关系要求使用第三张表来表示。