数据依赖与函数依赖
在实际应用中,关系中的属性取值并不完全是独立的,相互之间可能有一定的依赖关系,称为数据依赖。基本的数据依赖有函数依赖(Functional Dependency, FD)和多值依赖(Multi-value Dependency, MVD)
设R〈U〉是属性集U上的关系模式,X、Y是U的子集,若对于R〈U〉的任意一个可能的关系r,r中都不可能存在两个元组s,t使得s[X]=t[X]),而s[Y]≠t[Y],则称属性集X函数确定Y,或Y函数依赖于X,记作
X
→
Y
X→Y
X→Y。
在函数依赖
X
→
Y
X→Y
X→Y中,X称为决定因素(Determinant),Y叫做依赖因素(Dependent)。
函数依赖
对于教学关系模式:R(U,F),U= { 学号, 姓名, 年龄, 性别, 系名, 系主任, 课程名, 成绩 };根据语义, F = { 学号→姓名, 学号→年龄, 学号→性别, 学号→系名,系名→系主任,(学号,课程名)→成绩 }。
设关系模式R(ABCD),在R的关系中,属性值间存在这样的联系:A与B值间是一对多,C与D值间是一对一,由此写出可能的函数依赖。
解:从A与B值间是一对多的联系,可得 B→A。
从C值与D值间的一对一联系,可得 C→D 和 D→C。
如果
X
→
Y
X→Y
X→Y和
Y
→
X
Y→X
Y→X同时成立,则可记为
X
←
→
Y
X←→Y
X←→Y。也就是在关系中,X值和Y值具有一一对应关系,从函数依赖的角度讲,它们等价。
各种函数依赖
-
完全依赖:
通过{学生学号, 选修课程名}可以得到{该生本门选修课程的成绩},
而通过单独的{学生学号}或者单独的{选修课程名}都无法得到该成绩,
则说明{该生本门选修课程的成绩}完全依赖于{学生学号,选修课程名} -
部分函数依赖:
通过{学生学号,课程号}可以得到{该生姓名},而通过单独的{学生学号}已经能够得到{该生姓名},则说明{该生姓名}部分依赖于{学生学号,课程号};
又比如, 通过{学生学号,课程号}可以得到{课程名称},而通过单独的{课程号}已经能够得到{课程名称},则说明{课程名称}部分依赖于{学生学号,课程号}。(部分依赖会造成数据冗余及各种异常。)
3.传递函数依赖:
在关系R(学号,宿舍,费用)中,通过{学号}可以得到{宿舍},通过{宿舍}可以得到{费用},而反之都不成立,则存在传递依赖{学号}->{费用}。(传递依赖也会造成数据冗余及各种异常。)
4.平凡函数依赖
定义:
若X->Y,且Y是X的子集(对任一关系模式,平凡函数依赖必然成立),就是平凡函数依赖。
例如:
在学生表(学号,姓名,年级)中,(学号,姓名)可以推出学号和姓名其中的任何一个,这就是平凡函数依赖.
直白点说,就是只要Y是X的子集,Y就依赖于X。
5.非平凡函数依赖
定义:
若X->Y,但Y不是X的子集,就是非平凡函数依赖。
例如:
在学生表(学号,姓名,年级)中,通过(学号,姓名)可以推出这个学生所在的年级,但年级不是(学号,姓名)的子集,这是非平凡函数依赖.
6.多值函数依赖:
设R(U)是一个属性集合U上的一个关系模式,X, Y, 和Z是U的子集,并且Z=U-X-Y,多值依赖X->->Y成立当且仅当对R的任一个关系r,r在(X,Z)上的每个值对应一组Y的值,这组值仅仅决定于X值而与Z值无关。
若X->->Y,而Z=空集,则称X->->Y为平凡的多值依赖。
否则,称X->->Y为非平凡的多值依赖。
平凡多值依赖就是,属性集合中分为两个真子集,每一个X对应一组Y的取值
可以看出,如果把上面的一组改为一个,那么多值依赖就变成了函数依赖。当然一个值组成的组也是组,所以说,函数依赖是多值依赖的特殊情况。
表中,U = C+T+B,(C,T)确定一组B,但是这组B其实与T无关,仅由C确定,所以(C,T)->->B。又因为T不是空集,所以(C,T)->->B为非平凡多值依赖。
要想消除多值依赖,可以分解为:(C,T), (C,B):
对于R中的每个非平凡多值依赖X->->Y(Y不属于X),X都含有候选码,则R属于4NF。
分析:对于每一个非平凡多值依赖X->->Y,X若含有候选码,也就是X->Y,所以4NF所允许的非平凡多值依赖是函数依赖。
1.第一范式1NF
1NF的定义为:符合1NF的关系中的每个属性都不可再分。
2.第二范式2NF
3.第三范式3NF
3NF在2NF的基础之上,消除了非主属性对于码的传递函数依赖。
4.BCNF范式
要在 3NF 的基础上消除主属性对于码的部分与传递函数依赖。
5.第四范式
总结:
1NF: 字段是最小的的单元不可再分
2NF:满足1NF,表中的字段必须完全依赖于全部主键而非部分主键 (一般我们都会做到)
3NF:满足2NF,非主键外的所有字段必须互不依赖4NF:满足3NF,消除表中的多值依赖
1、存在非主属性对码的部分依赖,如:R(A,B,C),AB为码,B->C,则为1NF
2、存在非主属性对码的传递函数依赖,如:R(A,B,C),A->B,B->C,A为码,则为2NF
3、不存在非主属性对码的部分和传递函数依赖,如R(A,B,C),AB->C,C->B,码为AB和AC,A,B,C均为主属性,为3NFB
4、消除任何属性对码的部分和传递函数依赖,即每个函数依赖的左部都包含码,如R(A,B,C),A->C,A->B,则为BCNF。
4NF:关系中每个非平凡的多值依赖的左部都包含码,即消除非平凡且非函数依赖的多值依赖,如R(A,B,C),A->C,A->B,则为BCNF也为4NF,