反规范化设计在园林技术专业教学资源库系统中的运用
2014-12-25洪炜
洪炜
摘要:数据库的设计对软件系统的运行起着非常重要的作用,合理的关系模式设计能够提高数据库的运行性能。在数据库设计中规范化设计理论是设计者常常遵循的原则,但是一味的追求关系模式范式的级别,满足了形式上的规范化往往会在实际使用中牺牲了运行效率,而适当的采用关系模式设计的反规范化手段,采用增加冗余列、增加派生列、重新组表和分割表等反规范化技术,合理处理好数据库的完整性,能够让数据库的设计更加合理,运行效率更高,更能满足实际应用的需要。该文以园林专业教学资源库数据库为例,阐述了反规范化技术在设计中的应用。
关键词:范式;反规范化;数据库设计;教学资源库系统
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2014)33-7957-03
数据库的设计在B/S结构系统开发中占着举足轻重的地位,数据库设计直接关系到程序运行的效率和软件系统运行的效果。数据库原理是每一位软件设计人员必须具备的专业基础知识,在数据库原理中较强调数据库设计的关系规范化理论,但是在实际应用中,因为需求、实用和性能等方面的原因,数据库设计的反规范化常常应用,会在遵守范式的基础上适当使用反规范化的数据库设计。
1 关系数据库设计的范式理论
范式是符合某一种级别的关系模式的集合,设计数据库需要遵循一定的设计规则,在关系数据库的设计中,这种规则就是范式,满足不同程度要求的关系模式分别属于不同的范式。范式有很多种,关系数据库的规范化设计理论把关系应满足的规范要求分为几级, 第一范式((1NF))是关系模式应满足的最低要求,满足了第一范式的关系才能称为规范化的关系,第二范式(2NF)建立在第一范式的基础上,第三范式(3NF)建立在第二范式的基础上, 还有BCNF,4NF,5NF[1],范式级别越高逐步消除了关系中因数据依赖而引起的各种问题,关系的规范化程度不断得到提高,3NF已经能在很大程度上消除了由函数依赖引起的数据存储异常的问题,如果关系模式满足了BCNF就能完成消除因函数依赖关系而引起的存储异常和数据冗余问题,在数据库设计中3NF 、BCNF应用得最广泛。关系模式的规范化就是将一个满足第一级范式要求的关系,通过关系模式的分解,把一个关系模式转换为若干个满足高一级范式要求的关系模式,逐步消除因为数据依赖带来的各种问题。
2 关系模式的范化设计
关系模式的拆解是为了达到更高级别的规范化程度,但是有的时候盲目的最求范式的要求,往往会破坏一些必不可少的函数依赖,反而会在使用过程中不方便,这时候就要考虑关系模式的反规范化设计,放弃数据冗余问题的解决。反规范能够减少数据库操作过程中的连接操作、减少索引和外码数量,提高数据查询操作的速度,也可以减少关系表的数量,但是不合理的反规范化会带来数据的完整性问题,会降低数据修改的速度。因此对关系模式反规范化设计时要平衡利弊,仔细分析数据库设计的合理性和实际性能需求。
2.1 第一范式(1NF)
在关系模式R中,如果每个属性都是不可再分的原子项,则关系模式R满足第一范式[2]。例如:在园林专业教学资源库,课件制作人信息关系中有制作人的联系电话,一个人的联系电话也可能不止一个电话号码,规范化的过程可以把制作人联系电话分为办公室电话和手机号码,调整后新的关系满足了1NF,1NF是关系模式的最低要求,也是必须要满足的要求。
2.2 第二范式(2NF)
如果关系模式R是1NF且其中的所有非主属性都完全函数依赖于关键词, 则称关系R是属于第二范式的[2]。园林专业教学资源库中学生通过选修资源库中的课程后,经过网络学习,学满课时后可以进行课程考核,有这样一个选课关系:课件学习(学号、课件代号、成绩、学分)关系的主码是学号和课件代号,学分与非主码课程号存在函数依赖关系。这个关系在实际使用中就会存在数据冗余、修改异常、插入异常和删除异常的问题,如果一门课程有多名学生选修,该课程的学分就会在表中多次被记录,导致存储数据冗余;如果某一门课程的学分调整了,表中该课程的所有学分要被修改,修改遗漏了一条记录就会出现同一门课程的学分不一致的情况;没有被学生选修的课程或新开的课程就无法记录课程的学分;删除学生选课信息的同时也会把课程的学分删除,课程的学分信息不能正常保存。导致这些问题的原因是学分没有完全依赖于主码(学号、课程号),把学分从选课表中分离出来,放到课程表中就可以解决这些问题,可以通过选课关系中外码课程号联系,在需要使用的时候连接操作获取需要的信息。
2.3 第三范式(3NF)
如果关系模式R是2NF且其中的所有非主属性都不传递依赖于码,则称关系R是属于第三范式的[2]。学生关系(学号、姓名、班级代号、班级名称),该关系的主码是学号,能够满足2NF的要求,但是由于班级名称与学号存在传递函数依赖关系,不能满足3NF的要求。这个关系存在数据冗余、修改异常、插入异常和删除异常的问题,解决的方法是将班级名称从学生关系中分离,拆分成两个关系:学生(学号、姓名、班级代号)和班级(班级代号、班级名称),两个关系通过学生表中班级代号作为外码进行关联。
2.4 BCNF
如果关系模式R的所有属性(包括主属性和非主属性)都不传递依赖于R的任何候选关键词,那么称关系R是属于BCNF的。或者说关系模式R中,如果每个决定因素都包含关键词(而不是被关键词所包含),则R是BCNF[2]。如果学生关系中记录有学生的省份证号码,仍然定义学生学号是主码,那这个关系就不能满足BCNF,因为身份证号与其它属性存在着函数依赖关系,存在非主属性之间的函数依赖关系,要想让关系满足BCNF就需要把身份证号码从学生关系中分离。但是在实际应用中没有进行分离处理,分离后新建一个关系反而增加了数据的存储量,身份证号在该系统中使用频率不高,只是作为一个属性在学生表中记录。
2.5 关系模式拆分原则
一个关系模式采用不同的分解方法可以得到不同关系模式集合,根据实际应用的需要拆分关系模式的方法不同。最小冗余的要求必须以分拆分后数据库的关系模式表达设计要求的数据库所有信息为前提,在此前提下综合考虑使用更少的存储空间,数据库的完整性,满足实际应用需求。在实际应用中,未必数据库所有的关系模式都要达到某一个级别的范式, 有时为了应用方便会故意保留冗余而方便查询,特别是对不经常更新、查询频率较高的数据,在进行关系模式设计往往不盲目的进行拆分。
3 反规范化设计
把关系模式的规范化(normalization)设计满足高一级范式降低为低范式级别,使得关系模式满足低一级的关系范式称为关系模式的非规范化(denormalization), 在不影响数据库信息完整性的基础上,这样设计的数据库系统更加实用,满足某些方面的性能要求。
实际应用中完全根据理论的规范化要求设计数据库的关系模式,虽然能够得形式上较完美的数据库关系模式,但是这种形式上简单化的处理,往往给使用带来不方便之处,更有可能会导致数据库系统运行效率降低。这时我们可以从实际应用出发采用反规范化设计, 根据需要降低关系模式的范式级别,不使用规范化设计的代价是用来保持冗余数据一致性的额外开销[ 3] 。关系模式的反规范化设计主要采用增加冗余、分割关系、合并关系等技术,在使用中遇到下列情况会考虑使用反规范化技术,如:为了避免进行连接查询对大量数据做笛卡尔积;关系中某些属性使用频率特别频繁,而其它属性几乎很少使用;需要进行计算操作或复制查询等。
4 园林技术专业教学资源库设计
园林技术专业教学资源库数据库设计的实体、关系较多,该文围绕课件、制作人和学生实体设计数据库的数字模型,对其它实体及关系不做分析。
从该E-R图看共有五个实体,每个实体有各自的属性,实体与实体之间有着联系,其中课件与学生之间的联系还会有学习后的测试成绩属性,这就构成了以课件为中心的园林专业教学资源库中课件制作人、课件和学生之间的关系。
4.2 概念模型设计转换成关系模式
根据E-R图转换成关系模式的规则可生成6个关系模式,分别是:
单位(单位代号、名称、单位性质、地址、邮编、单位联系人、联系电话、传真等)
制作人(制作人代号、姓名、专业、职称、所在单位代号等)
课件(课件代号、名称、文件类型、文件大小、上传时间、内容简介、课件等)
学生(学生代号、姓名、出生年月、联系电话、家庭住址、邮编、专业信息等)
课件制作(制作人代号,课件代号,制作人序号等)
学生课件学习(课件代号、学生代号、学习时长、测试成绩等)
这6个关系模式按照规范化数据库设计理论,都能够满足BCNF的要求,解决了因函数依赖产生的问题,从数据库设计理论上来说是合理的。
4.3 关系模式存在的问题
以上关系模式虽然满足的范式级别较高,最大限度的解决了数据冗余、插入异常、删除异常、修改异常等问题,但是在实际使用中存在着一些不便之处。
1)每个课件可能会有多人制作,但是在应用中第一制作人的信息使用频率要远远高于其他制作人,把所有制作人的信息存放在一个表中,在对第一制作人的查询中是在大量无效数据中进行查询。
2)经常查询某一课件的第一制作人姓名、第一制作人所在单位等信息需要将单位、制作人、课件三个表进行连接查询,大量的数据做笛卡尔积,降低查询效率。
3)关系模式中的一些信息在系统中使用率较低,但是为了以后的大数据分析又不得不保留这些属性,这些属性列的数据直接影响整个系统的运行效率。
4.4 反规范化设计的常用技术
随着计算机硬件的发展,存储的成本越来越低,在数据的设计中适当考虑数据冗余对整个系统的成本不会影响太大,因此在进行反规范化设计之前更多的是要考虑好冗余和性能的平衡,对常用表的大小、常用的连接查询关系进行处理。常用的非规范化技术有增加冗余列、增加派生列、重新组表和分割表[3]。
1)增加冗余列是在关系模式中增加其它关系模式中的列,为了避免在查询中进行连接查询操作。例如在查询制作人信息时,制作人姓名和制作人所在单位的名称是必不可少的字段,这两个字段分布在制作人和单位两个关系中,程序在应用时要将两个表进行连接,而连接操作直接影响到查询操作的效率。如果在制作人关系中增加单位名称属性列,此类查询就不需要进行两个表的连接操作了。
2)增加派生列是指增加的列来自其它表中的数据, 由其它表中的数据计算生成,在程序应用中避免对表中大量数据查询和使用统计函数。例如在课件被学生学习的时长,如果在课件表中增加时长记录字段,就不需要通过学生课件学习表中学习时长进行统计了。
3)重新组表指将两个或多个表的部分字段放在同一个关系中,查询操作时就不必对两个或多个关系进行连接操作了,从而提高查询效率。这样可提高性能, 但是这样可能对数据的维护带来很多的麻烦,而且也损坏了数据的独立性,因此在本系统中没有采用这种方法,笔者也建议尽量不使用这种反规范化的方法。
4)分割表是指将一个关系模式拆分成两个或两个以上关系模式,表的分割包括水平分割和垂直分割。
水平分割是将表中的部分元组在另一个相同表结构或部分属性列构成的关系中存储,这些元组中的信息往往是经常被使用的,而另一些元组的信息几乎很少使用。例如制作人关系中的第一制作人信息,使用频率要比其他参与制作人信息使用频率要高得多,而一个课件的第一制作人只有一个,其他制作人可能会有多个,每次在进行查询时,如果只在第一制作人信息表中进行查询,这样效率将会提高很多。因此在系统中将制作人关系拆分成两个关系模式,分别是第一制作人和其他制作人,这样没有破坏数据库信息的完整性,同时在进行查询操作时也大大提高了数据库的性能。
垂直分割是指将一个关系模式中的部分元数单独组成一个新的关系模式,这些元数的使用频率远远高于其它元数。例如学生信息表中的学生学号、姓名、专业等信息的使用频率较高,而家庭住址、邮编等信息使用频率较低,为了提高查询效率,将家庭住址、邮编等信息从关系模式中分离出来,重新组成另一个关系模式,为学生信息表瘦身。
4.5 完整性维护
反规范化调高了数据库的查询效率,但是会给数据库的完整性维护带来新的任务,需要采用一定的技术手段来确保数据库的完整性,常用的方法有批处理维护、应用逻辑和触发器。批处理维护是定期运行批处理操作,将相关列的数据信息进行同步,但是这种方法不是对数据进行实时更新;另一种方法是应用程序实现,通过定义事务的形式对所有数据进行同步操作,这种方法有一定的风险,可能会导致遗漏,但是能实时同步信息;还有一种方式方法是使用触发器,把工作交给DBMS去完成,这种方法既解决了实时的问题, 又避免了遗漏,在本系统中就采用了这种方法。
5 结论
数据库关系模式的规范化设计与反规范化设计在数据库的设计中并不是两个完全对立的。规范化设计可以避免关系的一些异常问题,能让关系模式的逻辑关系更清晰,确保数据库的完整性,反规范化设计可以提高数据库的运行性能,回避查询操作时的连接操作,减少外键和索引的数量。在实际应用中采用反规范化设计,要根据应用需求进行平衡,让设计的数据库既能实现信息的完整性又能满足运行的高性能,这样才能体现反规范化设计的意义。
参考文献:
[1] (美)弗罗斯特.数据库设计与开发[M].北京:清华大学出版社,2007.
[2] 李红.数据库原理与应用[M].北京:高等教育出版社,2011.
[2] 钱宗斌,王艳兵.利用范式优化关系数据库中的数据结构[J].电脑知识与技术,2011(25).