不再年轻.NET

一个IT教师眼中的生活.NET、感悟.NET和技术.NET

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
 

关系规范化理论及非规范化设计在数据库中的运用

李俊平

(深圳职业技术学院 计算机应用工程系,广东深圳 518055

摘要:本文首先介绍了数据库设计中的关系规范化理论,然后从提高数据库性能的角度,介绍了非规范化设计技术和几种常用的非规范化设计方法,并对这些方法的优缺点以及使用时的注意事项做了较为深入的论述。

关键词:关系 数据库设计 规范化 非规范化

 

The theory of normalization and denormalization

and its’ applying to Database Design

Li Junping

(Department of Computer Engineering,Shenzhen Polytechnic,Shenzhen,Guangdong,518055,China)

    AbstractThis paper firstly introduced the theory of relationship’s normalization, then Based on enhancing the database’s ability it introduced the technology of normalization and its methods of design. It also discuss the advantages and disadvantages of denomalization.

    Key wordsRelationship; Database Design; normalization; denormalization

 

引言

在大中型的软件系统中,数据库占据着举足轻重的地位。同时,数据库设计也是软件系统设计中的重要组成部分。因此,如何做好数据库设计就成为了软件设计工作者的必修课。一般来说数据库的设计应该遵循关系的规范化理论。但在实际应用中,需求和性能才是评价设计优劣的首要标准,而范式作为参考。

关系的规范化理论

规范化理论是研究如何将一个不好的关系模式转化为好的关系模式的理论,规范化理论是围绕范式而建立的。规范化理论认为,一个关系数据库中所有的关系,都应满足一定的规范(约束条件)。规范化理论把关系应满足的规范要求分为几级,满足最低要求的一级叫做第一范式(1NF),在第一范式的基础上提出了第二范式(2NF),在第二范式的基础上又提出了第三范式(3NF),以后又提出了BCNF范式,4NF5NF。范式的等级越高,应满足的约束集条件也越严格。规范的每一级别都依赖于它的前一级别,例如若一个关系模式满足2NF,则一定满足1NF。即BCNF包含于3NF包含于2NF包含于1NF[1]。在实际工程中3NFBCNF应用得最广泛,推荐采用 3 NF作为标准。

规范化目的是使结构更合理,消除存储异常,使数据冗余尽量小,便于插入、删除和更新。规范化的原则是遵从概念单一化即一事一地 [1],一个关系模式描述一个实体或实体间的一种联系。规范的实质就是概念的单一化。规范的方法就是将关系模式分解成两个或两个以上的关系模式。要求分解后的关系模式集合应当与原关系模式等价,即经过自然联接可以恢复原关系而不丢失信息,并保持属性间合理的联系。

一个关系分解成多个关系,要使得分解有意义,起码的要求是分解后不丢失原来的信息。这些信息不仅包括数据本身,而且包括由函数依赖所表示的数据之间的相互制约。进行分解的目标是达到更高一级的规范化程度,但是分解的同时必须考虑两个问题:无损联接性和保持函数依赖。有时往往不可能做到既有无损联接性,又完全保持函数依赖,这时就必须根据需要进行取舍了。

2.1 第一范式(1NF

在关系模式R中中,如果每个属性值都是不可再分的原子属性,则称R是第一范式的关系[]。例如:关系R(职工号,姓名,电话号码)中一个人可能有一个办公室电话和一个住宅电话号码,规范成为1NF的方法一般是将电话号码分为单位电话和住宅电话两个属性,即 R(职工号,姓名,办公电话,住宅电话)。1NF是关系模式的最低要求。

2.2 第二范式(2NF

如果关系模式R1NF且其中的所有非主属性都完全函数依赖于关键字,则称关系R 是属于第二范式的[]。例:选课关系 SCSNOCNOGRADECREDIT)其中SNO为学号, CNO为课程号,GRADEGE 为成绩,CREDIT 为学分。 由以上条件,关键字为组合关键字(SNOCNO)。在应用中使用以上关系模式有以下问题: (1)数据冗余,假设同一门课由40个学生选修,学分就重复40次;(2)更新复杂,若调整了某课程的学分,相应元组的CREDIT值都要更新,有可能会出现同一门课学分不同;(3)插入异常,如计划开新课,由于没人选修,没有学号关键字,只能等有人选修才能把课程和学分存入;(4).删除异常,若学生已经结业,从当前数据库删除选修记录,而某些课程新生尚未选修,则此门课程及学分记录无法保存。以上问题产生的原因是非主属性CREDIT仅函数依赖于CNO,也就是CREDIT部分依赖组合关键字(SNOCNO)而不是完全依赖。解决方法是将以上关系分解成两个关系模式 SCSNOCNOGRADE)和CCNOCREDIT)。新关系包括两个关系模式,它们之间通过SC中的外键CNO相联系,需要时再进行自然联接,恢复原来的关系

