范式设计与反范式设计

范式设计

关系规范化是在基于关系数据库中分将各个数据库表之间存在访问异常的关系分解为结构良好的关系的过程,使得这些关系只存在最小的冗余或没有冗余。

而规范化范式(Normal Forma, NF)则是在关系规范化的前提下符合某一种级别的关系模式的集合。关系数据库中的关系必须满足一定的要求,即满足不同的范式。目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、第四范式(4NF)、第五范式(5NF)和第六范式(6NF)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多要求的称为第二范式(2NF),其余范式以次类推。一般说来,数据库只需满足第三范式(3NF)就行了。

  • img

    以下解释均以该图做为基础


第一范式

如果关系R中的所有属性不可再细分为更加基本的数据单位时,则该关系R满足第一范式。

第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。在第一范式(1NF)中表的每一行只包含一个实例的信息。简而言之,第一范式就是无重复的列。

  • img

    图a)中学生关系中不满足第一范式,因为“联系方式”属性可以在细分为“手机号码”、“电子邮箱”等颗粒度更细的属性。图b)为满足第一范式的其中一种解决方式。


第二范式

如果关系R满足第一范式,并消除了关系中属性的部分依赖,则该关系满足第二范式。

第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。简而言之,第二范式就是属性完全依赖于主键。

  • img

    分析图b)中学生关系中,学生的成绩可以是若干个的。如果通过复合主键(学号、课程编号)来确定成绩的唯一性,就会造成数据的冗余。图c)为满足第二范式的其中一种解决方式。


第三范式

如果关系R满足第二范式,并切断了关系中的属性传递依赖,则该关系满足第三范式。

第三范式(3NF)要求实体的属性之间不存在间接关系,即不存在实体中的某一字段依赖于其他非主键字段,而该非主键字段又依赖于主键字段这一关系。简而言之,第三范式就是不存在传递依赖。

  • img

    分析图c)中学生关系,(学号)->专业,(专业)->班级,故(学生)->班级之间存在传递函数依赖。图d)为满足第三范式的其中一种解决方式。



反范式设计

范式设计可以有效避免数据的冗余,降低维护数据完整性的成本,易于数据库表拓展设计。但是完整严格基于范式设计(一般为第三范式以上的更高范式)会导致数据库表的增多,查询数据时需要联合多表,对数据操作的性能降低。

反范式设计即是提出反对范式设计的一种设计模式。

在反范式设计模式中,允许在数据库表中适当的数据冗余,尽可能减少数据库表的数量,从而提高数据操作的性能,从本质上就是利用空间来换时间,把数据冗余在多个表中,进行查询时可以减少或者避免表之间的关联。

  • img

    此图中学生模型可以从第三范式退化到第二范式中(此举仅用于说明,其实不建议)



最后:

范式设计是基于关系型数据库中较良好的设计模型,可以建立冗余较小、结构合理的数据库。但在面对数据量较大的数据库中,单单依靠范式来设计数据库表容易造成较大的性能损失。所以在设计过程中应当结合反范式设计,尽可能构造出性能与空间均衡(或者根据需求偏向于某一方面)的数据库。


参考资料:

[1] http://kimi.it/418.html

[2] http://www.cnblogs.com/knowledgesea/p/3667395.html

[3] http://www.cnblogs.com/binyue/p/4519858.html