第6章 关系数据理论—函数依赖
1、前言
首先回顾一下五元组的知识:
在关系数据库中,一个关系模式对应一个五元组。
R(U,D,DOM,F)
/*
关系名R是符号化的元组语义。
U为一组属性。
D为属性组U中的属性所来自的域。
DOM为属性到域的映射。
F为属性组U上的一组数据依赖。
*/
此次由于D(域)、DOM(映射)与模式设计关系不大,因此可以将关系模式当做一个三元组。
一个关系模式可以当做一个数据表的表头,而一个数据表是关系模式的实例化结果。
Sno |
Sdept |
Mname |
Cno |
Grade |
---|---|---|---|---|
S1 | 计算机系 | 张明 | C1 | 95 |
S2 | 计算机系 | 张明 | C1 | 90 |
S3 | 外语系 | 李三 | C2 | 80 |
S4 | 文学系 | 王佳 | C2 | 92 |
… | … | … | … | … |
F(数据依赖):是现实世界属性间相互联系的抽象,是数据内在的性质,是数据语义的体现。是一个关系内部属性与属性之间的一种约束条件。
这种约束关系通过属性间值的相等与否体现出来的数据间的相互关系。
- 函数依赖
- 多值依赖
函数依赖是普遍存在的一种数据依赖。
例如:学生关系中,可以有学号(Sno)、姓名(Sname)、系名(Sdept)等属性,由于一个学号只对应一个学生,一个学生只能在一个系学习。
所以存在函数依赖关系是:Sname=f(Sno),Sdept=f(Sno)
类似数学中的对应关系:学号函数决定学生姓名、学号函数决定学生所在系
例:建立学生关系数据库,所涉及的对象包括学生的学号(Sno)、系名(Sdept)、系主任名(Mname)、课程号(Cno)和成绩(Grade),假设用一个单一的关系模式Student来表示,该关系模式的属性集合为:
U={Sno,Sdept,Mname,Cno,Grade}
根据现实世界已知的事实语义得到属性组U上的一组函数依赖F:
F={Sno->Sdept,Sdept->Mname,(Sno,Cno)->Grade}
因此可以得到一个描述学生的关系模式Student<U,F>
,上表是此关系模式在某一时刻的实例。
不合适的依赖关系会导致很多问题:
- 数据冗余
- 更新异常
- 插入异常
- 删除异常
一个好的模式应该不会出现更新异常、插入异常、删除异常,数据冗余度应尽可能少。
我们将上述的关系模式更改成一下三个关系模式:
S(Sno,Sdept,Sno->Sdept);
SC(Sno,Cno,Grade,(Sno,Cno)->Grade);
DEPT(Sdept,Mname,Sdept->Mname)
将一个模式改成问题较小的一个或多个模式就是模式的规范化操作。
2、规范化
规范化就是根据函数间的依赖情况来降低属性间的某些不合适的性质。
通常按照属性间依赖情况来区分关系规范化程度为:1NF
、2NF
、3NF
、BCNF
、4NF
6.2.1 函数依赖
定义1:设R(F)是属性集U上的关系模式,X,Y是U的子集。若对于R(U)的任意一个可能的关系r,r中不可能存在两个元组在X上的属性值相等,而在Y上的属性值不等,则称X函数确定Y或者Y函数依赖于X,记作X->Y。
函数依赖只能根据语义来确定。
函数依赖不是指关系模式R的某个或某些关系满足的约束条件,而是指R的一切关系均要满足的约束条件。
名词解释:
-
非平凡的函数依赖:X函数确定Y,但X不包含Y,称X->Y是非平凡的函数依赖
-
平凡的函数依赖:X函数确定Y,但X包含Y,称X->Y是平凡的函数依赖
-
决定因素:X函数依赖Y,称X是此函数依赖的决定属性组,也称决定因素
定义2:在R(U)中,如果X->Y,并且对于X的任何一个真子集x,都有x不能函数确定Y,则称Y完全函数依赖于X,若X->Y,但Y不完全函数依赖于X,则称Y部分函数依赖于X。
(Sno,Cno)->Grade,/*完全函数依赖*/
(Sno,Cno)->Sdept,/*部分函数依赖,因为是由Sno决定Sdept,而Sno是真子集*/
定义3:在R(U)中,如果X->Y,Y不包含于X,Y不函数依赖于X,Y->Z,Z不包含于Y,则称Z对X传递函数依赖。
Sno->Sdept,Sdept->Mname ==> Sno->Mname;/*Mname传递依赖于Sno*/
此部分请结合以上的定义理解!!!
函数依赖是关系模式中,属性之间的依赖关系。根据现实世界的语义来确定属性间是否存在函数依赖。
例:学号(Sno
)唯一对应学生的姓名(Sname
),学生姓名确定后,学生的系别(Sdept
)即可确定,学生所在系确定了,系主任(Mname
)即可确定。课程号(Cno
)唯一确定课程名(Cname
),学号和课程号共同确定学生成绩(Grade
)。
-
非平凡的函数依赖:
(Sno,Cno)
可以确定Grade
,但是Grade
不属于(Sno,Cno)
,记X=(Sno,Cno)
,Y=Grade
,因为Y不是X的子集,所以此函数依赖为非平凡的函数依赖。 -
平凡的函数依赖:
(Sno,Cno)
可以确定Sno
或Cno
,但是Sno
属于(Sno,Cno)
,记X=(Sno,Cno)
,Y=Sno
,,因为Y是X的子集,所以次函数依赖为平凡的函数依赖平凡的函数依赖是必然成立的。
-
完全函数依赖:
(Sno,Cno)
可以确定Grade
,但是Sno
或者Cno
都不能函数确定Grade
,记X=(Sno,Cno)
,Y=Grade
,x=Sno
或Cno
,x不能函数确定Y,所以此函数依赖是完全函数依赖。 -
部分函数依赖:
(Sno,Cno)
可以函数确定Sdept
,但是只有Sno
唯一确定Sdept
即可,记X=(Sno,Cno)
,Y=Sdept
,x=Sno
,x可以函数确定Y,所以此函数依赖是部分函数依赖。 -
传递函数依赖:
Sno
可以确定Sdept
,Sdept
可以确定Mname
,且Sdept
不属于Sno
所在的集合,Mname
不属于Sdept
的集合,记X=Sno
,Y=Sdept
,Z=Mname
,此时X可以传递函数确定Z,所以此函数依赖是传递函数依赖。
2.2码
2.2 码
在关系模式中,码的概念十分重要。
定义4:设K为R<U,F>中的属性或属性组合,若U完全函数依赖于K,则称K为R的候选码。
如果U部分函数依赖于K,则称K为超码。候选码是最小的超码,即K的任意一个真子集都不是候选码。
-
主码:候选码多于一个时,选定一个候选码当做主码(
primary key
),用来唯一标识此关系模式。 -
主属性:包含在任何一个候选码中的属性称为主属性。
-
非主属性:不包含在任何候选码中的属性称为非主属性。
-
全码:整个属性组都是码,称此属性组为全码。
例:关系模式S(Sno
,Sdept
,Sage
)中单个属性Sno
是码,关系模式SC(Sno,Cno
,Grade)中属性组合(Sno,Cno
)是码。
例:关系模式R(P,W,A)中,属性P表示演奏者,W表示作品,A表示听众。假设一个演奏者可以演奏多个作品,某一作品可以被多个演奏者演奏,听众也可以欣赏不同演奏者的不同作品,这个关系模式的码为(P,W,A),即全码
定义5:关系模式R中属性或属性组X并非R的码,但X是另一个关系模式的码,则称X是R的外码(foreign key
)。
例如:在SC(Sno,Cno
,Grade)中,Sno
不是码,但是Sno
是关系模式S(Sno
,Sdept
,Sage
)的码,则Sno
是关系模式SC的外码。
主码和外码提供了一个表示关系间联系的手段。
个关系模式的码,则称X是R的外码(foreign key
)。
例如:在SC(Sno,Cno
,Grade)中,Sno
不是码,但是Sno
是关系模式S(Sno
,Sdept
,Sage
)的码,则Sno
是关系模式SC的外码。
主码和外码提供了一个表示关系间联系的手段。