4.2.1 函数依赖的基本概念
1)函数依赖
【定义4.1】 设R(U)是一个关系模式,U是R的属性集合,X和Y是U的子集。对于R(U)的任意一个可能的关系r,如果r中不存在两个元组,它们在X上的属性值相同,而在Y上的属性值不同,则称“X函数确定Y”或“Y函数依赖于X”,记作X→Y。
函数依赖和其他数据依赖一样,是语义范畴的概念。只能根据数据的语义来确定函数依赖。例如,知道学生的学号,可以唯一地查询到其对应的姓名、性别等,因而,可以说“学号函数确定了姓名或性别”,记作“学号→姓名”“性别”等。这里的唯一性并非只有一个元组,而是指任何元组,只要它在X(学号)上相同,则在Y(姓名或性别)上的值也相同。如果满足不了这个条件,就不能说它们是函数依赖了。例如,学生姓名与年龄的关系,当只有在没有同名人的情况下可以说函数依赖“姓名→年龄”成立,如果允许有相同的名字,则“年龄”就不再依赖于“姓名”了。
当X→Y成立时,则称X为决定因素(Determinant),称Y为依赖因素(Dependent)。当Y不函数依赖于X时,记为。
如果X→Y,且Y→X,则记其为X←→Y。
特别需要注意的是,函数依赖不是指关系模式R中某个或某些关系满足的约束条件,而是指R的一切关系均要满足的约束条件。
函数依赖概念实际是候选码概念的推广,事实上,每个关系模式R都存在候选码,每个候选码K都是一个属性子集,由候选码定义,对于R的任何一个属性子集Y,在R上都有函数依赖K→Y成立。一般而言,给定R的一个属性子集X,在R上另取一个属性子集Y,不一定有X→Y成立,但是对于R中候选码K,R的任何一个属性子集都与K有函数依赖关系,K是R中任意属性子集的决定因素。
2)函数依赖的3种基本情形
(1)平凡函数依赖与非平凡函数依赖
【定义4.2】 在关系模式R(U)中,对于U的子集X和Y,如果X→Y,但Y不是X的子集,则称X→Y是非平凡函数依赖(Nontrivial Functional Dependency)。若Y是X的子集,则称X→Y是平凡函数依赖(Trivial Functional Dependency)。
例如,在关系模式SC(学号,课程号,成绩)中,(学号,课程号)→成绩是非平凡的函数依赖,而(学号,课程号)→学号和(学号,课程号)→课程号则是平凡的函数依赖。
对于任一关系模式,平凡函数依赖都是必然成立的。它不反映新的语义,因此,若不特别声明,本书总是讨论非平凡函数依赖。
(2)完全函数依赖与部分函数依赖
【定义4.3】 在关系模式R(U)中,如果X→Y,并且对于X的任何一个真子集X',都有X'\→Y,则称Y完全函数依赖(Full Functional Dependency)于X,记作。若X→Y,但Y不完全函数依赖于X,则称Y部分函数依赖(Partial Functional Dependency)于X,记作
。
例如,在关系模式SCD(学号,课程号,系名,系负责人,成绩)中,(学号,课程号)→成绩属于完全函数依赖,(学号,课程号)→系名属于部分函数依赖。
如果Y对X部分函数依赖,X中的“部分”就可以确定对Y的关联,从数据依赖的观点来看,X中存在“冗余”属性。
(3)传递函数依赖
【定义4.4】 在关系模式R(U)中,如果X→Y,Y→Z,且Y\→X,则称Z传递函数依赖(Transitive Functional Dependency)于X,记作。
例如,在关系模式SCD中,学号→系名,系名→系负责人,所以学号系负责人。
传递函数依赖定义中之所以要加上条件,是因为如果Y→X,则X←→Y,这实际上是Z直接依赖于X,而不是传递函数了。
按照函数依赖的定义,可以知道,如果Z传递依赖于X,则Z必然函数依赖于X,如果Z传递依赖于X,说明Z是“间接”依赖于X,从而表明X和Z之间的关联较弱,表现出间接的弱数据依赖,因而亦是产生数据冗余的原因之一。