[总结]关系型数据库规范化
一、关系模式定义
关系型数据的关系模式是一个五元组:
R(U,D,DOM,F)
R —— 关系名;
U —— 属性名的集合,即属性组;
D —— U中属性所来自的域(相同类型的值的集合);
DOM —— 属性(U)到域(D)的映射;
F —— 属性组U上的一组数据依赖。
由于D和DOM对模式设计关系不大,本文把关系模式化简成为一个三元组,即:R(U, F)。
二、函数依赖相关定义
设R(U)是属性集U上的关系模式,X、Y是U的子集。
1. 函数依赖:
若对R(U)上的任意一个可能的关系r,r中不存在两个元组在X子集上的属性相等而Y子集上的属性不等,即Y函数依赖于X,记作X→Y。(人话就是:Y=f(X),f是一个单值函数)。
2. 非平凡函数依赖:
如果X→Y且Y⊈X,则称X→Y是非平凡函数依赖。
平凡函数依赖
如果X→Y且Y⊆X,则称X→Y是平凡函数依赖。
3. 完全函数依赖
如果X→Y且对于X的任何一个真子集X’,都有X’不能决定Y,则称Y对X完全依赖,记作X□(→┴f )Y。(例子:(X’, X’’) →Y,对于X’或者X’’都不能决定Y,即(X’, X’’)□(→┴f )Y)
4. 部分依赖
如果X→Y且Y对X不完全依赖,记作X□(→┴p )Y。
5. 传递依赖
如果X→Y,Y⊈X且Y→Z,则Z对X传递依赖。
三、范式
(一)第一范式(1NF)
若关系模式R中的每一个分量是不可再分的数据项,则关系模式R属于第一范式。(理解:对属性的原子操作,要求属性具有原子性,不可再分解)
对于一张二维表来说,最起码的要求是满足1NF,即:每个分量都是必须是一个不可分的数据项。这是最基本的范式,若只是满足1NF,则该关系模式可能存在下面的问题:
例1:记关系模式R(U, F),U={A, B, C, D, E};,F={A→C, C→D, (A, B) →E};
- 数据冗余: 属性C, D, E等信息在表中可能会重复出现,浪费大量存储空间。(即函数依赖导致了大量的冗余)
- 更新异常: 由于属性C, D, E等信息在表中可能会重复出现,因此如果它们需要修改需要重复修改对应的每一项,否则可能导致数据不一致。(即数据冗余导致了更新异常)
- 插入异常: 如果属性A, B, E中有新添的元素暂时没有对应的C,D,那么就无法将这个新添元素插入该表。(即函数依赖导致了插入异常)
- 删除异常:若需要删除属性B,E的元素,则该元素对应的元组所有元素也将被删除。(即函数依赖导致了删除异常)
(二)第二范式(2NF)
若关系模式R∈1NF,且每一个非主属性完全依赖于码(属性的组合,能唯一标识实体的属性),则关系模式R属于第二范式,即当1NF消除了非主属性对码的部分函数依赖,则称2NF。(理解:2NF是对记录的唯一性约束,要求记录具有唯一标识,即实体的唯一性)
由例1可以看出依赖往往导致了数据冗余、更新异常、插入异常、删除异常等问题,对属性间依赖情况进行规范可以一定程度上减少少这些问题。属性间的依赖程度就是区分不同范式的依据。由例1可以看出:例1中的码是属性A,B,其中A→C,即属性C是对码的部分函数依赖,则2NF对例1的处理就是是消除非主属性对码的部分函数依赖。如下:
例2:记关系模式R1(U, F),U={A, B, E};,F={ (A, B) →E};记关系模式R2(U, F),U={A, C,D,};,F={A→C, C→D };
例2中通过把例1的表分割成了两个表,下面还是从上面的几方面分析:
- 数据冗余:属性C, D,等信息在表中依旧可能会重复出现,浪费大量存储空间,但对比例1的属性E,例2中的属性E则消除了冗余。
- 更新异常:除了属性E消除了更新异常其它的和例1中的分析一样。
- 插入异常:解决了例1中的问题,但也会存在其它问题,如属性C,D有了新添元素而没有对应的属性A。
- 删除异常:解决了例1中的问题,能保留对应属性A,C,D的元素,但也会存在其它问题,如需要删除属性A,C的一个元素,则对应的D属性的元素也要被删除。
例2中看来2NF对例1确实能够进行改进,但依然会有一些问题存在,这些问题主要是传递依赖造成的,例2中对例1最大的改进就是使得例2中每一个表都的记录都有了唯一的标识。
(三)第三范式(3NF)
若关系模式R(U, F)中不存在这样的码X,属性组Y及非主属性组Z(Z⊆Y)使得X→Y(Y↛X),Y→Z成立,则关系模式R属于第三范式。(理解:对字段的冗余性的约束(消除了非主属性对码的传递函数依赖),即任何字段不能由其它字段派生出来,它要求字段没有冗余)
例3:记关系模式R1(U, F),U={A, B, E};,F={ (A, B)→E};记关系模式R2(U, F),U={A, C};,F={A→C };记关系模式R3(U, F),U={ A, D,};,F={ A→D};
例3中把例2的传递依赖部分又分成了两个表即R2、R3,现在再次简单检查一下发现上面的冗余和异常解决了(在我目前的水平看来应该解决了)。
(四)其它范式
还存在其它的范式,如BCNF、4NF。其它的范式我还不是很清楚如何理解表达和应用,下面只是给出我查资料时看到的图表。以后的内容以后有时间再深入研究和补充。
参考文献:
王珊,萨师煊,数据库系统概论[M],第4版,北京:高等教育出版社,2006,5.
胡圣明,软件设计师教程[M],第3版修订版,北京:清华大学出版社,2013,3.