2.3 第三范式(3NF

如果关系模式R2NF且其中的所有非主属性都不传递依赖于码,则称关系R是属于第三范式的[1]。例如关系模式SSNOSNAMEDNODNAMELOCATION)中各属性分别代表学号、姓名、所在系、系名称、系地址。关键字SNO决定各个属性。由于是单个关键字,没有部分依赖的问题,肯定是2NF。但关系S肯定有大量的冗余,有关学生所在系的几个属性DNODNAMELOCATION将重复存储,插入、删除和修改时也将产生类似以上例的情况。原因在于关系中存在传递依赖,即SNO -> DNODNO -> LOCATION, 因此关键字SNOLOCATION函数决定是通过传递依赖SNO -> LOCATION 实现的。也就是说,SNO不直接决定非主属性LOCATION。解决方法是将该关系模式分解为两个关系SSNOSNAMEDNO)和DDNODNAMELOCATION),两个关系通过S中的外键DNO联系。

2.4 BCNF

如果关系模式R的所有属性(包括主属性和非主属性)都不传递依赖于R的任何候选关键字,那么称关系R是属于BCNF的。或者说关系模式R中,如果每个决定因素都包含关键字(而不是被关键字所包含),则RBCNF[] 通常认为BCNF是修正的第三范式,有时也称为扩充的第三范式。

2.5 关系模式分解原则

一个关系模式的分解可以得到不同关系模式集合,也就是说分解方法不是唯一的。最小冗余的要求必须以分解后的数据库能够表达原来数据库所有信息为前提来实现,其根本目标是节省存储空间,避免数据不一致性,提高对关系的操作效率,同时满足应用需求。实际上,并不一定要求全部模式都达到某一范式不可。有时故意保留部分冗余可能更方便数据查询,尤其对于那些更新频度不高,查询频度极高的数据库系统更是如此。

非规范化设计

    把规范化(normalization)设计的高一级的关系范式(如3NFBCNF)降低为低一级的关系范式的操作称为非规范化(denormalization),设计者一般用这种方式改变系统的性能以支持响应时间苛刻的操作。

现实世界并不总是依从于某一完美的数学化的关系模式。有时强制性地对事物进行规范化设计,形式上显得简单化,内容上却趋于复杂化,更重要的是可能导致数据库运行效率的减低。这时我们可以从实际出发采用非规范化设计,适当降低甚至抛弃关系模式的范式,不再要求一个关系只描述一个实体或者实体间的一种联系。其主要目的在于提高数据库的运行效率。不使用规范化设计的代价是用来保持冗余数据一致性的额外开销[]

数据库设计非规范化处理的主要技术包括增加冗余或派生列,对表进行合并、分割或增加重复表。一般认为,在下列情况下可以考虑进行非规范化处理:(1)大量频繁的查询过程所涉及的表都需要进行连接;(2) 主要的应用程序在执行时要将表连接起来进行查询;(3)对数据的计算需要临时表或进行复杂的查询。

非规范化设计的主要优点是减少了查询操作所需的连接,减少外键和索引的数量,并且可以预先进行统计计算,提高查询时的响应速度。非规范化设计存在的主要问题是增加了数据冗余,影响数据库的完整性,降低了数据更新的速度,增加了存储表所占用的物理空间。其中最重要的是数据库的完整性问题。这一问题一般可通过建立触发器、应用事务逻辑、在适当的时间间隔运行批处理命令或存储过程等方法得到解决。

从某种意义上说,数据库的规范化与非规范化设计并不是对立的、非此即彼的关系。也许其中一方会逐渐消亡,也许二者存在一条中间道路可走。认识事物原本存在一个螺旋式上升的过程。是否规范化的程度越高越好?这要根据需要来决定,因为分解越深,产生的关系越多,关系过多,连接操作就越频繁,而连接操作是最费时间的,特别是对以查询为主的数据库应用来说,频繁的连接会影响查询速度。所以,关系有时故意保留成非规范化的,或者规范化以后又反规范了,这样做通常是为了改进性能。

3.1 常用的非规范化设计技术

在进行非规范操作之前,要充分考虑数据的存取需求、常用表的大小、一些特殊的计算(例如合计)、数据的物理存储位置等。常用的非规范化技术有增加冗余列、增加派生列、重新组表和分割表。

(1) 增加冗余列是指在多个表中具有相同的列,它常用来在查询时避免连接操作。例如在一个教务系统中,如果经常需要检索一门课的任课教师姓名,则需要做classteacher表的连接查询:

  select class­-name,teacher-name
  from classteacher
  where class.teacher-no=teacher.teacher-no

