关系数据库中的函数依赖
关系模式中的各属性之间的相互依赖,相互制约的联系称为数据依赖。
数据依赖一般分为函数依赖,多值依赖,连接依赖,最重要的是函数依赖。
1.函数依赖是关系模式中属性之间的一种逻辑依赖关系。
下面是展示的3个关系示例:
学生关系:S(SNO,SN,AGE,DEPT);
选课关系:SC(SNO,CNO,SCORE);
系关系:D(DEPT,MN);
由于一个SNO对应一个学生,而一个学生只属于一个系,所以当SNO确定之后,SN,AGE,DEPT的值也唯一确定了,可以说SNO决定函数(SN,AGE,DEPT),或者是(SN,AGE,DEPT)函数依赖于SNO。或者表示为:SN0->(SN,AGE,DEPT);可以抽象成:X->Y(Y依赖于X,X决定Y)。
平凡依赖与非平凡依赖
非平凡函数依赖和部分函数依赖的区别就在于X包不包含Y,也就是Y是不是X的子集的区别。
比如:非平凡:SN0->(SN,AGE,DEPT)
平凡:(SNO,CNO)->CNO
函数依赖反应了一种语义完整性约束,比如SN->AGE,这种必须是在学生没有重名的条件下才能成立。
2.函数依赖与属性之间的联系类型有关
在一个关系模式中,如果属性X与Y有1:1联系,则存在X<->Y,比如如果学生不存在重名,SNO<->SN
如果X与Y有1:m关系,比如SNO与AGE之间为1:m联系,SNO->AGE,SNO->DEPT(班级)
如果是m:n,则不存在任何函数依赖,比如一个学生可以选择多门课程,这个课程可以由多个学生选择
3.函数依赖的存在与否与时间无关
因为函数依赖是指关系中的所有元组应该满足的约束条件,而不是关系中的某个或某些元组所满足的约束条件。关系中的元组的增删改都不能破坏这种函数依赖,
所以必须根据语义来确定属性之间的函数依赖,不是根据某一时刻关系中的实际数据来判断
4.函数依赖的定义
设关系模式R(U),U是属性全集,X和Y是U的子集,如果X->Y,并且对于X的任何一个真子集X',都有X'不决定Y,则称Y对完全函数依赖。否则称为部分函数依赖。
注意:只有当决定因素是组合属性的时候,讨论部分依赖才有意义,当决定因素是单属性的时候,只能是完全函数依赖。
比如:SNO->(SN,AGE,DEPT),决定因素是SNO,不存在部分函数依赖。
设关系模式R(U),U是属性全集,X和Y是U的子集,X,Y,Z是U的子集。若X->Y,Y->Z,但Y不决定X,则称Z对X传递函数依赖,但是如果X<->Y,则称Z对X直接函数依赖。
比如:学号->班级,班级->讲师,但是讲师不能决定班级,所以讲师对学号是传递函数依赖。假设学生不重名,学号决定学生名,学生名决定学号,学生名决定了班级,这时候班级对学号是直接函数依赖。