转自http://kjwy.5any.com/sjkyl/Content/ch04/040202/index1.htm
一、为什么要引入多值依赖
前面完全是函数依赖的范畴内讨论关系模式问题。如果仅考虑函数依赖这一种数据依赖,属于BCNF的关系模式已经很完美了。但如果考虑其他数据依赖,例如,多值依赖,属于BCNF的关系模式仍存在问题,不能算作是一个完美的关系模式。
【例如】设学校中某一门课程由多个教师讲授,他们使用相同的一套参考书。可以用一个关系模式Teach(C,T, B)表示课程C、教师T和参考书B之间的关系。假设该关系如图4-8所示:
………………………
………………………
图4-8 课程-教师-参考书之间的关系
设关系可用二维表表示如下:
课程C |
教师T |
参考书B |
数学 |
邓军 |
数学分析 |
数学 |
邓军 |
高等代数 |
数学 |
邓军 |
微分方程 |
数学 |
陈斯 |
数学分析 |
数学 |
陈斯 |
高等代数 |
数学 |
陈斯 |
微分方程 |
物理 |
李平 |
普通物理学 |
物理 |
李平 |
光学原理 |
物理 |
王强 |
普通物理学 |
物理 |
王强 |
光学原理 |
物理 |
刘明 |
普通物理学 |
物理 |
刘明 |
光学原理 |
…… |
…… |
…… |
…… |
…… |
…… |
Teach具有唯一侯选码(C,T,B),即全码,因而Teach∈BCNF。但Teach模式中存在一些问题:
●数据冗余度大
【例如】每一门课程的参考书是固定的,但在Teach关系中,有多少名任课教师,参考书就要存储多少次,造成大量的数据冗余。
●增加操作复杂
【例如】当某一门课程增加一名任课教师时,该课程有多少本参考书,就必须插入多少个元组。
●删除操作复杂
【例如】某一门课要去掉一本参考书,该课程有多少名教师,就必须删除多少个元组。
●修改操作复杂
【例如】某一门课要修改一本参考书,该课程有多少名教师,就必须修改多少个元组。
BCNF的关系模式之所以会产生上述问题,是因不参考书的取值和教师的取值是彼此独立毫无关系的,它们都只取决于课程名。也就是说,关系模式Teach中存在一种称之为多值依赖的数据依赖。
二、重要定义
定义4.10 设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为非平凡的多值依赖。
在Teach关系中,每个(C,B)上的值对应一组T值,而且这种对应与B无关。
【例如】(C,B)上的一个值(物理,光学原理)对应一组T值(李平,王强,刘明),这组值仅仅决定于课程C上的值,也就是说对于(C,B)上的另一个值(物理,普通物理学),它对应的一组T值仍是(李平,王强,刘明),尽管这时参考书B的值已经改变了。因此T多值依赖于C,即C→→T。
多值依赖也可以形式化地定义如下:
定义4.11 在关系模式R(U)的任一关系r中,如果对于任意两个元组t,s,有t[X]=s[X],就必存在元组w,v∈r(w和v可以与s和t相同),使得w[X]=v[X]=t[X],而w[Y]=t[Y],w[Z]=s[Z],v[Y]=t[Z],即交换s,t元组的Y值所得的两个新元组必在r中,则称Y多值依赖于X,记为X→→Y。其中,X和Y是U的子集,Z=U-X-Y。
多值依赖具有下列性质:
●多值依赖具有对称性。即若X→→Y,则X→→Z,其中Z=U-X-Y。
●多值依赖具有传递性。即若X→→Y,Y→→Z,则X→→Z-Y。
●函数依赖可以看作是多值依赖的特殊情况。
●若X→→Y,X→→Z,则X→→YZ。
●若X→→Y,X→→Z,则X→→Y∩Z。
●若X→→Y,X→→Z,则X→→Y-Z,X→→Z-Y。
●多值依赖的有效性与属性集的范围有关。
●若多值依赖X→→Y在R(U)上成立,对于Y'Y,并不一定有X→→Y’成立。但是如果函数依赖X→Y在R上成立,则对于任何Y'Y均有X→Y’成立。
定义4.12 关系模式R<U,F>∈1NF,如果对于R的每个非平凡多值依赖X→→Y(),X都含有侯选码,则R∈4NF。
4NF就是限制关系模式的属性之间不允许有非平凡且非函数依赖的多值依赖。因为根据定义,对于每一个非平凡的多值依赖X→→Y(),X都含有侯选码,于是当然X→Y,所以4NF所允许的非平凡多值依赖实际上是函数依赖。
显然,如果一个关系模式是4NF,则必为BCNF。
前面讨论过的关系模式Teach中存在非平凡的多值依赖C→→T,且C不是侯选码,因此Teach不属于4NF。这正是它之所以存在数据冗余度大、插入和删除操作异常复杂等弊病的根源。可以用投影分解法把Teach分解为如下两个4NF关系模式以减少数据冗余。
CT(C,T)
CB(C,B)
CT中虽然有C→→T,但这是平凡多值依赖,即CT中已不存在既非平凡也非函数依赖的多值依赖。所以CT属于4NF。同理,CB也属于4NF。分解后Teach关系中的几个问题可以得到解决。
●参考书只需要在CB关系中存储一次。
●当某一课程增加一名任课教师时,只需要在CT关系中增加一个元组。
●某一门课要去掉一本参考书,只需要在CB关系中删除一个相应的元组。
函数依赖和多值依赖是两种最重要的数据依赖。如果只考虑函数依赖,则属于BCNF的关系模式已经很完美了。如果考虑多值依赖,则属于4NF的关系模式已经很完美了。事实上,数据依赖中除函数依赖和多值依赖之外,还有一种连接依赖。函数依赖是多值依赖的一种特殊情况,而多值依赖实际上又是连接依赖的一种特殊情况。有兴趣的读者可以参考相关书籍。