函数依赖(理论及举例)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
函数依赖(理论及举例)
教你如何理解函数依赖
一、函数依赖的概念
函数依赖:函数依赖就是讨论一个数据表(关系)中属性值之间所存在的函数关系。函数是一种数学中的概念,被引入到数据库中对数据的联系进行分析。
在一个关系中,属性相当于数学上的变量,属性的域相当于变量的取值范围,属性在一个元组上的取值相当于属性变量的当前值。
例如:在下面的这个职工关系中,职工号、姓名、性别、年龄、职务等属性都相当于变量;职工号属性的域,即四位十进制数字,就是取值范围,性别属性的域:{男、女},就是性别属性的取值范围。此关系中包含有6个元组,如第2个元组为{3051、刘平、男、48、副处},其中的每个属性值都是对应属性在该元组上的当前值。
单值函数和多值函数:元组中一个属性或一些属性值对另一个属性值的影响相当于自变量值对函数值的影响。当给定一个自变量值能求出唯一的一个函数值时,称此为单值函数或单映射函数,否则为多值函数。在单值函数中由自变量的一个值确定函数的一个值,但不同的自变量值允许具有相同的函数值。如f(x)=2x, f(n)=(-1)^n, f(x)=x^3+1等都是单值函数,由自变量x或n的值能够唯一确定f(x)或f(n)的值。
属性的单值函数决定(依赖):在一个关系中,若一个或一组属性的值对另一个或一组属性值起到决定性的作用,则称为单值函数决定(依赖)。如上表中职工号的值就能够函数决定其余每个属性的值,也就是说,当职工号给定后,其他每个属性的值就跟着唯一地确定了。如假定职工号为3074,则他的姓名必定是王海,性别必定为男,年龄必定为32岁,职务必定为正科。这就叫做职工号能够分别单值函数决定姓名、性别和年龄属性,反过来,可以说姓名、性别和年龄等属性单值函数依赖于职工号属性。
二、函数依赖的定义
定义:设一个关系为R(U),X和Y为属性集U上的子集,若对于X上的每个值都有Y上的一个唯一值与之对应,则称X和Y具有函数依赖关系,并称X 函数决定Y,或称Y函数依赖于X,记作X→Y,称X为决定因素。
例如:设一个职工关系为(职工号,姓名,性别,年龄,职务),职工号用来标识每个职工,选作为该关系的主码。对于该关系中每个职工的职工号,都对应着姓名属性中的唯一值,即该职工的姓名,或者说一个职工的姓名由其职工号唯一确定,所以称职工号函数决定姓名,或称姓名函数依赖于职工号,记作“职工号→姓名”,职工号为该函数依赖的决定因素。同理,当一名职工的职工号被确定之后,它所对应的性别、年龄、职务等属性值就被唯一确定下来了,所以职工号函数决定性别、年龄、职务等描述职工特征的每个属性,可以分别记作为“职工号→性别”、“职工号→年龄”、“职工号→职务”。
在该关系中除职工号外,其他属性都不能成为决定因素形成函数依赖,因为对于它们的每个属性值,都可能对应另一属性的多个不同的取值。如对于性别属性的一个取值“男”就会对应多个而不是一个职工号,此不是单值函数依赖,而是多值函数依赖,所以不能由性别来决定职工号。
相互函数依赖:在这个职工关系中,若规定不允许职工有重名,则姓名也能够唯一标识一个元组,这样姓名也能够函数确定其他每个属性,此时职工号和姓名在取值上一一对应,相互成为决定因素,即构成相互函数依赖,记作为“职工号←→姓名”。但通常是允许职工重名的,因为不应该让已经重名的职工重新起名,这样姓名就不能成为关系的候选码,就不能函数决定其他任何属性。
若一个关系中的属性子集X不能函数决定另一个属性子集Y,则记作X Y,读作X不能函数决定Y,或Y不能函数依赖于X。
三、平凡和非平凡函数依赖
定义:设一个关系为R(U),X和Y为属性集U上的子集,若X→Y且X不包含Y,则称X→Y为非平凡函数依赖,否则若X Y则必有X→Y,称此X→Y 为平凡函数依赖。
例如:在一个职工关系中,职工号总能函数决定它本身,记作“职工号→职工号”,对于任一个给定的职工号,都有它本身的职工号值唯一对应,此为平凡函数依赖。又如:职工号和性别构成的属性子集总是能够函数决定其中的职工号或性别属性,可分别记作为“(职工号,性别)→职工号”和“(职工号,性别)→性别”,因为对于任何给定的一个元组中的职工号和性别的组合值,都唯一对应一个职工号值或性别值,不可能出现其他的职工号值或性别值,此种也为平凡函数依赖。
通常,主要讨论的是非平凡函数依赖,即X→Y且X Y。如在职工关系中,职工号函数决定其他每个属性都是非平凡函数依赖,另外“(职工号,姓名)→性别”也是非平凡函数依赖,虽然在这里由决定因素中所含的职工号单属性就能够函数决定性别,而带有的姓名属性有些多余。
四、完全和部分函数依赖
定义:设一个关系为R(U),X和Y为属性集U上的子集,若存在X→Y,同时X的一个真子集X’也能够函数决定Y,即存在X’→Y,则称X→Y的函数依赖为部分函数依赖,或者说,X部分函数决定Y,Y部分函数依赖于X;否则若在X中不存在一个真子集X’,使得X’也能够函数决定Y,则称X完全函数决定Y,或Y完全函数依赖于X。X→Y的部分函数依赖也称为局部函数依赖。
例如:在上面介绍的职工关系中,职工号同其他每个属性之间的函数依赖都是完全函数依赖,因为职工号是一个单属性决定因素,它不可能再包含其他任何属性,也就不可能存在真子集函数决定其他每个属性的情况存在。另外,如“(职工号,性别)”的值虽然能够函数决定相应职工的年龄,但其中的真子集职工号就能够函数决定其年龄,所以(职工号,性别)到年龄之间的函数依赖为部分函
数依赖。即在“(职工号,性别)→年龄”的函数依赖中存在着“职工号→年龄”的函数依赖。
又例如:设一个教师任课关系为(教工号,姓名,职称,课程号,课程名,课时数,课时费),该关系给出某个学校每个教师在一个学期内任课安排的情况,假定每个教师可以讲授多门课程,每门课程可以由不同教师来讲授。
侯选码:在该关系中,由教工号和课程号的组合能够唯一确定一个元组,即确定哪个教师讲授哪门课程,所以(教工号,课程号)为关系的候选码。
函数依赖分析:一个教师的姓名和职称完全由该教师的教工号决定,所以该关系中存在“教工号→姓名”和“教工号→职称”这两个函数依赖。一个教师所讲授某门课程的课程名和课时数,完全由该门课程的课程号所决定,所以该关系中又存在“课程号→课程名”和“课程号→课时数”这两个函数依赖。一个教师所讲某门课程的课时费通常是由教师的职称和课程号共同决定的,即存在“(职称,课程号)→课时费”这个函数依赖,它也是一种完全函数依赖,因为职称和课程号中的任何一个属性都不能单独决定课时费的多少。
该关系的侯选码为(教工号,课程号),“(教工号,课程号)→姓名”,“(教工号,课程号)→职称”,“(教工号,课程号)→课程名”,“(教工号,课程号)→课时数”等都是部分函数依赖,因为它们前项中的一个属性就能够函数决定后面的属性。
五、传递函数依赖
定义:一个关系为R(U),X,Y和Z为属性集U上的子集,其中存在X→Y 和Y→Z,但Y不决定X,同时Y不包含Z,则存在X→Z,称此为传递函数依赖,即X传递函数决定Z,Z传递函数依赖于X。
注意:在这里必须强调的是Y不反过来函数决定X,因为如果X→Y同时
Y→X,则X和Y为相互决定的函数依赖关系,记作为“X←→Y”,这样X和Y 是等价的,在函数依赖中是可以互换的,X→Z就是直接函数依赖,而不是传递函数依赖了。
另外,Y不包含Z也是必须满足的条件,因为如果YêZ,则X→Y必然包含着X直接函数决定Y中的每个子集,这使得X→Z为直接函数依赖而不是传递函数依赖。
例如:设一个学生关系为(学号,姓名,性别,系号,系名,系主任名),