数据库设计(Database design)
目录 |
数据库设计是指对于一个给定的应用环境,构造最优的数据库模式,建立数据库及其应用系统,使之能够有效地存储数据,满足各种用户的应用需求。
数据库设计的任务是根据应用系统业务信息需求、处理需求及数据库的支持环境,设计出数据模式(包括外模式、逻辑模式及内模式)以及相应的应用程序。
数据库设计有两个最重要的目标,即满足应用功能需求和良好的数据库性能。满足应用功能需求,主要是指把用户当前应用需求以及可预知的将来应用需求所需要的数据及其联系能全部准确地存放在数据库中,在满足用户性能要求的前提下根据用户需嗄对数据进行增、删、改、查等操作。良好的数据库性能是指数据库应有良好的存储结构,良好的数据完整性、数据一致性以及安全性等。
根据设计任务,数据库设计一般包括数据库的结构设计和行为设计两方面内容.数据库结构设计是指系统整体逻辑模式与子模式的设计,是对数据的分析设计;数据咋的行为设计是指施加在数据库上的动态操作的设计.是对应用系统功能的设汁。在设汁的过程中,应该把对数据库的结构设计和行为设计两方面紧密结合起米,将这两方面的需求分析,抽象、设计及实现在各个阶段同时进行、互相参照、互相补充.不断完善。
数据库设计结果不是唯一的,针对同一个业务需求,不同的设计者可能没汁出不同的数据库模式.同时.由于在设计的过程中各种需求和制约因素的存存,数据库的设计往往很难达到非常满意的效果。经常是满足某方面的需要而降低另一方面的要求.因此需要设计者在各种因素中权衡取舍.从某种意义上说,数据库设计技术也是一门艺术。
1.直观设计法
直观设计法其实算不上什么方法,主要是指在数据库设计的初始阶段,数据库设计人员根据自己的经验和水平,运用一定的技巧进行数据库的设计,这种方法缺乏科学理论和工程方法的支持,很难保证设计的质量。
2.规范设计法
为改变设计人员直观、仅凭经验的做法,人们又开始运用软件工程的思想来设计数据库,提出了各种设计准则和规程,对数据库进行规范化设计。目前常用的规范设计法大多起源于“新奥尔良法”(1978年10月来自欧美国家的主要数据库专家在美国的新奥尔良市讨论数据库设计的问题,并提出了相应的工作规范,因此得名),将数据库设计分为:需求分析、概念设计、逻辑设计和物理设计4个阶段。
3.计算机辅助设计法
计算机辅助设计法是指在数据库设计的某些过程中模拟某一规范设计方法,通过人机交互实现部分设计,在这一过程中需要有相关知识和经验的人的支持。
4.自动化设计法
用来帮助设计数据库或数据库应用软件的工具称为自动化设计工具,例如:OracleDesigner、PowerDesigner等,它可以自动并加速完成设计数据库系统的任务。用自动化设计工具完成设计数据库系统任务的方法称为自动化设计法。
1.要善于识别与正确处理多对多的关系
若两个实体之间存在多对多的关系,则应消除这种关系。消除的办法是,在两者之间增加第三个实体。这样,原来一个多对多的关系,现在变为两个一对多的关系。要将原来两个实体的属性合理地分配到三个实体中去。这里的第三个实体,实质上是一个较复杂的关系,它对应一张基本表。一般来讲,数据库设计工具不能识别多对多的关系,但能处理多对多的关系。
2.索引(Index)的使用原则
创建索引一般有以下两个目的,即维护被索引列的唯一性和提供快速访问表中数据的策略。大型数据库有两种索引,即簇索引和非簇索引,一个没有簇索引的表是按堆结构存储数据,所有的数据均添加在表的尾部,而建立了簇索引的表,其数据在物理上会按照簇索引键的顺序存储。一个表只允许有一个簇索引,因此根据B树的结构可以认为添加任何一种索引均能提高按索引列查询的速度,但会降低插入、更新、删除操作的性能,尤其是当填充因子较大时。所以对索引较多的表进行频繁的插入、更新、删除操作时,建表和索引时应设置较小的填充因子,以便在各数据页中留下较多的自由空间,减少页分割及重新组织的工作。
3.数据的一致性和完整性
为了保证数据库的一致性和完整性,设计人员往往会设计过多的表间关联(Relation),尽可能地降低数据的冗余。表间关联是一种强制性措施,建立后,对父表(Parent Table)和子表(ChiLdTable)的插入、更新、删除操作均要占用系统的开销。另外,最好不要用Identify属性字段作为主键与子表关联。如果数据冗余低,数据的完整性容易得到保证,但增加了表间连接查询的操作。
为了提高系统的响应时间,合理的数据冗余也是必要的。使用规则(Rule)和约束(Check)来防止系统操作人员误输人造成的数据的错误是设计人员的另一种常用手段,但是,不必要的规则和约束也会占用系统的不必要开销。需要注意的是,约束对数据的有效性验证要比规则快。所有这些,设计人员在设计阶段应根据系统操作的类型、对数据访问的频度加以均衡考虑。
4.事务的陷阱
事务是能一次性完成的一组操作。这些操作是单个的操作,数据库能够保证这组操作要么全部都完成,要么一点都不做。正是大型数据库的这一特性,使得数据的完整性得到了极大的保证。
5.通俗地理解3个范式
通俗地理解3个范式,对于数据库设计大有好处。在数据库设计中,为了更好地应用3个范式,就必须通俗地理解3个范式。第一范式:1NF是对属性的原子性约束,要求属性具有原子性,不可再分解。第二范式:2NF是对记录的唯一性约束,要求记录有唯一标识,即实体的唯一性。第三范式:3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。
没有冗余的数据库设计可以做到。但是,没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就必须降低范式标准,适当保留冗余数据。具体做法是,在概念数据模型设计时遵守第三范式,降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字段,允许冗余。
6.正确认识数据冗余
主键与外键在多表中的重复出现,不属于数据冗余。这个概念必须清楚,事实上有许多人还不清楚。非键字段的重复出现,才是数据冗余。而且是一种低级冗余,即重复性的冗余。高级冗余不是字段的重复出现,而是字段的派生出现。
7.数据类型的选择
数据类型的合理选择对于数据库的性能和操作具有很大的影响,有关这方面的书籍也有不少的阐述,这里主要介绍几点经验。
Identify字段不要作为表的主键与其他表关联,这将会影响到该表的数据迁移。
Text和Image字段属指针型数据,主要用来存放二进制大型对象(BLOB)。这类数据的操作比其他数据类型要慢,因此要避开使用。但是在某些场合使用二进制对象字段来存储不定长度的海量数据又是一个不错的选择。
8.信息隐藏
信息隐藏是软件工程最重要的基本原则之一。简单地说就是信息的作用域越小越好,只有需要直接使用它的模块才能看到它。数据库的透明度越大越好。使数据库黑盒化,即透明度高的方法很多,除了设计上的局部化处理外,还可以利用DBMS的触发器、存储过程、函数等,把数据库中无法简化的复杂表关系封装到黑盒子中,隐藏起来,特别是放到服务器端,其优越性更是多方面的。
数据库设计的工作量大且比较复杂,是一项数据库工程,也是一项软件工程。数据库设计的很多阶段都可以对应于软件工程的阶段,软件工程的某些方法和工具同样也适合于数据库工程。但由于数据库设计是与用户的业务需求紧密相关的,因此,它还有很多自己的特点。
1.综合性
数据库设计涉及的范围很广,包含了计算机专业知识及业务系统的专业知识,同时它还要解决技术及非技术两方面的问题。
非技术问题包括组织机构的调整,经营方针的改变,管理体制的变更等。这些问题都不是设计人员所能解决的,但新的管理信息系统要求必须有与之相适应的新的组织机构、新的经营方针、新的管理体制,这就是一个较为尖锐的矛盾。另一方面,由于同时具备数据库和业务两方面知识的人很少,因此,数据库设计者一般都需要花费相当多的时间去熟悉应用业务系统知识,这一过程有时很麻烦,可能会使设计人员产生厌烦情绪,从而影响系统的最后成功。而且,由于承担部门和应用部门是一种委托雇佣关系,在客观上存在着一种对立的势态,当在某些问题上意见不一致时会使双方关系比较紧张。这在MIS(管理信息系统)中尤为突出。
2.结构设计与行为设计相分离
结构设计是指数据库的模式结构设计,包括概念结构、逻辑结构和存储结构;行为设计是指应用程序设计,包括功能组织、流程控制等方面的设计。在传统的软件工程中,比较注重处理过程的设计,不太注重数据结构的设计。在一般的应用程序设计中只要可能就尽量推迟数据结构的设计,这种方法对于数据库设计就不太适用。
数据库设计与传统的软件工程的做法正好相反。数据库设计的主要精力首先是放在数据结构的设计上,比如数据库的表结构、视图等。
1.确定创建数据库的目的
设计数据库和用户的需求息息相关。首先,要明确创建数据库的目的以及如何使用,用户希望从数据库得到什么信息,由此可以确定需要什么样的表和定义哪些字段;其次,要与用户进行交流,集体讨论需要数据库解决的问题,并描述需要数据库完成的各项功能。
2.确定数据库中需要的表
一个数据库可能是由若干个表组成的,所以确定表是数据库设计过程中最重要的环节。在设计表时,应该按以下设计原则对信息进行分类。
(1)每个表最好只包含关于一个主题的信息。
(2)同一个表中不允许出现同名字段。
(3)表间不应有重复信息。
(4)当一个表中的字段信息太多时,可根据使用频率将其分解为两个表。
3.确定字段
确定表的过程实际上就是定义字段的过程,字段是表的结构,记录是表的内容。所以确定字段是设计数据库不可缺少的环节。在定义每个表字段时,注意以下几点。
(1)主题相关。将所有原始字段信息分配至各个表中,使每个字段直接与表的主题相关。
(2)信息独立。字段信息不包含能够使用推导和计算得出的数据信息。
(3)方便维护。除主键字段外,两个不同表之间不能包含其他的相同字段。
4.确定主键
为了连接保存在不同表中的信息,使多表协同工作,在Access数据库的表中必须要确定主键。主键是表中能够唯一确定一个记录的字段或字段集合。如“学号”字段可以作为“学生”表和“学生其他情况”表中的主键,而“学号”和“课程代码”两个字段可以共同承担“成绩”表中的主键责任。
5.确定表之间的关系
因为已经将信息分配到各个表中,并且定义了主键字段,若想将保存在不同表中的相关信息重新组合到一起,必须定义表与表之间的关系,不同表之间确立了关系,才能进行相互访问。
6.确定各个表的使用数据
表的结构设计达到设计要求后,就可针对各个表分别准备要存放的数据了,即常说的表中记录内容。
7.确定数据的使用场所和管理手段
利用Access2003数据库提供的查询、报表、窗体等高级工具,根据实际使用要求,考虑在数据库中创建哪些查询,设计哪些打印报表,规划输入数据窗体与显示结果窗体的设计风格等具体应用。