Fork me on GitHub

数据依赖之函数依赖和多值依赖

数据依赖是一个关系内部属性与属性之间的一种约束关系。这种约束关系是通过属性间值的相等与否体现出来的数据间的相关联系。
其中最重要的是函数依赖多值依赖


例1.函数依赖

建立一个描述学校教务的数据库,该数据库涉及的对象包括学生的学号(Sno)、所在系(Sdept)、系主任姓名(Mname)、课程号(Cno)和成绩(Grade)。假设用一个单一的关系模式Student来表示,则该关系模式的属性集合为U={Sno,Sdept,Mname,Cno,Grade}
现实世界的已知事实告诉我们:
①一个系有若干学生,但一个学生只属于一个系。Sno->Sdept
②一个系只有一名负责人。Sdept->Mname
③一个学生可以选修多门课程,没门课程有若干学生选修。
④每个学生学习每一门课程有一个成绩。{Sno,Cno}->Grade
于是得到属性U上的椅子函数依赖F={Sno->Sdept,Sdept->Mname,{Sno,Cno}->Grade}。

但是这个关系模式存在以下问题:
①数据冗余
②更新异常
③插入异常
④删除异常

例二.完全函数依赖和部分函数依赖

  • U={Sno,Sdept,Mname,Cno,Grade}

    {Sno,Cno}-f->Grade是完全函数依赖。
    {Sno,Cno}-p->Sdept是部分函数依赖,因为Sno->Sdept成立,而Sno是{Sno,Cno}的子集。

  • U =(员工码,姓名,出生日期,联系电话,学历,毕业学校,培训日期,培训内容)
    {员工码,培训日期}-f->U 是完全依赖函数
    {员工码,培训日期}-p->{姓名,出生日期}是部分依赖函数,因为员工码->{姓名,出生日期}成立,而员工码是{姓名,出生日期}的子集

例三 传递函数依赖

  • U={Sno,Sdept,Mname,Cno,Grade}

    Sno->Sdept, Sdept->Mname成立,所以Sno-传递->Mname,系主任是传递依赖于学号的。还要加上条件Sdept-/->Sname,因为如果Sdept->Sname,则Sdept<->Sname,实际上是Sno-直接->Mname,是直接函数依赖而不是传递函数依赖。

  • U={学号,姓名,年龄,班号,班长,课号,成绩}
    学号->班号;班号->班长成立,又班号-/->学号,所以学号-传递->班长。

例四.2NF(第二范式)

2NF:每一个非主属性完全依赖与候选码。
有关系模式S-L-C(Sno,Sdept,Sloc,Cno,Ggrade),其中Sloc为学生的住处,并且每个系的学生住在同一个地方。码为(Sno,Cno),则函数依赖有:
(Sno,Cno)-P->Sdept, 因为Sno->Sdept,Sno是(Sno,Cno)的子集
(Sno,Cno)-P->Sloc, 因为Sno->Sloc, Sno是(Sno,Cno)的子集
(Sno,Cno)-F->Grade
可以看到非主属性Sdept、Sloc并不完全依赖于码(Sno,Cno),因此关系模式S-L-C不符合2NF定义。
一个关系模式R不属于2NF,会产生以下几个问题:
①插入异常
②修改异常
③删除异常
分析:上面的例子中,发现有两类非主属性,一类如Gdrade,它对码是完全函数依赖;另一类如Sdept、Sloc,他们对码是不完全依赖,解决的办法是用投影分解法把关系模式S-L-C分解为两个关系模式:SC(Sno,Cno,Ggrade)和SL(Sno,Sdept,Sloc)。

例五.3NF(第三范式)

属于2NF的同时,每一个非主属性都不传递依赖于码
在例四修改后的SL(Sno,Sdept,Sloc)中,由Sno->Sdept(Sdept-/-Sno),Sdept->Sloc可得,Sno-传递->Sloc,因此SL(Sno,Sdept,Sloc)不符合3NF。
对SC(Sno,Cno,Ggrade),非主属性是Ggrade,不传递依赖于码,所以符合3NF。

例六.BCNF

通常认为BCNF是修正的第三范式,有时也称为扩充的第三范式:
关系模式中,每一个决定因素都包含码。
一个满足BCNF的关系模式有:

  • 所有非主属性对每一个码都是完全函数依赖
  • 所有主属性对每一个不包含他的码也是完全函数依赖
  • 没有任何属性完全依赖于非码的任何一组属性

关系模式STJ(S,T,J)中,S表示学生,T表示教师,J表示课程。每一个教师只教一门课,每门课有若干教师,某学生选定某门课就对应一个固定的教师。由语义可得到如下的函数依赖。
(S,J)->T , (S , T)->J , T->J
因为候选码为(S,J) (S , T),所以S J T都是主属性
STJ是3NF,因为没有任何非主属性对码传递依赖或者部分依赖。
但是STJ不是BCNF,因为T是决定因素但是不包含码,或者对主属性J来说,J对(S , T)是部分依赖,因为T->J,且T是 (S , T)的子集。

例七.多值依赖

学校中某一门课由多个教师讲授,他们使用相同的一套参考书。每个教师可以讲授多门课程,每种参考书可以供多门课使用。
这里写图片描述
关系模型Teaching(C,T,B)码是(C,T,B)即all-key,但是当某一个课程增加一名教师,必须插入多个元组,同样要删掉一本参考书,则必须删除多个元组,这样对数据的增删改很不方便,数据的冗余也很明显,发现他具有一种称为多值依赖的数据依赖,
例如:在关系模式Teaching中,对于一个(物理,光学原理)有一组T值{李勇,王军},这组值仅仅决定于课程C上的值(物理)。也就是说对于另一个(物理,普通物理学),它对应的一组仍是{王军,李勇}。因此T多值依赖于C,即C->->T。

又例如:关系模式WSC(W,S,C)中,W表示仓库,S表示保管员,C表示商品。假设每个仓库有若干保管员,有若干种商品。每个保管员保管所在仓库的所有商品,每种商品被所有保管员保管。
按照语义,对于W的每一个值Wi,S有一个完整的集合与之对应而不问C取何值。所以W->->S。由于C与S具有完全对称性,必然有W->->C成立。

多值依赖的性质:
1.具有对称性
2.具有传递性
3.函数依赖可以看作是多值依赖的特殊情况,这是因为当X->Y时,对X的每一个值x,Y都有一个确定的值y与之对应,所以X->->Y。

多值依赖和函数依赖相比有下面两个基本的区别:
1.多值依赖的有效性与属性集的范围有关。
2.若函数依赖X->Y在R(U)上成立,则对于任何Y’∈Y均有X->Y’成立。而多值依赖X->->Y若在R(U)上成立,却不能断言对于任何Y’∈Y有X->->Y’成立。

例八.4NF

4NF就是限制关系模式的属性之间不允许有非平凡且非函数依赖的多值依赖。
在前面的关系模式WSC(W,S,C)中,W->->S,W->->C,他们都是非平凡的多值依赖。W不是码,关系模式WSC(W,S,C)中的码是(W,S,C),即all-key。因此WSC不满足4NF。

总结

函数依赖和多值依赖是两种最重要的数据依赖,如果只考虑函数依赖,则属于BCNF的关系模式规范化程度已经是最高的了;如果考虑多值依赖,则属于4NF的关系模式规范化程度是最高的。
事实上,除了函数依赖和多值依赖之外,还有其它数据依赖,例如连接依赖。函数依赖是多值依赖的一种特殊情况,而多值依赖又是连接依赖的一种特殊情况。

undefined