这时可以在class表中增加一列teacher-name就不需要连接操作了。增加冗余列可以在查询时避免连接操作,但它需要更多的磁盘空间,同时增加表维护的工作量。

(2) 增加派生列是指增加的列来自其它表中的数据,由它们计算生成。它的作用是在查询时减少连接操作,避免使用统计函数。派生列也具有与冗余列同样的缺点。

(3) 重新组表指如果许多用户需要经常查看两个表连接出来的结果数据,则可以把这两个表重新组成一个表来减少查询操作时的表间连接而提高性能。例如,用户经常需要同时查看教务系统数据库中的课程号,课程名称,任课教师号,任课教师姓名,则可把表class(class-noclass-nameteacher-no)和表teacher(teacher-noteacher-name)合并成一个表class(class-no,class-name,teacher-no,teacher-name)。这样可提高性能,但需要更多的磁盘空间,同时也损失了数据在概念上的独立性。

(4) 有时对表做分割可以提高性能。表分割有两种方式:水平分割和垂直分割。水平分割是根据一列或多列数据的值把数据行放到两个独立的表中。水平分割通常在下面的情况下使用。

l         表很大,分割后可以降低在查询时需要读的数据和索引的页数,同时也降低了索引的层数,提高查询速度。

l         表中的数据本来就有独立性,例如表中分别记录各个地区的数据或不同时期的数据,特别是有些数据常用,而另外一些数据不常用。

l         需要把数据存放到多个介质上。例如成绩就可以分成两个表已毕业学生成绩表和在册学生成绩表。其中前者在日常查询中是很少用到的,后者是经常使用的。这样就可以减少查询时检索的记录数量。

  水平分割会给应用增加复杂度,它通常在查询时需要多个表名,查询所有数据需要union操作。在许多数据库应用中,这种复杂性会超过它带来的优点,因为只要索引关键字不大,则在索引用于查询时,表中增加两到三倍数据量,查询时也就增加读一个索引层的磁盘次数。

  垂直分割是把主码和一些列放到一个表,然后把主码和另外的列放到另一个表中。如果一个表中某些列常用,而另外一些列不常用,则可以采用垂直分割,另外垂直分割可以使得数据行变小,一个数据页就能存放更多的数据,在查询时就会减少I/O次数。其缺点是需要管理冗余列,查询所有数据需要join操作。

  3.2 非规范设计中数据完整性的维护

  无论使用何种非规范设计技术,都需要一定的管理来维护数据的完整性,常用的方法是批处理维护、应用逻辑和触发器。

  批处理维护是指对冗余列或派生列的修改积累一定的时间后,运行一个批处理作业或存储过程对冗余或派生列进行修改,这只能在对实时性要求不高的情况下使用。

  数据的完整性也可由应用逻辑来实现,这就要求必须在同一事务中对所有涉及的表进行增、删、改操作。用应用逻辑来实现数据的完整性风险较大,因为同一逻辑必须在所有的应用中使用和维护,容易遗漏,特别是在需求变化时,不易于维护。
  另一种方式就是使用触发器,对数据的任何修改立即触发对冗余列或派生列的相应修改。触发器是实时的,而且相应的处理逻辑只在一个地方出现,易于维护。一般来说,触发器是解决这类问题的最好的办法。

4 结论

    规范化设计的优点包括可有效地消除数据冗余,理顺数据的从属关系,保持数据库的完整性,增强数据库的稳定性、伸缩性、适应性。通常认为规范化设计存在的主要问题是增加了查询时的连接库表运算,导致计算机时间、空间、系统及运行效率的损失。在大多数情况下,这一问题可通过良好的索引设计等方法得到解决。

    非规范化设计可以显著减少表的数量,从而减少对连接运算的依赖,加速数据库执行的速度,保证数据库性能的正常发挥。例如目前流行于决策支持系统的非规范化星型模式就远胜于应用规范化设计,是非规范化设计的最好范例。非规范化设计并不意味着混乱和无视规则,它也遵循保护信息完整性等软件工程的基本原则。

    使用规范化设计还是非规范化设计,或者两者兼而有之,这需要根据工程中的实际需求来权衡。

 

参考文献:

[1] 萨师煊,王 珊.数据库系统概论(第三版)[M].北京:高等教育出版社,2000

[2] Abraham SilberschatzHenry F.KorthS.Sudarshan.数据库系统概念(原书第四版)[M].杨冬青,唐世渭等译,北京:机械工业出版社,2003

[3] Thomas ConnollyCarolyn Begg.数据库系统――设计、实现与管理(第三版英文版).北京:电子工业出版社,2003

 

 

 

 

 

 

 

 

 

posted on 2006-10-12 21:39  不再年轻.NET  阅读(1583)  评论(0编辑  收藏  举报