日期:2013-05-20  浏览次数:20380 次


 

数据库设计中的反规范技术探讨

 

注:这是很久以前在一个论坛看到的文章,觉得写的不错;本着与众多业内人士交流、传播思想的目的展如今此,原论坛的名称曾经不记得了,当时亦是转载。你可以任意转载此文,但由此惹起的任何道德、法律纠纷与http:blog.csdn.net/aceplus无关,且http:blog.csdn.net/aceplus保证没有将此文用作任何商业和非法用途;如果您是本文的原作者,认为http:blog.csdn.net/aceplus转载损害了您的权益,请邮件联系我:aceplus@263.net

 

原标题:浅谈数据库设计中的反规范

 
1.   摘要
 

   本文从提高数据库功用的角度,引见了数据库设计中几种常用的反规范方法,并对这些方法的优缺点以及使用时的留意事项做了较为深入的论述。 

关键词: 数据库设计  反规范  提高功用

 

 
2.   数据库设计简述
    数据库设计是把理想世界的商业模型与需求转换成数据库的模型的过程,它是建立数据库使用系统的核心问题。设计的关键是如何使设计的数据库能合理地存储用户的数据,方便用户进行数据处理。 

   数据库设计完全是人的问题,而不是数据库管理系统的问题。系统不管设计是好是坏,照样运转。数据库设计该当由数据库管理员和系统分析员一同和用户一道任务,了解各个用户的要求,共同为整个数据库做出恰当的、完整的设计。  

    数据库及其使用的功用和调优都是建立在良好的数据库设计的基础上,数据库的数据是一切操作的基础,如果数据库设计不好,则其它一切调优方法提高数据库功用的效果都是无限的。  

数据的规范化
2.1.   范式概述
     规范化理论是研讨如何将一个不好的关系模式转化为好的关系模式的理论,规范化理论是围绕范式而建立的。规范化理论认为,一个关系数据库中所有的关系,都应满足一定的规范(约束条件)。规范化理论把关系应满足的规范要求分为几级,满足最低要求的一级叫做第一范式(1NF),在第一范式的基础上提出了第二范式(2NF),在第二范式的基础上又提出了第三范式(3NF),当前又提出了BCNF范式,4NF,5NF。范式的等级越高,应满足的约束集条件也越严厉。规范的每一级别都依赖于它的前一级别,例如若一个关系模式满足2NF,则一定满足1NF。下面我们只引见1NF,2NF,3NF范式。  
2.2.   1NF
    1NF是关系模型的最低要求,它的规则是:   

每一列必须是原子的,不能分成多个子列。

每一行和列的位置只能有一个值。

不能具有多值列。

例:如果要求一个先生一行,一个先生可选多门课,则下面的“先生”表就不满足1NF: student(s-no,s-name,class-no)

其中:s-no为学号,s-name为先生姓名,class-no为课程号。由于一个先生可选多门课,所以列class-no有多个值,所以空不符合1NF。

  规范化就是把它分成如下两个表:“先生”表和“选课”表,则这两个表就都满足1NF了。

student(s-no,s-name)

stu-class(s-no,class-no)   
2.3.   2NF
  对于满足2NF的表,除满足1NF外,非主码的列必须依赖于所有的主码,而不是组合主码的一部分。如果满足1NF的表的主码只要一列,则它自动满足2NF。  例:下面的“选课”表,不符合2NF。

stu-class(s-no,class-no,class-name)

其中:class-name为课程名称。由于词表的主码是:(s-no,class-no),非主码列class-name依赖于组合主码的一部分class-no,所以它不符合2NF。    

对该表规范化也是把它分解成两个表:“选课”表和“课程”表,则它们就都满足2NF了。

stu-class(s-no,class-no)

class(class-no,class-name)   
2.4.   3NF
   3NF的规则是除满足2NF外,任一非主码列不能依赖于其它非主码列。   例:下面的“课程”表,不符合3NF。

class(class-no,class-name,teacher-no,teacher-name)

其中:teacher-no为任课教师号,teacher-name为任课教师姓名。由于非主码列teacher-name依赖于另一非主码列teacher-no,所以它不符合3NF。  其处理办法也是把它分解成两个表:“课程”表和“教师”表,则它们就都满足3NF了。   

class(class-no,class-name,teacher-no)

teacher(teacher-no,teacher-name)  
2.5.   小结
  当一个表是规范的,则其非主码列依赖于主码列。从关系模型的角度来看,表满足3NF最符合标准,这样的设计容易维护。一个完全规范化的设计并不总能生成最优的功用,因此通常是先按照3NF设计,如果有功用问题,再通过反规范来处理。  

    数据库中的数据规范化的优点是减少了数据冗余,节约了存储空间,相应逻辑和物理的I/O次数减少,同时加快了增、删、改的速度,但是对完全规范的数据库查询,通常需求更多的连接操作,从而影响查询的速度。因此,有时为了提高某些查询或使用的功用而破坏规范规则,即反规范。
3.   数据的反规范
 
3.1.   反规范的好处
    能否规范化的程度越高越好?这要依据需求来决定,由于“分离”越深,产生的关系越多,关系过多,连接操作越频繁,而连接操作是最费时间的,特别对以查询为主的数据库使用来说,频繁的连接会影响查询速度。所以,关系有时故意保留成非规范化的,或者规范化当前又反规范了,这样做通常是为了改进功用。例如帐户系统中的“帐户”表B-TB01,它的列busi-balance(企业帐户的总余额)就违反规范,其中的值可以通过下面的查询获得: 

select busi-code,sum(acc-balance)  

from   B-TB06   

group by busi-code

  如果B-TB01中没有该列,若想获得busi-name(企业名称)和企业帐户的总余额,则需求做连接操作:  

               select busi-name,sum(acc-balance)   

               from B-TB01,B-TB06   

               where B-TB01.busi-code=B-TB06.busi-code   

               group by busi-code

如果经常做这种查询,则就有必要在B-TB01中加入列busi-balance,相应的代价则是必须在表B-TB06上创建增、删、改的触发器来维护B-TB01表上busi-balance列的值。类似的情况在决策支持系统中经常发生。  

     反规范的好处是降低连接操作的需求