分类:
2012-05-26 15:31:51
原文地址:数据库基础(六)--关系数据库的规范化理论 作者:yourtommy
问题的提出
设有关系模式R(姓名,电话,参与的俱乐部,俱乐部的活动),候选码为(姓名,参与的俱乐部)。
姓名 | 电话 | 参与的俱乐部 | 俱乐部的活动 |
A | 123 | 乒乓club | 打乒乓球 |
A | 123 | 登山club | 爬山 |
B | 456 | 乒乓club | 打乒乓球 |
B | 456 | 英语club | 学习英语 |
C | 789 | 登山club | 爬山 |
C | 789 | 英语club | 学习英语 |
注意到上面的模式有什么问题?
1、数据冗余:一个人参与几个俱乐部,那么他的电话会重复几次;同样,一个俱乐部被几个人参加,它的活动就会重复几次。
2、修改异常:一旦一个人的手机号变化,那么对应于他参与的每个俱乐部的各行里的电话都需要修改,如果有遗漏,那么会造成数据不一致;俱乐部的活动也是如此。
3、插入异常:如果一个新人到来,还未参加任何俱乐部,那么他的信息和电话就无法插入到这张表里,因为参与的俱乐部是主属性,不能为空。
4、删除异常:如果某人暂时退出了所有的俱乐部,那么必须把所有的元组都删去,这样这个人的姓名和电话信息也不存在了。
问题的解决方式是把关系模式R分解成三个模式:
姓名 | 电话 |
A | 123 |
B | 456 |
C | 789 |
俱乐部 | 活动 |
乒乓club | 打乒乓球 |
英语club | 学习英语 |
登山club | 爬山 |
姓名 | 参与的俱乐部 |
A | 乒乓club |
A | 登山club |
B | 乒乓club |
B | 英语club |
C | 登山club |
C | 英语club |
函数依赖(FD,Functional Dependency)
实际上关系模式的更新异常是由属性间的数据依赖引起的,数据依赖指数据之间存在着某种内在的联系,如姓名和电话之间,每一个人都有一个确定的电话,姓名的一个取值可以确定唯一的地址。
函数依赖的概念为:设有关系模式R(U),X和Y是属性集U的子集,函数依赖是形为X→Y的一个命题,只要有r是R的当前关系,对r中的任意两个元组t和s,都有t[X] = s[X]蕴涵t[Y] = s[Y],那么称函数依赖X→Y在关系模式R(U)中成立。比如前面的U是(姓名,电话,参与的俱乐部,俱乐部的活动),子集X为(姓名),子集Y为(电话)。
函数依赖的文字化定义:设R(U)是属性集U上的关系模式,X、Y是U的子集,若对于R(U)的任意一个可能的关系r,R中不可能存在两个元组在X的属性值上相等,而在Y上的属性值不等,则称“X函数确定Y”,或“Y函数依赖于X”,记作X→Y。例如姓名→电话。
FD的推理规则有:
基本规则:
1、自反性:Y⊆X ⇒ X →Y
2、增广性:XZ →YZ
3、传递性:X →Y, Y →Z ⇒ X →Z
扩展规则:
4、合并性:{X →Y, X →Z} ⇒ X →YZ
5、分解性:{X →Y, Z ⊆ Y} ⇒ X →Z
6、伪传递性:{X →Y, WY →Z} ⇒ WX →Z
7、复合性:{X →Y, W →Z} ⇒ WX →YZ
函数依赖的性质有:
1、若X→Y,但X ⊄ Y,则称X→Y是非平凡的函数依赖,一般不特殊指明的情况下,我们总是讨论非平凡函数依赖。
2、若X→Y,则称X是决定因素。
3、若Y不函数依赖于X,则记作X↛Y
4、若X→Y,Y→X,则称X与Y一一对应,记为X↔Y。
在R(U)中,如果X→Y,并且对于X的任意一个真子集X',都有X'↛Y,则称Y完全函数依赖于X,或Y对X完全函数依赖,记作X-f->Y,否则称Y对X部分函数依赖,X-p->Y。
在关系模式R(U)中,如果X→Y,(X ⊄ Y),Y→Z,则称Z对X传递函数依赖。
设K为R中的属性或属性组,若K-f->u,则K为R的候选码,若候选码多于一个,则选其中一个作为主码。特殊情况:所有属性构成码,称为全码。包含在任何一个候选码中的属性,叫主属性(Prime Attribute),不包含在任何码中的属性为非主属性,或非码属性。
关系模式R中属性或属性组X并非R的主码,但它是另一个关系模式的主码,则称X是R的外码(Foreign Key)。关系间是通过主码和外码进行联系的。
规范化理论
1971年起E.F.Codd提出了规范化理论。该理论按属性间的依赖情况(如函数依赖)规范关系模式。按规范化的程度不同分为第一范式1NF(Normal Form)、2NF、3NF、BCNF及4NF,逐步消除更新异常问题。
若R属于第几范式,一般记为R∈XNF,一个低一级范式的关系模式,通过模式分解总可以将它分解为若干个高一级范式的关系模式的结合,这种过程就叫规范化。
设有关系模式R(U),属性集为U,R1、……、Rk都是U的子集,并且有R1∪R2∪……∪Rk=U。关系模式R1,……,Rk的集合用ρ={R1,……,Rk}。用ρ代替R的过程为关系模式的分解。
1NF指每一个分量都是不可分的,这是最基本的规范化。即关系的所有属性都只能是预定义的简单变量,如整型,而不能是结构体。
2NF的定义为:如果R∈1NF,且每个非主属性完全函数依赖于码,则R∈2NF。 如本章最开始提出的问题,在属性性(姓名,电话,参与的俱乐部,俱乐部的活动)里,候选码为(姓名,参与的俱乐部),即姓名和参与的俱乐部是主属性,但是 “电话”部分函数依赖于“姓名”,并没有完全函数依赖于码;“俱乐部的活动”同样也部分函数依赖于“俱乐部”。它便是由于违反了2NF,才造成了更新异 常。而表的拆分便是关系模式的分解。
3NF的定义:关系模式R中若不存在这样的码X,属性组Y及非主属性Z(Z⊄Y),便利X→Y,Y→Z成立,则称R∈3NF。
比如关系
员工 | 所在分公司 | 分公司总裁 |
其中“员工”是主码,员工→所在分公司,所在分公司→分公司总裁。所以它违反了3NF。它造成的问题有修改异常:员工换了分公司的话,总裁属性也必须修改。遗漏会造成数据不一致。我们可以把它模式分解为:
员工 | 所在分公司 |
分公司 | 总裁 |
2NF、3NF有一个缺陷:它们只限制了主码对非主属性的部分函数依赖或传递函数依赖,但并没有对主属性进行限制。
比如
学号 | 姓名 |
课程名 |
假定姓名没有重名的,那么(学号,课程名)和(姓名,课程名)都可以是候选键,也就是说三个属性都是主属性。如果我们选取(学号,课程名)作为主码,有(学号,姓名)→学号,学号→姓名的传递依赖,也可以理解为部分依赖,但是因为姓名是主属性,所以这个关第符合2NF、3NF。然而,它有之前讨论过的冗余和更新异常的问题。
BCNF(Boyce Codd Normal Form)是由Boyce和Codd提出的,比3NF又进一步,通常认为BCNF是修正的第三范式,有时也称为3NF。它的定义为:如果关系模式R是1NF,且每个属性(包括主属性)都不传递依赖于R的候选键,那么称R是BCNF范式。若R∈BCNF,则R∈3NF。
范式是衡量关系模式好坏的标准,它与数据依赖有着直接的联系。1NF是关系模式的基础(对象模式违背了1NF),2NF已经称为历史,3NF和BCNF是最为常见的范式。