第五章 关系数据理论
--数据的规范化
5.1提出问题
1、关系模式
R(U, D, dom, F)五元组表示,也可直接用R(U, F)来表示,即当且仅当U上的一个关系r满足F时,r称为关系模式R(U, F)的一个关系。
2、数据依赖
通过一个关系中属性间值的相等与否体现出来的数据间的相互关系。可分为函数依赖和多值依赖。
5.2 数据的规范化
范式:关系模式满足的确定约束条件,由低到高分为1NF、2NF、3NF、BCNF、4NF、5NF等。
规范化:把一个低一级的关系模式分解为高一级关系模式的过程。
分解的两个准则:(1)无损联接性; (2)函数依赖保持性
基本思想:逐步消除不合适的函数依赖,使数据库中的各种关系模式达到某种程度的分离。
1、 函数依赖
定义:对于R(U)的任意一个可能的关系r,r中不可能存在两个元组在X上的属性值相等而在Y上的属性值不等。这样可称为X函数确定Y或Y函数依赖于X,记作X→Y。
通俗地说,就像自变量X确定之后,相应的函数值f(x)也就惟一地确定了一样。
比如员工资料表(员工号,员工姓名,所在部门),可以说员工号决定员工姓名和所在部门,或者说员工姓名、所在部门依赖于员工号,记为:员工号→员工姓名,员工号→所在部门。
2、 码
关系R(U,F)中的一个属性或一组属性K,如果给定一个K则惟一决定U中的一个元组,也就是U完全函数依赖于K,我们就称K为R的候选码。一个关系可能有多个候选码,选其一作为主码。
包含在任一码中的属性称为主属性,不包含在任何码中的属性称为非主属性。
外码:关系R中的属性或属性组X不是R的码,但X是另一个关系模式的码,我们就称之为外码。
3、1NF
如果关系R中的所有属性的属性不可再分,是属性项而不是属性组,那么关系模式R是第一范式,记作1NF。这是关系的基本性质,任何关系都必须满足第一范式。比如:
员工工号 |
员工姓名 |
地址 |
10001 |
刘备 |
广东省广州市东大街1号[120002] |
上表表示的关系就不是第一范式,分解为:
员工工号 |
员工姓名 |
所在省 |
所在市 |
详细地址 |
邮编 |
10001 |
刘备 |
广东省 |
广州市 |
东大街1号 |
120002 |
这就满足了第一范式的要求。
满足第一范式的关系模式会有许多重复值,并且增加了修改其数据时引起疏漏的可能性。
4、2NF
如果一个关系属于1NF,且所有的非主属性都完全地依赖于主属性,则称为第二范式。
如果一个关系模式R不属于2NF,那么就会产生如下问题:(1)插入异常;(2)删除异常;(3)修改复杂。
3、3NF
如果一个关系R属于2NF,且每个非主属性不传递依赖于主属性,这种关系是3NF。
从2NF中消除传递依赖,就是3NF。比如关系模式E(员工姓名,工资级别,工资额),其中职工姓名是关键字,此关系符合2NF,但是因为工资级别决定工资额,也就是说非主属性“工资额”传递依赖于主属性“员工姓名”,因此它不符合3NF,可以用投影分解的办法将其分解成两个关系模式:E(员工姓名,工资级别),F(工资级别,工资额),这两个就都符合3NF的定义。
4、 BCNF
如果关系模式R属于1NF,且R中每一个函数依赖关系中的决定因素都包含码,则R属于BCNF(Boyeet和Codd提出)。通常认为BCNF是第三范式的改进。
当一个关系模式R属于BCNF,则在函数依赖范畴里,就认为已经彻底实现了分离,消除了插入、删除异常。
综合1NF、2NF、3NF和BCNF的内涵可概括为:
(1)每一个属性都是不可再分解的属性(1NF的要求)
(2)非主属性完全函数依赖于码(2NF的要求)
(3)非主属性不传递依赖于任何一个候选码(3NF的要求)
(4)主属性对不含它的码完全函数依赖(BCNF的要求)
(5)没有属性完全函数依赖于一组非主属性(BCNF的要求)
5、 多值依赖与4NF
多值依赖:关系模式R(U,F)属于1NF,X、Y是U的非空子集,Z=U-X-Y也非空,若任取一组值对(X,Z),都可决定一组(Y1、Y2、…、Yn)值,且此决定关系与Z值无关,我们就称Y多值依赖于X,记作X→→Y。
4NF:关系模式R(U,F)属于1NF,若对任一多值依赖X→→Y,X必包含R的主键,就称R为第四范式。
如以下关系R(ypm,bm,gys):
Ypm(用品名) |
Bm(部门) |
Gys(供应商) |
办公桌 |
总经理室 |
华美 |
办公桌 |
销售部 |
科技 |
办公椅 |
工程部 |
光伟 |
办公椅 |
计划部 |
中厦 |
办公椅 |
总经理室 |
华美 |
从表中可以看出,对于ypm的一个值,不论gys取什么值,总有一组确定的bm与这对应,所以有ypm→→bm,现时也有ypm→→gys,此关系是全码,这说明R不满足4NF,此种关系模式有数据冗余和修改量大等弊端,可用分解法分解为:R1(ypm,bm),R2(ypm,gys)。
6、 非规范化处理
是不是规范化设计就一定是完美的呢?不是,在实际应用中,由规范化设计所带来的性能问题可能是令人无法承受的。这时就要进行非规范化处理。
非规范化是为了获得性能上的要求所进行的违反规范化规则的操作。由于非规范化几乎必然导致冗余,占用更多的存储空间,因此设计时需要从性能和空间的平衡进行考虑,不断地尝试和评估。当然,如果仅仅是为了一时的方便而进行非规范化处理那是非常不好的习惯,不值得去效仿,比如某些人就因为某些不是理由的理由将汇率这些基本资料也冗余到订单表中,这就不是什么好的方法了。