首页 > 代码库 > 边学边思考——数据库中函数依赖与多值依赖的辨析
边学边思考——数据库中函数依赖与多值依赖的辨析
我们先复习下什么是函数:函数是发生在集合之间的一种对应关系(我喜欢用图理解)
图中表示的是函数中的单射、满射和双射。简而言之就是集合的对应关系,而集合中的值一般满足一对一和多对一的关系,不能存在一对多的关系。
基于上述对函数的理解,我们给出函数依赖的定义:
设R(U)是属性集U上的关系模式,X,Y是U的子集,若对R(U)的任意一个可能的关系r,r中不可能存在两个元祖在X上的属性值相等,而在Y中的属性值不等,则记为X→Y。简而言之,函数依赖是某个属性集决定另一个属性集时,称另一属性集依赖于该属性集。(事实上就是不能出现一对多的关系)
我们先区分函数依赖与属性集中属性的三种关系
设R(U)是属性集U上的关系模式,X、Y是U的子集:
● 如果X和Y之间是1:1关系(一对一关系),如学校和校长之间就是1:1关系,则存在函数依赖X → Y和Y →X。
● 如果X和Y之间是1:n关系(一对多关系),如年龄和姓名之间就是1:n关系,则存在函数依赖Y → X。
●如果X和Y之间是m:n关系(多对多关系),如学生和课程之间就是m:n关系,则X和
用数学上的映射关系来理解,比如f(x)=2x;f(x,y)=x^+2y;f(x,y,z)=x+y-z等等,函数中变量元对应U中的X,所有X中的确定值经过函数关系的运算后组成Y。
其次,函数依赖包括以下几种
1.平凡函数依赖
当关系中属性集合Y是属性集合X的子集时,存在函数依赖X→Y,即一组属性函数决定它的所有子集,这种函数依赖称为平凡函数依赖。
2.非平凡函数依赖
当关系中属性集合Y不是属性集合X的子集时,存在函数依赖X→Y,则称这种函数依赖为非平凡函数依赖。
3.完全函数依赖
设X,Y是关系R的两个属性集合,X’是X的真子集,存在X→Y,但对每一个X’都有X’!→Y,则称Y完全函数依赖于X。
4.部分函数依赖
设X,Y是关系R的两个属性集合,存在X→Y,若X’是X的真子集,存在X’→Y,则称Y部分函数依赖于X。
5.传递函数依赖
设X,Y,Z是关系R中互不相同的属性集合,存在X→Y(Y !→X),Y→Z,则称Z传递函数依赖于X。(如果Y→X,则X→Z成立了)
用一个例子来理解上述的定义(A—\ →B表示A 不函数依赖于 B)
表1——学生(学号, 姓名, 性别, 年龄, 学院)
假设我们做表不允许重名
学号→ 性别, 学号 → 年龄, 学号→ 学院,学号←→ 姓名,,姓名→ 性别, 姓名→ 年龄,姓名→ 学院,但性别—\ →Sage
-----------------------------------------------------------------------------------------------------------------
表2——学生课程(学号,课程,成绩)
学号→课程,(学号,课程)→成绩
-----------------------------------------------------------------------------------------------------------------
表3——学院系(学号,系名,系主任)
学号 → 系名,系名 → 系主任
在上述例子中:
平凡函数依赖: (学号,课程)→学号,(学号,课程)→课程。
因为学号和课程都是(学号,课程)的子集。
非平凡函数依赖: (学号,课程)→成绩(数据库中讨论得比较多是非平凡函数依赖,而平凡意义不大)
因为成绩不是(学号,课程)的子集。
部分函数依赖:(学号,姓名)→ 性别
因为(学号,姓名)→ 性别 且 学号 → 性别
完全函数依赖:(学号,课程号)→ 成绩
因为(学号,课程号)→ 成绩,学号 —\→ 成绩,课程号 —\→ 成绩。
传递函数依赖: 学号 → 系主任
因为学号 → 系名,系名 → 系主任 且 系名 —\→ 学号。
而多值依赖呢?给出定义
多值依赖的定义:
设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为非平凡的多值依赖。
依然用函数的映射关系来理解,引入f(x,y),假设f(x,y)=+-(x^),若z=f(x,y),则一个x值可以得出两个互为相反数的z。在这个二元函数关系中,y的取值事实上是不影响结果的。类比到关系模式上,即x为X集的属性值,y为Y集的属性值,z为Z集的属性值。
看看一个例子
(课程C) ——(教师T)—(参考书B)
数据库概率 —顾国生老师——数学分析
数据库概率 —顾国生老师——高等代数
数据库概率 —顾国生老师——微分方程
上述例子U{C,T,B},其中课程C和教师T唯一确定一组B,却与T无关,经由C决定,然而T并不是空集,所以是非平凡的多值依赖。
事实上,当T为空的时候,如果C中的每一个值c对应B中的一个确定的值,则变为函数依赖,所以函数依赖是多值依赖的一种特殊情况。
总计下:
1. 函数依赖不是指关系模式R的某个或某些关系实例满足的约束条件,而是指R的所有关系实例均要满足的约束条件。
2. 函数依赖是语义范畴的概念。只能根据数据的语义来确定函数依赖。(例如“姓名→年龄”这个函数依赖只有在不允许有同名人的条件下成立)
3. 函数依赖通常以集合抽闲出来讨论。
4. 数据库设计者根据需求对函数关系进行制定。例如认为“姓名→年龄”在特定表中可行。
5. 数据库设计者根据现实规定做强制要求。例如规定不允许同名人出现,函数依赖“姓名→年龄”成立。所插入的元组必须满足规定
的函数依赖,若发现有同名人存在, 则拒绝装入该元组。
边学边思考——数据库中函数依赖与多值依赖的辨析