函数依赖:
目录
函数依赖:
关系模式的规范化:
数据依赖公理:
关系数据库的规范化理论是数据库逻辑设计的工具。
关系模式由五部分组成,是一个五元组:
R(U, D, DOM, F)
关系名
R
是符号化的元组语义
U
为一组属性
D
为属性组
U
中的属性所来自的域
DOM
为属性到域的映射
F
为属性组
U
上的一组数据依赖
当且仅当
U
上的一个关系
r
满足
F
时,
r
称为关系模式
R<U,F>
的一个关系。
作为二维表,关系要符合一个最基本的条件:每个分量必须
是不可分开的数据项。满足了这个条件的关系模式就属于第
一范式(
1NF
)。
数据依赖的类型包括:多值依赖(MVD(Multi-Valued Dependency))和函数依赖(FD(Functional Dependency))。
函数依赖的实例:描述一个学生关系,可以有学号,姓名,系名等属性。
一个学号对应一个学生,一个学生只在一个系中学习。
学号确定后,学生的姓名和所在的系被唯一的确定。
Sname=f(Sno)
,
Sdept=f(Sno)
即
Sno
函数决定
Sname
Sno
函数决定
Sdept
记作
Sno→Sname
,
Sno→Sdept
![](https://img-blog.csdnimg.cn/direct/08db49202c6240c3afe82809545ff273.png)
根据现实世界的已知事实:
一个系有若干学生, 但一个学生只属于一个系;
一个系只有一名(正职)负责人;
一个学生可以选修多门课程,每门课程有若干学生选修;
每个学生学习每一门课程有一个成绩。
我们可以得到在属性组U上的一组函数依赖F:
F={ Sno→Sdept, Sdept→ Mname,
(
Sno, Cno)→ Grade }
也就是:
看一下我们实例化后的表格:
但是这个学生关系存在以下问题:
1,数据冗余高,系名,系主任名重复出现。
2,更新异常,更新数据付出代价比较大,更换系主任后,所有条目都要更新。
3,插入异常,一个元组在主键的属性上存在空时,该元组无法插入。(一个系刚成立,还没有学生,无法插入)。
4,删除异常,删除了不应被删除的数据(学生全部离去,系主任信息也会被删除)。
显然,这不是我们追求的高效的模式,高效的模式要保证插入,删除,更新正常,而且数据冗余要尽可能少。
我们可以通过分解数据模式来消除其中不合适的数据依赖。
试想:
我们先来解释一下概念:
函数依赖
functional dependency, abbr. FD
设:
R
(
A1
,
A2
,
…An)=R( U )
X
,
Y
为
U
的不同子集
r
是
R
的任一具体关系
s,t
是
r
的任意两个元组
①
函数依赖
是完整性约束的一种,它推广了关键字
的概念。
If s[X]=t[X], then s[Y]=t[Y]
②
函数依赖
:若
R
的任意关系有:对
X
中的每个属性值,
在
Y
中都有惟一的值与之对应,则称
Y
函数依赖于
X
,
记作
X ->
Y
。
函数依赖指的是关系模式R的所有实例都要满足约束条件。
给出例子会方便理解:
这里是函数依赖的有:AB->C,C->A。
为什么A->C,AB->D不是呢?
显然,C不依赖与A,D也不依赖于AB。
对于a1,有c1,c2与之对应,对于a1b1,有d1,d2与之对应,不存在依赖关系。
函数依赖与属性之间的关系:
X
,
Y
是
1 — 1
关系,
则存在
X ->
Y
或
Y ->
X
。如学号与借书证号
若
X
,
Y
是
m — 1
关系,
则存在
X ->
Y
但
Y
+
> X
。如学号与姓名
若
X
,
Y
是
m — n
关系,
则
X
,
Y
间不存在函数依赖关系。如姓名与课程
对于第二种情况,存在Y依赖于X,对于每个X,都有唯一的Y位置对应,而对于每一个Y,存在多个X与之对应,所以X不依赖于Y。
X->Y(Y依赖于X)函数依赖可以分为平凡的函数依赖和非平凡的函数依赖。判断标准是Y是否包含于X。
若Y包含于X,则称X是平凡的函数依赖,若Y不包含于X,则称X是非平凡的函数依赖。
若Y依赖于X(X->Y),则称X为这个函数依赖的决定属性组,也称为决定因素。
完全函数依赖和部分函数依赖:
设X->Y(Y依赖于X)。
![](https://img-blog.csdnimg.cn/direct/aef4d3b4428a4a608e1e4c5d3212f4f3.png)
左部分为单属性的函数依赖一定是完全函数依赖,左部分为多属性的函数依赖不一定是完全函数依赖。![](https://img-blog.csdnimg.cn/direct/4e4a8feadeac443383aeae41c0f84266.png)
![](https://img-blog.csdnimg.cn/direct/d7ec751948694b25a46d3ad8f5e22b07.png)
传递性依赖绝对不存在包含关系。
![](https://img-blog.csdnimg.cn/direct/57e91858f1c34fafa9f7c469a1db7722.png)
即整个元组对X形成完全函数依赖。一个X值确定唯一的一个条目。
给出实例方便我们理解:![](https://img-blog.csdnimg.cn/direct/9d1fcf7764c64355a11c27fbe506d44b.png)
由于对于任何一个确定的A,有唯一的条目与之对应,所以A是候选键,因为A是候选键,所以A是主属性。由于对于(D,E)属性组,有唯一的A与之对应,所以(D,E)是候选键,因此,DheE是主属性。
下面我们通过例题来判断候选键和主属性:
![](https://img-blog.csdnimg.cn/direct/b965acdb146f4073835f9b89e13d92fb.png)
自反律可以这样证明:A<-->A,所以AB->A。
要证明谁是候选键,我们只需要证明这个属性或属性组队整个元组都能唯一的决定。即AB->ABCD。
通过主键,我们可以得到主属性,主键是AB,所以主属性是A,B。
![](https://img-blog.csdnimg.cn/direct/9a68cf3b39e44e7d98c4aaf16318e203.png)
关系模式的规范化:
范式是符合某一种级别的关系模式的集合。
关系数据库中的关系必须满足一定的要求。满足 不同
程度要求的为不同范式。
范式的种类:
第一范式
(1NF)
第二范式
(2NF)
第三范式
(3NF)
BC
范式
(BCNF)
第四范式
(4NF)
第五范式
(5NF)
各种范式之间存在联系:
某一关系模式
R
为第
n
范式,
可简记为
R
∈
nNF
。
1NF
⸧
2NF
⸧
3NF
⸧
BCNF
⸧
4NF
⸧
5
NF
一个低一级范式的关系模式,
通过模式分解(
schema
decomposition
)可以转换为
若干个高一级范式的关系模式
的集合,这种过程就叫规范化
(
normalization
)。
用图来表示如下:
第一范式:1NF。
定义
4.5:
若
R
的每个分量都是不可分的数据项,则
R
∈
1NF
。
从型上看:不存在嵌套结构
从值上看,不存在重复组
第一范式是对关系模式的最起码的要求,不满足第一范式的数据库结构不能被称之为关系数据库。
但是满足第一范式的关系模式并不一定是一个好的关系模式。
例如:
是1NF关系,但是存在数据冗余,插入异常和删除异常,更新异常的问题。
第二范式:
2NF
定义4.6
若R∈1NF,且R中的每一个非主属性都完全函数依赖于R的
任一候选键,则R∈2NF。
[
例
] S-L-C(Sno,Sdept,Sloc,Cno,Grade)
,
Sloc
为学生的住处,
并且每个系的学生住在同一个地方。
S-L-C
的码为
(Sno,Cno)
。
如果一个关系模式不是2NF,会产生以下问题:
插入异常
如果插入一个新学生,但该生未选课,即该生无
Cno
,由于插入元组时,必须给定码值,因此插入失败。
删除异常
如果
S4
只选了一门课
C3
,现在他不再选这门课,则删除
C3
后,整个元组的其他信息也被删除了。
修改复杂
如果一个学生选了多门课,则
Sdept
,
Sloc
被存储了多次。如
果该生转系,则需要修改所有相关的
Sdept
和
Sloc
,造成修改的
复杂化。
原因是:Sdept,Sloc部分依赖与码。可以将S-L-C分解为两个关系模式,以消除这些部分函数依赖。
显然,Sdept,Sloc对于(Sno,Cno)是部分函数依赖,对Sno是完全函数依赖。
这样就满足第二范式了。
采用投影分解法将一个1NF的关系分解为多个2NF的关系,可以在一定程度上减轻原1NF关系中存在的插入异常,删除异常,更新异常,数据冗余大,修改复杂等问题,但是不能完全消除。
达到2NF的关系仍然可能存在问题。
例如,在
关系S-L
中还存在以下问题:
(1) 数据冗余。同一个系Sdept,其地址Sloc要重复存
储。
(2) 修改复杂。一个系更换地址时,必须修改相关的多
个元组。
(3) 插入异常。当一个新系成立时,由于还没有一个学
生进来,因缺少主键Sno而不能进行插入操作。
(4) 删除异常。当一个系里的学生毕业以后,会丢失该
系地址。
四、第三范式:
定义4.7
如果关系R的任意一个非主属性都不传递函数依
赖于它的任意一个候选键,则R∈3NF。
即非主属性对候选键不存在函数依赖。
在这张图中,Sloc对Sno是传递依赖,不符合第三范式的条件,因此,这不是第三范式。
我们可以通过破坏传递依赖的条件,来分解第二范式为第三范式。仍然使用投影分解法,将S-L分解为两个关系模式,以消除传递函数依赖。
分解后满足第三范式条件。
显然,一个3NF关系一定是一个2NF关系。(3NF消除传递函数依赖,2NF是完全函数依赖)。
3NF不存在非主属性之间的函数依赖,但是存在主属性之间的函数依赖。(传递函数包含多个依赖,将其中介项作为主属性开辟一个模式,该模式的主属性对原主属性存在函数依赖,非主属性之间不存在函数依赖,否则不满足第三范式中不存在传递依赖的条件)。
判断3NF方法
(1)找候选键,决定非主属性
(2)考察非主属性对候选键的函数依赖是否存在部分
函数依赖,如果存在,则相应的关系模式不是2NF,否则
是2NF。
(3)考察非主属性之间是否存在函数依赖。如果存在
,相应模式不是3NF,否则是3NF。
也可以根据3NF定义,判断是否存在非主属性对候选键
的传递函数依赖。
值得注意的是:如果关系中所有属性都是主属性,则R必定是3NF。
在3NF中,仍然会存在一些问题:
插入异常。例如,一个新课程和任课教师的数据,在没
有学生选课时不能插入数据库。
删除异常。例如,删除某门课的所有选课记录,会丢失
课程与教师的数据。
达到3NF的关系仍然可能存在问题。
可能存在主属性对候选键的部分函数依赖或传递函数
依赖。
BC范式,比3NF更进一步,通常认为BCNF(BC范式)是修正的第三范式,有时也称为扩充的第三范式。
定义如下:
定义4.8
关系模式R<U,F>∈1NF。若函数依赖集合F中的
所有函数依赖X→Y(Y不包含于X)的左部都包含R的任一侯选键,
则R∈BCNF。 换言之,
BCNF
中的所有依赖的左部都必须包含候选键
,则R ∈BCNF 。
给个例子:
例:关系
SCT
是否BCNF?
因为tname→cname,其左部未包含该关系的任一侯选键
,所以它不是BCNF。
下面介绍分解为BC范式的方法:
消除不包含关系。
1.
假设
R(U)
不是
BCNF, X
是
R
的属性子集,
A
是
R
的单个
属性,
X->A
是导致违反
BCNF
的函数依赖,则将
R
分解
为
R-A
以及
XA
。
2.
若
R-A
以及
XA
仍然不是
BCNF
,则在
R-A
以及
XA
递
归地执行上述分解。
所以,上例
就分解成
SC(sno,cname)
和
CT(sno,tname)
BC范式具有的性质:
所有非主属性都完全依赖于每个候选码。
所有主属性都完全依赖于每个不包含它的候选码。
没有任何属性完全依赖于非码的任何一组属性。
定理:一个BC范式一定是3NF。
任何二元关系一定是BCNF。
给出一个例子:
![](https://img-blog.csdnimg.cn/direct/b1ee80590b2849629968c8f908b0c412.png)
当然,这也满足第1,2范式的条件,非主属性对主属性也是完全依赖关系。
![](https://img-blog.csdnimg.cn/direct/b5f86f27551943c38689460e75b087b3.png)
3NF下仍存在插入异常和删除异常,原因在于可能存在主属性对候选键的部分函数依赖和传递函数依赖。
一个模式中的关系模式如果都属于BCNF,则在函数依赖的范畴内实现了彻底的分离,已消除了插入和删除的异常。
第四范式:4NF。
例
:
设学校中某一门课程由多个教师讲授,他们使用相同
的一套参考书。每个教员可以讲授多门课程,每种参考书
可以供多门课程使用。
用关系模式
Teaching(C,T,B)
来表示课程
C
、教师
T
和参考书
B
之间的关系。
我们使用非规范化的关系实例表示:
规范化的二维表:
很明显,我们的关系Teaching具有唯一的候选码(C,T,B),即全码。
Teaching属于BC范式。
对于我们的二维表,明显,数据冗余大,增加操作复杂。删除操作复杂。修改操作复杂。
下面我们来看第四范式的定义:
设
R(U)
是属性集
U
上的一个关系模式。
X
,
Y
,
Z
是
U
的子集,并且
Z
=
U
-
X
-
Y
。关系模式
R(U) 中多值依赖X
→→
Y
成立,当且仅当对
R(U)
的任一关系 r
,给定的一对
(
x
,
z
)
值,有一组
Y
的值与之对应,这组值仅仅决定于x
值而与
z
值无关。
显然,对于我们的课程C中的每一个值,T有一组值与之对应,而不论B取何值。因此T多值依赖于C,即C->->T。同理可以分析出C->->B。
看下多值依赖的另外一个定义:
在
R
(
U
)
的任一关系
r
中,如果存在元组
(x,y
1
,z
1
)
和
(x,y
2
,z
2
)
时,一定存在元组
(x,y
1
,z
2
)
(x,y
2
,z
1
)
(即交换两元组的属性Y
上的值所得到的新元组必在
R
中),则称
Y
多值依赖于
X
,或称
X
多值
Y
,记为
X
→→
Y
。这里X
,
Y
是
U
的子集,
Z
=
U
-
X
Y
。
不过我认为例子比概念更能帮助人们理解。
多值依赖的特点:
1. X
的一个值可以决定
Y
的一组值。这种决定关系与
Z
的取值
无关,也就是说当
X
的值确定后,无论
Z
取何值,所得到的
Y
的
值总是相同的。
2.
多值依赖是全模式的依赖关系。在函数依赖中,
X
与
Y
是否
存在函数依赖关系,只须考察
X
,
Y
两组属性,与别的属性无关
。而在多值依赖中,
X
与
Y
是否存在多值依赖还须看属性
Z
。
3.
存在平凡的多值依赖。对于属性集
U
上的一个多值依赖
X
→→Y
(X,Y
是
U
的子集),如果
Y
⊆
X
或者
XY=U
,则称
X
→→Y
是平凡的多值依赖。
多值依赖是元素和集合之间的对应。具有对称性,可以由完全二分图解释。
(
1
)多值依赖具有
对称性
。
即若
X→→Y
,则
X→→Z
,其中
Z
=
U
-
X
-
Y
多值依赖的对称性可以用完全二分图直观地表示出来。
从上例容易看出,因为每个保管员保管所有商品,同时每种
商品被所有保管员保管,显然若
W→→S
,必然有
W→→C
。
(
2
)多值依赖具有
传递性
。即若
X→→Y
,
Y→→Z
, 则
X→→Z–Y
,
X→→Y-Z
。
(
3
)
函数依赖是多值依赖的特殊情况
。即若
X→Y
,则
X→→Y
。
(
4
)合并律:若
X→→Y
,
X→→Z
,则
X→→YZ
。
(
5
)相交性:若
X→→Y
,
X→→Z
,则
X→→Y∩Z
。
多值依赖与函数依赖的区别
(
1
)多值依赖的有效性与属性集的范围有关
若
X→→Y
在
U
上成立,则在
W
(
XY
⊆
W
⊆
U
)上 一定成立
;反之则不然,即
X→→Y
在
W
(
W
⊆
U
)上成立,在
U
上并不
一定成立。
原因:多值依赖的定义中不仅涉及属性组
X
和
Y
,而且涉及
U
中其余属性
Z
。
一般地,在
R(U)
上若有
X→→Y
在
W(W
⸦
U)
上成立,则称
X→→Y
为
R(U)
的嵌入型多值依赖。
函数依赖
X→Y
的有效性仅决定于
X
、
Y
这两个属性集的值,
只要在
R(U)
的任何一个关系
r
中,元组在
X
和
Y
上的值满足定义
函数依赖的定义
,则函数依赖
X→Y
在任何属性集
W(XY
⊆
W
⊆
U)
上成立。
(
2
)若函数依赖
X→Y
在
R (U)
上成立,则对于任何
Y’
⸦
Y
均有
X→Y’
成立。多值依赖
X→→Y
若在
R(U)
上
成立,不能断言对于任何
Y’
⸦
Y
有
X→→Y’
成立。
解释判断方法:
对于任意一个A,对应BC的值的集合是{(b1,c1),(b2,c2)}
而不管是(b1,c1)还是(b2,c2)对应的集合都是{d1,d2}。
所以A->->BC。
同理,对于任意一个A,对应的D的集合是{d1,d2},不管是d1,还是d2,对应剩余(BC)的集合都是{(b1,c1),(b2,c2)}。
所以A->->D。
反观对于A,B的集合是{b1,b2},而对应于b1的集合是{(c1,d1),(c1,d2)},对应于b2的集合是{(c2,d1),(c2,d2)},很明显,不对等,所以A->->B。是不成立的。
第四范式判断条件:
定义4.10
若
R(U)
是一个关系模式,
D
是
R
上的多
值依赖集合,如果
D
中每个非平凡多值依赖
X->->
Y
,
X
都包含了
R
的一个候选键,则
R
∈
4NF
。
4NF
就是限制关系模式的属性之间不允许有非平凡且非
函数依赖的多值依赖。
我们来总结一下:
关系的规范化是将一个低级范式的关系模式,通过关
系模式的分解转换为若干个高级范式的过程。
范式的转换过程是通过分析和消除属性间的数据依赖
关系来实现的。
属性可分为键和非主属性。
2NF, 3NF
考察非主属性
和键的关系,
BCNF
考察主属性和键的关系。
属性间的依赖关系包括函数依赖和多值依赖。
1NF,
2NF, 3NF, BCNF
考察了函数依赖关系;
4NF
考察了
多值依赖。
数据依赖公理:
阿氏公理(Armstrong):设F是关系模式R的函数依赖集,X,Y是R的属性子集,如果从F的函数依赖中能够推出X->Y,则称F逻辑蕴含X->Y。
我们可以得到阿氏公理的一些性质:
设U为属性集总体,F是U上的一组函数依赖, 于是有关系模式R
<U,F >。对R<U,F> 有:
A1自反律
(
reflexivity rule
):
若Y
⊆
X ,则X->
Y。
A2增广律
(
augmentation rule
):
若X->
Y,则XZ->
YZ。
A3传递律
(
transitivity rule
):
若X->
Y、Y->
Z,则X->
Z。
由于自反律得到的函数依赖是平凡的函数依赖,自反律的使用并不依赖于F。
当然,我们由以上的推理得到下面的推论:
![](https://img-blog.csdnimg.cn/direct/9cca0ef7f7e04467b2050fbd18503f82.png)
![](https://img-blog.csdnimg.cn/direct/0f0c51a067954d44b684a79a7d061c0a.png)
下面我们进行闭包的计算:
![](https://img-blog.csdnimg.cn/direct/f8fe0772ab9d4d94bf173be1829f64e4.png)
![](https://img-blog.csdnimg.cn/direct/131d35fb5d554b5bb6ce6bf6b01005e2.png)
其实就是得到包含最多属性的列。
我们求出闭包的一个重要作用就是求键,如下:
![](https://img-blog.csdnimg.cn/direct/734a6f1915b24af29970086db97369d4.png)
很明显,A是ABC的键,D是BCD的键,最小属性组AD就是ABCD的键。所以候选键是AD.
显然,由A我们可以得到包含所有属性列的闭包,由BC也可以得到包含所有属性列的闭包。所以候选键是A和BC。