第六章 关系数据库理论
文章目录
6.1问题的提出
- 关系模式的表示
关系模式由五部分组成,是一个五元组:R(U,D,DOM,F)。
(1)关系名R是符号化的元组语义。
(2)U为一组属性。
(3)D为属性U中的属性所来自的域。
(4)DOM为属性到域的映射。
(5)F为属性组U上的一组数据依赖。
说明:
- 由于D、DOM与模式设计关系不大,因此在本章中把关系模式看作一个三元组:R<U,F>。
- 当且仅当U上的一个关系r满足F时,r称为关系模式R<U,F>的一个关系。
- 作为二维表,关系要符合一个最基本的条件:每个分量必须是不可分开的数据项。满足了这个条件的关系模式就属于第一范式(1NF)。
- 数据依赖
数据依赖是一个关系内部属性与属性之间的一种约束关系,是通过属性间值的相等与否体现出来的数据间相互联系。
数据依赖的主要类型:
- 函数依赖(简记为FD)。
- 多值依赖(简记为MVD)。
- 函数依赖在现实生活中的体现
例:建立一个描述学校教务的数据库。设计的对象包括:学生的学号(Sno)、所在系(Sdept)、系主任姓名(Mname)、课程号(Cno)、成绩(Grade)。
假设学校教务的数据库模式用一个单一的关系模式Student来表示,则该关系模式的属性集合为:U={Sno,Sdept,Mname,Cno,Grade}
现实世界的已知事实(语义): 一个系有若干学生,但一个学生只属于一个系; 一个系只有一名(正职)负责人;
一个学生可以选修多门课程,每门课程有若干学生选修; 每个学生学习每一门课程有一个成绩。 由此可得到属性组U上的一组函数依赖F:
F={Sno->Sdept,Sdept->Mname,(Sno,Cno)->Grade}
- 函数依赖存在的问题
(1)数据冗余
浪费大量的储存空间,每一个系主任的姓名重复出现,重复次数与该系所有学生的所有课程成绩出现次数相同。
(2)更新异常
数据冗余,更新数据时,维护数据完整性代价太大。某系更换系主任后,必须修改与该系学生有关的每一个元组,否则会出现数据不一致的异常。
(3)插入异常
如果一个系刚成立,尚无学生,则无法把这个系及其系主任的信息存入数据库。
(4)删除异常
如果某个系的学生毕业了,则在删除该系学生信息的同时,把这个系及其系主任的信息也丢掉了。
说明:
①Student关系模式不是一个好的模式。一个“好”的模式应当不会发生插入异常、删除异常和更新异常,数据冗余应尽量少。
②存在以上问题的原因是由于存在于模式中的某些数据依赖引起的。
③解决方法是用规范化理论改造关系模式来消除其中不合适的数据依赖。 - 函数依赖的解决方式
吧这个单一的模式分成三个关系模式:
S(Sno,Sdept,Sno → \to →Sdept);
SC(Sno,Cno,Grade,(Sno,Cno) → \to →Grade);
DEPT(Sdept,Mname,Sdept → \to →Mname);
这三个模式都不会发生插入异常、删除异常的问题,数据的冗余也得到了控制。
6.2规范化
6.2.1函数依赖
定义1:设R(U)是属性集U上的关系模式,X、Y是U的子集。若对于R(U)的任意一个可能的关系r,r中不可能存在两个元组在X上的属性值相等,而在Y上的属性值不等,则称“X函数确定Y”或”Y函数依赖于X“,记作X
→
\to
→Y。
一些属于和记号:
(1)X
→
\to
→ Y,但Y⊊X则称X
→
\to
→ Y是非平凡的函数依赖。
(2)X
→
\to
→ Y,但Y⊆X则称X
→
\to
→ Y是平凡的函数依赖。
对于任一关系模式,平凡函数依赖都是必然成立的,若不特别声明,我们总是讨论非平凡函数依赖。
(3)若X
→
\to
→ Y,则X称为这个函数依赖的决定属性组,也称为决定因素。
(4)若X
→
\to
→ Y,并且Y
→
\to
→X,则记为X
←
\leftarrow
←
→
\to
→ Y。
(5)若Y不函数依赖于X,则记为X
↛
\nrightarrow
↛Y。
定义2:在R(U)中,如果X
→
\to
→Y,并且对于X的任何一个真子集
X
′
X'
X′,都有
X
′
↛
X'\nrightarrow
X′↛Y,则称Y对X完全函数依赖,记作
X
F
→
Y
X \underrightarrow{F} Y
XFY
若X
→
\to
→Y,但Y不完全函数依赖于X,则称Y对X部分函数依赖,记作
X
P
→
Y
X \underrightarrow{P} Y
XPY
定义3:在R(U)中,如果X
→
\to
→ Y(Y⊊X),Y
↛
\nrightarrow
↛X,Y
→
\to
→ Z,Z⊊Y,则称Z对X传递函数依赖。
记为
X
传
递
→
Z
X \underrightarrow{传递} Z
X传递Z
注意:如果Y
→
\to
→X,即X
←
\leftarrow
←
→
\to
→ Y,则Z直接依赖于X,而不是传递函数依赖。
6.2.2码
定义4:设K为R<U,F>中的属性或属性组合,若
K
F
→
U
K \underrightarrow{F} U
KFU
则K称为R的一个候选码。
如果U部分函数依赖于K,即
K
P
→
U
K \underrightarrow{P} U
KPU
则K称为超码。候选码是最小的超码,即K的任意一个真子集都不是候选码。
若关系模式R有多个候选码,则选定其中的一个做为主码。
主属性与非主属性
主属性:包含在任何一个候选码中的属性。
非主属性:不包含在任何码中的属性。
全码:整个属性组是码,称为全码。
定义5:关系模式R中属性或属性组X并非R的码,但X是另一个关系模式的码,则称X是R的外部码也称外码。
6.2.3范式
范式是符合某一种级别的关系模式的集合。关系数据库中的关系必须满足一定的要求,满足不同程度要求的为不同范式。
各种范式之间存在联系:
5NF
⊂
\subset
⊂ 4NF
⊂
\subset
⊂ BCNF
⊂
\subset
⊂ 3NF
⊂
\subset
⊂ 2NF
⊂
\subset
⊂ 1NF
某一关系模式R为第n范式,可简记为R
∈
\in
∈nNF。
规范化:是指一个低一级范式的关系模式,通过模式分解转换为若干个高一级范式的关系模式集合的过程。
6.2.4 2NF
定义6:若关系模式R
∈
\in
∈ 1NF,并且每一个非主属性都完全函数依赖于任何一个候选码,则R
∈
\in
∈ 2NF。
一个关系模式不属于2NF,会产生以下问题:
(1)插入异常
(2)删除异常
(3)修改复杂
出现这种问题的原因:
出现非主属性对码完全函数依赖和不是完全函数依赖两种情况。
解决方法:
用投影分解把关系模式分解成两个关系模式。
6.2.5 3NF
定义7:设关系模式R<U,F>$\in$1NF,若R中不存在这样的码X、属性组Y及非主属性Z(Y⊊Z),使得X → \to → Y,Y → \to → Z成立,Y ↛ \nrightarrow ↛X不成立,则称R<U,F>$\in$3NF。
6.2.6 BCNF
BCNF由Boyce和Codd提出,比3NF更进了一步。通常认为BCNF是修正的第三范式,有时也称为扩充的第三范式。
定义8:设关系模式R<U,F>$\in$1NF,若X
→
\to
→ Y且Y⊊X时X必含有码,则R<U,F>
∈
\in
∈BCNF。
换言之,在关系模式R<U,F>中,如果每一个决定属性集都包含候选码,则R
∈
\in
∈BCNF。
BCNF的关系模式所具有的性质:
(1)所有非主属性都完全依赖于每个候选码。
(2)所有主属性都完全函数依赖于每个不包含它的候选码。
(3)没有任何属性完全函数依赖于非码的任何一组属性。
如果一个关系数据库中的所有关系模式都属于BCNF,那么在函数依赖范畴内,它已实现了模式的彻底分解,达到了最高的规范化程度,消除了插入异常和删除异常。
说明:
①对于不是BCNF的关系模式,仍然存在不合适的地方。非BCNF的关系模式也可以通过分解成为BCNF。
②3NF和BCNF是在函数依赖的条件下对模式分解所能达到的分离程度的测度。
一个模式中的关系如果都属于BCNF,那么在函数依赖范畴内,它已经实现了彻底的分离,已消除了插入和删除的异常。
3NF的“不彻底”性表现在可能存在主属性对码的部分依赖和传递依赖。
6.2.7多值依赖
定义9:设R(U)是属性集U上的一个关系模式。X、Y、Z是U的子集,并且Z=U-X-Y。关系模式R(U)中多值依赖X
→
\to
→
→
\to
→ Y成立,当且仅当对R(U)的任一关系r,给定的一对(x,z)值,有一组Y的值,这组值仅仅决定于x值而与z值无关。
多值依赖的另一个等价的定义:在R(U)的任一关系r中,如果存在元组t,s使得t[[X]=s[X],那么就必然存在元组w、v
∈
\in
∈r(w、v可以与s、t相同),使得w[X]=v[X]=t[X],而w[Y]=t[Y],w[Z]=s[Z],v[Y]=s[Y],v[Z]=t[Z](即交换s,t元组的Y值所得的两个新元组必在r中,则Y多值依赖于X,记为X
→
\to
→
→
\to
→ Y。这里X、Y是U的子集,Z=U-X-Y。
平凡多值依赖:若X
→
\to
→
→
\to
→ Y,而Z=∅,即Z为空,则称X
→
\to
→
→
\to
→ Y为平凡的多值依赖,否则称X
→
\to
→
→
\to
→ Y为非平凡的多值依赖。
多值依赖的性质:
(1)多值依赖具有对称性:若X
→
\to
→
→
\to
→ Y,则X
→
\to
→
→
\to
→ Z,其中Z=U-X-Y。
(2)多值依赖具有传递性:若X
→
\to
→
→
\to
→ Y,Y
→
\to
→
→
\to
→ Z,则X
→
\to
→
→
\to
→ Z-Y。
(3)函数依赖是多值依赖的特殊情况:若X
→
\to
→Y,则X
→
\to
→
→
\to
→ Y。
(4)若X
→
\to
→
→
\to
→ Y,X
→
\to
→
→
\to
→ Z,则X
→
\to
→
→
\to
→ YZ。
(5)若X
→
\to
→
→
\to
→Y,X
→
\to
→
→
\to
→ Z,则X
→
\to
→
→
\to
→ Y
∩
\cap
∩Z。
(6)若X
→
\to
→
→
\to
→Y,X
→
\to
→
→
\to
→ Z,则X
→
\to
→
→
\to
→ Y-Z,X
→
\to
→
→
\to
→ Z-Y。
多值依赖与函数依赖的区别:
(1)多值依赖的有效性与属性集的范围有关。
若X
→
\to
→
→
\to
→ Y在U上成立,则在W(XY
⊆
\subseteq
⊆W
⊆
\subseteq
⊆U)上一定成立;反之则不然,即X
→
\to
→
→
\to
→ Y在W(W
⊂
\subset
⊂C)上成立,在U上并不一定成立。
原因:多值依赖的定义中不仅涉及属性组X和Y,而且涉及U中其余属性Z。
一般地,在R(U)上若有X
→
\to
→
→
\to
→ Y在W(W
⊂
\subset
⊂C)上成立,则称X
→
\to
→
→
\to
→ Y为R(U)的嵌入型多值依赖。
函数依赖X
→
\to
→ Y的有效性仅决定于X、Y这两个属性集的值。
只要在R(U)的任何一个关系r中,元组在X和Y上的值满足定义1,则函数依赖X
→
\to
→ Y在任何属性集W(XY
⊆
\subseteq
⊆W
⊆
\subseteq
⊆U)上成立。
(2)若函数依赖X
→
\to
→ Y在R(U)上成立,则对于任何
Y
′
Y'
Y′⊂
Y
Y
Y均有X
→
\to
→
Y
′
Y'
Y′成立。多值依赖X
→
\to
→
→
\to
→Y若在R(U)上成立,不能断言对于任何Y’
⊂
\subset
⊂Y有X
→
\to
→
→
\to
→
Y
′
Y'
Y′成立。
6.2.8 4NF
定义10:关系模式R<U,F>
∈
\in
∈ 1NF,如果对于R的每个非平凡多值依赖X
→
\to
→
→
\to
→ Y(X⊊ Y),X都含有码,则R<U,F>
∈
\in
∈ 4NF。
说明:
①4NF是限制关系模式的属性之间不允许有非平凡且非函数依赖的多值依赖。44NF所允许的非平凡多值依赖实际是函数依赖。
②如果一个关系模式是4NF,则必为BCNF。
③在关系WSC中,W
→
\to
→
→
\to
→ S,W
→
\to
→
→
\to
→ C,他们都是非平凡多值依赖。而W不是码,关系模式WSC的码是(W,S,C),即All-key,因此WSC
∉
\notin
∈/ 4NF。可以把WSC分解成WS(W,S),WC(W,C),WS
∈
\in
∈ 4NF,WC属于4NF。
6.2.9规范化小结
- 在关系数据库中,对关系模式的基本要求是满足第一范式。
- 规范化程度过低的关系不一定能够很好地描述现实世界。可能存在插入异常、删除异常、、修改复杂、数据冗余等问题,解决方法就是对其进行规范化,转换成高级范式。
- 一个低一级范式的关系模式,通过模式分解可以转换为若干个高一级范式的关系模式集合,这种过程就叫关系模式的规范化。
- 关系数据库的规范化理论是数据库逻辑设计的工具。
- 规范化的基本思想
(1)逐步消除数据依赖中不合适的部分,使模式中的各关系模式达到某种程度的“分离”。
(2)采用“一事一地”的模式设计原则。
让一个关系描述一个概念、一个实体或者实体间的一种联系。若多于一个概念就把它“分离”出去。因此规范化实质上是概念的单一化。 - 不能说规范化程度越高的关系模式就越好。
必须对现实世界的实际情况和用户应用需求作进一步分析,确定一个合适的、能够反映现实世界的模式。
6.3数据依赖的公理系统
定义11:对于满足一组函数依赖F的关系模式R<U,F>,其任何一个关系r,若函数依赖X
→
\to
→ Y都成立(即r中任意两元组t、s,若t[X]=s[X],则t[Y]=s[Y]),则称F逻辑蕴涵X
→
\to
→ Y。
Armstrong公理系统:是一套推理规则,是模式分解算法的理论基础。主要用于求给定关系模式的码,从一组函数依赖求得蕴涵的函数依赖。
Armstrong公理系统设U为属性集总体,F是U上的一组函数依赖,于是有关系模式R<U,F>,对R<U,F>来说有以下的推理规则:
A1自反律:若Y
⊆
\subseteq
⊆ X
⊆
\subseteq
⊆ U,则X
→
\to
→ Y为F所蕴涵。
A2增广律:若X
→
\to
→ Y为F所蕴涵,且Z
⊆
\subseteq
⊆ U,则XZ
→
\to
→ YZ为F所蕴涵。
A3传递律:若X
→
\to
→ Y及Y
→
\to
→ Z为F所蕴涵,则X
→
\to
→ Z为F所蕴涵。
注意:由自反律所得到的函数依赖均是平凡的函数依赖,自反律的使用并不依赖于F。
定理1:Armstrong推理规则是正确的。
下面从定义触发证明推理规则的正确性。
证明:(1)设Y
⊆
\subseteq
⊆ X
⊆
\subseteq
⊆ U。
对R<U,F>的任一关系r中的任意两个元祖t、s:若t[X]=s[X],由于Y
⊆
\subseteq
⊆ X,有t[Y]=s[Y],所以X
→
\to
→Y成立,自反律得证。
(2)设X
→
\to
→ Y为F所蕴涵,且Z⊆U。
设R<U,F>的任一关系r中任意的两个元组t、s:若t[XZ]=s[XZ],则有t[X]=s[X]和t[Z]=s[Z];由X
→
\to
→ Y,于是有t[Y]=s[Y],所以t[YZ]=s[YZ],XZ
→
\to
→ YZ为F所蕴涵,增广律得证。
(3)设X
→
\to
→ Y,及Y
→
\to
→ Z为F所蕴涵。
对R<U,F>的任一关系r中的任意两个元组t、s:若t[X]=s[X],由于X
→
\to
→ Y,t[Y]=s[Y];再由Y
→
\to
→ Z,有t[Z]=s[Z],所以X
→
\to
→ Z为F所蕴涵,传递律得证。
根据A1,A2,A3这三条推理规则得到下面三条推理规则:
(1)合并规则:由X
→
\to
→ Y,X
→
\to
→ Z,有X
→
\to
→ YZ。
(2)伪传递规则:由X
→
\to
→ Y,WY
→
\to
→ Z,有XW
→
\to
→ Z。
(3)分解规则:由X
→
\to
→ Y及Z
⊆
\subseteq
⊆ Y,有X
⊆
\subseteq
⊆ Z。
根据合并规则和分解规则,可得:
引理1:X
→
\to
→
A
1
A_1
A1
A
2
A_2
A2…
A
k
A_k
Ak成立的充分必要条件是X
→
\to
→
A
i
A_i
Ai成立(i=1,2,…,k)。
定义12:在关系模式R<U,F>中为F所逻辑蕴涵的函数依赖的全体叫作F的闭包,记为
F
+
F^+
F+。
说明:
①自反律、传递律和增广律称为Armstrong公理系统。
②Armstrong公理系统具有有效性和完备性。
有效性是指由F出发根据Armstrong公理系统推导出的每一个函数依赖一定在
F
+
F^+
F+中。
完备性是指
F
+
F^+
F+中的每一个函数依赖,必定可以由F出发根据Armstrong公理系统推导出来。
定义13:设F为属性集U上的一组函数依赖,X、Y
⊆
\subseteq
⊆ U,
X
+
F
{X^+}_F
X+F ={A|X →A能由F根据Armstrong公理导出},
X
+
F
{X^+}_F
X+F 称为属性集X关于函数依赖集F的闭包。
引理2:设F为属性集U上的一组函数依赖,X、Y
⊆
\subseteq
⊆ U,X
→
\to
→Y能由F根据Armstrong公理导出的充分必要条件是Y
⊆
\subseteq
⊆
X
+
F
{X^+}_F
X+F 。
算法1:求属性集X(X
⊆
\subseteq
⊆U)关于U上的函数依赖集F的闭包
X
F
+
{X_F}^+
XF+ 。
输入:X,F
输出:
X
F
+
{X_F}^+
XF+
步骤:
①令
X
(
0
)
X^{(0)}
X(0)=Xi=0。
②求B,这里B={A|(
∃
\exists
∃ V)(
∃
\exists
∃ W)(V
→
\to
→W
∈
\in
∈ F
∧
\wedge
∧V
⊆
\subseteq
⊆
X
(
i
)
X^{(i)}
X(i)
∧
\wedge
∧A
∈
\in
∈W)}。
③
X
(
i
+
1
)
X^{(i+1)}
X(i+1)=B
∪
\cup
∪
X
(
i
)
X^{(i)}
X(i)。
④判断
X
(
i
+
1
)
X^{(i+1)}
X(i+1)=
X
(
i
)
X^{(i)}
X(i)。
⑤若
X
(
i
+
1
)
X^{(i+1)}
X(i+1)与
X
(
i
)
X^{(i)}
X(i)相等或
X
(
i
)
X^{(i)}
X(i)=U,则
X
(
i
)
X^{(i)}
X(i)就是
X
F
+
{X_F}^+
XF+,算法终止。
⑥若否,则i=i+1,返回第②步。
定理2:Armstrong公理系统是有效的、完备的。
证明:
(1)有效性:可由定理1得证。
(2)完备性:只需证明逆否命题:若函数依赖X
→
\to
→Y不能由F从Armstrong公理导出,那么它必然不为F所蕴含。
①引理:若V
→
\to
→W成立,且V
⊆
\subseteq
⊆
X
F
+
{X_F}^+
XF+,则W
⊆
\subseteq
⊆
X
F
+
{X_F}^+
XF+。
②构造一张二维表r,它由下列两个元组构成,可由证明r必是R(U,F)的一个关系,即
F
+
F^+
F+中的全部函数依赖在r上成立。
11......1
⏞
X
F
+
00......0
⏞
U
−
X
F
+
\overbrace{11......1}^{{X_F}^+}\overbrace {00......0}^{{U-X_F}^+}
11......1
XF+00......0
U−XF+
11......100......0
{11......1}{00......0}
11......100......0
③若X
→
\to
→Y若不能由F从Armstrong公理导出,则Y不是
X
F
+
{X_F}^+
XF+的子集。
因此必有Y的子集
Y
′
Y'
Y′
⊆
\subseteq
⊆U-
X
F
+
{X_F}^+
XF+,
则X
→
\to
→Y在r中不成立,
即X
→
\to
→Y必不为R<U,F>蕴涵。
定义14:如果
G
+
=
F
+
G^+=F^+
G+=F+,就说函数依赖集F覆盖G(F是G的覆盖,或G是F的覆盖),或F与G等价。
引理3:
F
+
=
G
+
F^+=G^+
F+=G+的充分必要条件是
F
⊆
G
+
F\subseteq G^+
F⊆G+和
G
⊆
F
+
G\subseteq F^+
G⊆F+。
证:必要性显然,只证充分性。
(1)若
F
⊆
G
+
F\subseteq G^+
F⊆G+,则
X
F
+
⊆
X
G
+
+
{X_F}^+\subseteq {X_{G+}}^+
XF+⊆XG++。
(2)任取
X
→
Y
∈
F
+
X\to Y\in F^+
X→Y∈F+,则有
Y
⊆
X
F
+
⊆
X
G
+
+
Y\subseteq {X_F}^+\subseteq {X_{G+}}^+
Y⊆XF+⊆XG++。
所以
X
→
Y
∈
(
G
+
)
+
=
G
+
X\to Y\in {(G^+)}^+=G^+
X→Y∈(G+)+=G+。即
F
+
⊆
G
+
F^+\subseteq G^+
F+⊆G+。
(3)同理可证
G
+
⊆
F
+
G^+\subseteq F^+
G+⊆F+,所以
F
+
=
G
+
F^+=G^+
F+=G+。
定义15:如果函数依赖集F满足下列条件,则称F为一个极小函数依赖集。亦称为最小依赖集或最小覆盖。
(1)F中任一函数的右部仅含有一个属性。
(2)F中不存在这样的函数依赖
X
→
A
X\to A
X→A,使得F与F-{X→A}等价。
(3)F中不存在这样的函数依赖
X
→
A
X\to A
X→A,X有真子集Z使得F-{X→A}∪{Z→A}与F等价。
定理3:每一个函数依赖集F均等价于一个极小函数依赖集
F
m
F_m
Fm。此
F
m
F_m
Fm称为F的最小依赖集。
证明:构造性证明,找出F的一个最小依赖集。
(1)逐一检查F中各函数依赖
F
D
i
FD_i
FDi:
X
→
Y
X\to Y
X→Y,若
Y
=
A
1
A
2
.
.
.
A
k
Y=A_1A_2...A_k
Y=A1A2...Ak,k≥2,则用{X
→
A
j
\to A_j
→Aj|j=1,2,…,k}来取代
X
→
Y
X\to Y
X→Y。
(2)逐一检查F中各函数依赖
F
D
i
FD_i
FDi:
X
→
A
X\to A
X→A,令G=F-{
X
→
A
X\to A
X→A},若A
∈
X
G
+
\in {X_G}^+
∈XG+,则从F中去掉此函数依赖。
(3)逐一取出F中各函数依赖
F
D
i
FD_i
FDi:
X
→
A
X\to A
X→A,设
X
=
B
1
B
2
.
.
.
B
m
X=B_1B_2...B_m
X=B1B2...Bm,m≥2,逐一考查
B
i
B_i
Bi(i=1,2,…,m),若
A
(
X
−
B
i
)
F
+
A{{(X-B_i)}_F}^+
A(X−Bi)F+,则以
X
−
B
i
X-B_i
X−Bi取代X。
6.4模式的分解
定义16:关系模式R<U,F>的一个分解:
ρ
=
{
R
1
<
U
1
,
F
1
>
,
R
2
<
U
2
,
F
2
>
,
.
.
.
,
R
n
<
U
n
,
F
n
>
}
\rho =\lbrace R_1<U_1,F_1>,R_2<U_2,F_2>,...,R_n<U_n,F_n>\rbrace
ρ={R1<U1,F1>,R2<U2,F2>,...,Rn<Un,Fn>}
其中,
U
=
⋃
i
=
1
n
U
i
U=\bigcup_{i=1}^{n} U_i
U=i=1⋃nUi
并且没有
U
i
⊆
U
j
U_i\subseteq U_j
Ui⊆Uj,1≤i,j≤n,
F
i
F_i
Fi为F在
U
i
U_i
Ui上的投影。
定义17:函数依赖集合
{
X
→
Y
∣
X
→
Y
∈
F
+
∧
X
Y
⊆
U
i
}
\lbrace X\to Y|X\to Y\in F^+\wedge XY\subseteq U_i \rbrace
{X→Y∣X→Y∈F+∧XY⊆Ui}的一个覆盖
F
i
F_i
Fi叫作F在属性
U
i
U_i
Ui上的投影。
6.4.1模式分解的三个定义
对于一个模式的分解是多种多样的,但是分解后产生的模式应与原模式等价。对“等价”的概念形成了三种不同的定义:
- 分解具有无损连接性。
- 分解要保持函数依赖。
- 分解既要保持函数依赖,又要具有无损连接性。
说明:
这三个定义实际是实行分解的三条不同的准则。按照不同的分解准则,模式所能达到的分离程度各不同,各种范式就是对分离程度的测度。
6.4.2分解的无损连接性和保持函数依赖性
定义以下记号:
设
ρ
=
{
R
1
<
U
1
,
F
1
>
,
R
2
<
U
2
,
F
2
>
,
.
.
.
,
R
k
<
U
k
,
F
k
>
}
\rho =\lbrace R_1<U_1,F_1>,R_2<U_2,F_2>,...,R_k<U_k,F_k> \rbrace
ρ={R1<U1,F1>,R2<U2,F2>,...,Rk<Uk,Fk>}是R的一个分解,r是R<U,F>的一个关系。定义
m
ρ
(
r
)
=
⋈
i
=
1
k
π
R
i
(
r
)
m_{\rho}(r)=⋈_{i=1}^k{\pi _{Ri}}(r)
mρ(r)=⋈i=1kπRi(r)
即
m
ρ
(
r
)
m_{\rho}(r)
mρ(r)是r在
ρ
\rho
ρ中各关系模式上投影的连接。
π
R
i
(
r
)
=
{
t
.
U
i
∣
t
∈
r
}
\pi _{Ri}(r)=\lbrace t.U_i|t\in r \rbrace
πRi(r)={t.Ui∣t∈r},即r中的每一个元组t在属性
U
i
U_i
Ui上的取值。
说明:
注意⋈的含义不同于一般的自然连接,它是一种特殊的连接运算。上式含义为:
(1)如果两个关系中有相同的属性列,则按第二章中的自然连接的定义进行;
(2)如果两个关系中没有相同的属性列,则按笛卡尔积运算进行;
将运算后得到的结果与其他关系进行重复1、2步的计算,直到完成全部的连接运算。
引理4:设
ρ
=
{
R
1
<
U
1
,
F
1
>
,
R
2
<
U
2
,
F
2
>
,
.
.
.
,
R
k
<
U
k
,
F
k
>
}
\rho =\lbrace R_1<U_1,F_1>,R_2<U_2,F_2>,...,R_k<U_k,F_k> \rbrace
ρ={R1<U1,F1>,R2<U2,F2>,...,Rk<Uk,Fk>}为关系模式R的一个分解,r为R的任一个关系,
r
i
=
π
R
i
(
r
)
r_i=\pi _{Ri}(r)
ri=πRi(r),则
①
r
⊆
m
ρ
(
r
)
r\subseteq m_\rho(r)
r⊆mρ(r)(即r的投影连接包含r)
②如果
s
=
m
ρ
(
r
)
s=m_\rho(r)
s=mρ(r),则
π
R
i
(
s
)
=
r
i
\pi _{Ri}(s)=r_i
πRi(s)=ri
③
m
ρ
(
m
ρ
(
r
)
)
=
m
ρ
(
r
)
m_\rho (m_\rho (r))=m_\rho (r)
mρ(mρ(r))=mρ(r)
说明:
①
r
⊆
m
ρ
(
r
)
r\subseteq m_\rho(r)
r⊆mρ(r)
r的投影连接包含,分解后再连接起来的r肯定不会比原来的r小;
②如果
s
=
m
ρ
(
r
)
s=m_\rho(r)
s=mρ(r),则
π
R
i
(
s
)
=
r
i
\pi _{Ri}(s)=r_i
πRi(s)=ri
投影连接后再投影到子关系模式=直接投影到该子关系模式。即
π
R
i
(
r
)
=
π
R
i
(
m
ρ
(
r
)
)
\pi _{Ri}(r)=\pi _{Ri}(m_\rho(r))
πRi(r)=πRi(mρ(r));
③
m
ρ
(
m
ρ
(
r
)
)
=
m
ρ
(
r
)
m_\rho(m_\rho(r))=m_\rho(r)
mρ(mρ(r))=mρ(r)
多次投影连接的结果等于一次投影连接后的结果。
定义18:关系模式R<U,F>的一个分解:
ρ
=
{
R
1
<
U
1
,
F
1
>
,
R
2
<
U
2
,
F
2
>
,
.
.
.
,
R
k
<
U
k
,
F
k
>
}
\rho =\lbrace R_1<U_1,F_1>,R_2<U_2,F_2>,...,R_k<U_k,F_k> \rbrace
ρ={R1<U1,F1>,R2<U2,F2>,...,Rk<Uk,Fk>}
若对于R的任何一个关系r均有
r
=
m
ρ
(
r
)
r=m_\rho(r)
r=mρ(r)成立,则称分解
ρ
\rho
ρ具有无损连接性。简称
ρ
\rho
ρ为无损连接。
算法2:判别一个分解的无损连接性。
ρ
=
{
R
1
<
U
1
,
F
1
>
,
R
2
<
U
2
,
F
2
>
,
.
.
.
,
R
k
<
U
k
,
F
k
>
}
\rho =\lbrace R_1<U_1,F_1>,R_2<U_2,F_2>,...,R_k<U_k,F_k> \rbrace
ρ={R1<U1,F1>,R2<U2,F2>,...,Rk<Uk,Fk>}是R<U,F>的一个分解,
u
=
{
A
1
,
A
2
,
.
.
.
,
A
N
}
u=\lbrace A_1,A_2,...,A_N \rbrace
u={A1,A2,...,AN},
F
=
{
F
D
1
,
F
D
2
,
.
.
.
,
F
D
ρ
}
F=\lbrace FD_1,FD_2,...,FD_\rho \rbrace
F={FD1,FD2,...,FDρ},设F是一极小依赖集,记
F
D
i
FD_i
FDi为
X
i
→
A
l
i
X_i\to A_{li}
Xi→Ali。
(1)构造初始表:构造一个k行n列的初始表,其中每列对应于R的一个属性,每行用于表示分解后的一个模式组成。如果属性
A
j
A_j
Aj属于关系模式
R
i
R_i
Ri,则在表的第i行第j列置符号
a
j
a_j
aj,否则置符号
b
l
j
b_{lj}
blj。
(2)根据F中的函数依赖修改表内容
对每个
F
d
i
Fd_i
Fdi做下列操作:找到
X
i
X_i
Xi具有相同符号的行,考察这些行中li列的元素。若其中有
a
l
i
a_{li}
ali,则全部改为
a
l
i
a_{li}
ali;否则全部改为
b
m
l
i
b_{mli}
bmli。其中m是这些行的行号最小值。
注意:若某个
b
t
l
i
b_{tli}
btli被更改,则表的li列中凡是
b
t
l
i
b_{tli}
btli的符号(不管它是否开始找到的那些行)均应做相应的更改。
循环执行以上操作,若有一行变为
a
1
,
a
2
,
.
.
.
a
n
a_1,a_2,...a_n
a1,a2,...an,则算法终止,
ρ
\rho
ρ具有无损连接性,否则
ρ
\rho
ρ不具有无损连接性。
(3)比较扫描前后表有无变化,如有变化则返回2中,否则算法终止。
定理4:如果算法2终止时表中有一行为a1,a2,…,an,则 ρ 为无损连接分解。
定理5:对于R<U,F>的一个分解
ρ
=
{
R
1
<
U
1
,
F
1
>
,
R
2
<
U
2
,
F
2
>
}
\rho =\lbrace R_1<U_1,F_1>,R_2<U_2,F_2> \rbrace
ρ={R1<U1,F1>,R2<U2,F2>},如果
(
U
1
∩
U
2
)
→
U
1
−
U
2
∈
F
+
(U_1\cap U_2)\to U_1-U_2\in F^+
(U1∩U2)→U1−U2∈F+或
(
U
1
∩
U
2
)
→
U
2
−
U
1
∈
F
+
(U_1\cap U_2)\to U_2-U_1\in F^+
(U1∩U2)→U2−U1∈F+,则
ρ
\rho
ρ具有无损连接性。
定义19:若
F
+
=
(
⋃
i
=
1
k
F
i
)
+
F^+={(\bigcup_{i=1}^{k} F_i)}^+
F+=(i=1⋃kFi)+
则R<U,F>的分解
ρ
=
{
R
1
<
U
1
,
F
1
>
,
.
.
.
,
R
k
<
U
k
,
F
k
>
}
\rho=\lbrace R_1<U_1,F_1>,...,R_k<U_k,F_k> \rbrace
ρ={R1<U1,F1>,...,Rk<Uk,Fk>}保持函数依赖。
6.4.3模式分解的算法
关于模式分解的几个重要事实:
若要求分解保持函数依赖,那么模式分解总可以达到3NF,但不一定能达到BCNF;
若要求分解既保持函数依赖,又具有无损连接性,可以达到3NF,但不一定能达到BCNF;
若要求分解具有无损连接性,那一定可达到4NF。
算法3(合成法):转换为3NF的保持函数依赖的分解。
(1)对R<U,F>中的F进行极小化处理。
(2)找出不在F中出现的属性(记作
U
0
U_0
U0),把这样的属性构成一个关系模式
R
0
<
U
0
,
F
0
>
R_0<U_0,F_0>
R0<U0,F0>,把这些属性从U中去掉,剩余的属性仍记为U。
(3)若有
X
→
A
∈
F
X\to A\in F
X→A∈F,且XA=U,则ρ ={R},算法终止。
(4)否则,对F按具有相同左部的原则分组(假定分为K组),每一组函数依赖所涉及的全部属性形成一个属性集
U
i
U_i
Ui。若
U
i
⊆
U
j
U_i\subseteq U_j
Ui⊆Uj(i≠j)就去掉
U
i
U_i
Ui,于是
ρ
=
{
R
1
<
U
1
,
F
1
>
,
.
.
.
,
R
k
<
U
k
,
F
k
>
}
∪
R
0
<
U
0
,
F
0
>
\rho =\lbrace R_1<U_1,F_1>,...,R_k<U_k,F_k> \rbrace \cup R_0<U_0,F_0>
ρ={R1<U1,F1>,...,Rk<Uk,Fk>}∪R0<U0,F0>构成R<U,F>的一个保持函数依赖的分解,并且每个Ri<
U
i
U_i
Ui,
F
i
F_i
Fi>均属于3NF。
算法4:转换为3NF既有无损连接性又保持函数依赖的分解。
(1)设X是R<U,F>的码,R<U,F>已有算法3分解为
ρ
=
{
R
1
<
U
1
,
F
1
>
,
.
.
.
,
R
k
<
U
k
,
F
k
>
}
∪
R
0
<
U
0
,
F
0
>
\rho =\lbrace R_1<U_1,F_1>,...,R_k<U_k,F_k> \rbrace \cup R_0<U_0,F_0>
ρ={R1<U1,F1>,...,Rk<Uk,Fk>}∪R0<U0,F0>,令
τ
=
ρ
∪
{
R
∗
<
X
,
F
X
>
}
\tau =\rho \cup \lbrace R^*<X,F_X> \rbrace
τ=ρ∪{R∗<X,FX>}。
(2)如有某个
U
i
U_i
Ui,
X
⊆
U
i
X\subseteq U_i
X⊆Ui,将
R
∗
<
X
,
F
X
>
R^*<X,F_X>
R∗<X,FX>从
τ
\tau
τ中去掉,或者
U
i
⊆
X
U_i\subseteq X
Ui⊆X,将
R
<
U
i
,
F
x
>
R<U_i,F_x>
R<Ui,Fx>从
τ
\tau
τ中去掉。
(3)
τ
\tau
τ就是所求的分解。
算法5(分解法):转换为BCNF的无损连接分解。
(1)令
ρ
=
{
R
<
U
,
F
>
}
\rho =\lbrace R<U,F> \rbrace
ρ={R<U,F>}。
(2)检查
ρ
\rho
ρ中各关系模式是否均属于BCNF。若是,则算法终止。
(3)设
ρ
\rho
ρ中
R
i
<
U
i
,
F
i
>
R_i<U_i,F_i>
Ri<Ui,Fi>不属于BCNF那么必有
X
→
A
∈
F
i
+
(
A
∉
X
)
X\to A\in {F_i}^+(A\notin X)
X→A∈Fi+(A∈/X),且X非
R
i
R_i
Ri的码。因此,XA是
U
i
U_i
Ui的真子集。对
R
i
R_i
Ri进行分解:
σ
=
{
S
1
,
S
2
}
\sigma =\lbrace S_1,S_2 \rbrace
σ={S1,S2},
U
S
1
=
X
A
U_{S1}=XA
US1=XA,
U
S
2
=
U
i
−
{
A
}
U_{S2}=U_i-\lbrace A \rbrace
US2=Ui−{A},以
σ
\sigma
σ代替
R
i
(
U
i
,
F
i
)
R_i(U_i,F_i)
Ri(Ui,Fi)返回第(2)步。
引理5:若
ρ
=
{
R
1
<
U
1
,
F
1
>
,
.
.
.
,
R
k
<
U
k
,
F
k
>
}
\rho =\lbrace R_1<U_1,F_1>,...,R_k<U_k,F_k> \rbrace
ρ={R1<U1,F1>,...,Rk<Uk,Fk>}是R<U,F>的一个无损连接分解,
σ
=
{
S
1
,
S
2
,
.
.
.
,
S
m
}
\sigma =\lbrace S_1,S_2,...,S_m \rbrace
σ={S1,S2,...,Sm}是
ρ
\rho
ρ中
R
i
<
U
i
,
F
i
>
R_i<U_i,F_i>
Ri<Ui,Fi>的一个无损连接分解,那么,
ρ
′
=
{
R
1
,
R
2
,
.
.
.
,
R
i
−
1
,
S
1
,
S
2
,
.
.
.
,
S
m
,
R
i
+
1
,
.
.
.
,
R
k
}
\rho '=\lbrace R_1,R_2,...,R_{i-1},S_1,S_2,...,S_m,R_{i+1},...,R_k \rbrace
ρ′={R1,R2,...,Ri−1,S1,S2,...,Sm,Ri+1,...,Rk}和
ρ
′
′
=
{
R
1
,
.
.
.
,
R
k
,
R
k
+
1
,
.
.
.
,
R
n
}
\rho ''=\lbrace R_1,...,R_k,R_{k+1},...,R_n \rbrace
ρ′′={R1,...,Rk,Rk+1,...,Rn},均为R<U,F>的无损连接分解。
引理6:
(
R
1
⋈
R
2
)
⋈
R
3
=
R
1
⋈
(
R
2
⋈
R
3
)
(R_1⋈R_2)⋈R_3=R_1⋈(R_2⋈R_3)
(R1⋈R2)⋈R3=R1⋈(R2⋈R3)
定理6:关系模式R<U,D>中,D为R中函数依赖FD和多值依赖MVD的集合。则
X
→
→
Y
X\to \to Y
X→→Y成立的充分必要条件是:
R的分解
ρ
=
{
R
1
<
X
,
Y
>
,
R
2
<
X
,
Z
>
}
\rho =\lbrace R_1<X,Y>,R_2<X,Z> \rbrace
ρ={R1<X,Y>,R2<X,Z>}具有无损连接性,其中Z=U-X-Y。
算法6:达到4NF的具有无损连接性的分解。
首先使用算法5得到R的一个达到BCNF的无损连接分解ρ,然后对某一个
R
i
<
U
i
,
F
i
>
R_i<U_i,F_i>
Ri<Ui,Fi>,若不属于4NF,则可按定理6进行分解,直到每一个关系模式均属于4NF为止。
包含函数依赖和多值依赖的有效且完备的公理系统:
A1:若
Y
⊆
X
⊆
U
Y\subseteq X\subseteq U
Y⊆X⊆U,则
X
→
Y
X\to Y
X→Y。
A2:若
X
→
Y
X\to Y
X→Y,且
Z
⊆
U
Z\subseteq U
Z⊆U,则
X
Z
→
Y
Z
XZ\to YZ
XZ→YZ。
A3:若
X
→
Y
X\to Y
X→Y,
Y
→
Z
Y\to Z
Y→Z,则
X
→
Z
X\to Z
X→Z。
A4:若
X
→
→
Y
X\to \to Y
X→→Y,
V
⊆
W
⊆
U
V\subseteq W\subseteq U
V⊆W⊆U,则
X
W
→
Y
V
XW\to YV
XW→YV。
A5:若
X
→
→
Y
X\to \to Y
X→→Y,则
X
→
→
U
−
X
−
Y
X\to \to U-X-Y
X→→U−X−Y。
A6:若
X
→
→
Y
X\to \to Y
X→→Y,
Y
→
→
Z
Y\to \to Z
Y→→Z,则
X
→
→
Z
−
Y
X\to \to Z-Y
X→→Z−Y。
A7:若
X
→
Y
X\to Y
X→Y,则
X
→
→
Y
X\to \to Y
X→→Y。
A8:若
X
→
→
Y
X\to \to Y
X→→Y,
W
→
Z
W\to Z
W→Z,
W
∩
Y
=
∅
W\cap Y=\emptyset
W∩Y=∅,
Z
⊆
Y
Z\subseteq Y
Z⊆Y,则X→Z。
由以上8条公理得知如下4条有用的推理规则:
(1)合并规则:
X
→
→
Y
X\to \to Y
X→→Y,
Y
→
→
Z
Y\to \to Z
Y→→Z,则
X
→
→
Y
Z
X\to \to YZ
X→→YZ。
(2)伪传递规则:
X
→
→
Y
X\to \to Y
X→→Y,
W
Y
→
→
Z
WY\to \to Z
WY→→Z,则
W
X
→
→
Z
−
W
Y
WX\to \to Z-WY
WX→→Z−WY。
(3)混合伪传递规则:
X
→
→
Y
X\to \to Y
X→→Y,
X
Y
→
→
Z
XY\to \to Z
XY→→Z,则
X
→
→
Z
−
Y
X\to \to Z-Y
X→→Z−Y。
(4)分解规则:
X
→
→
Y
X\to \to Y
X→→Y,
X
→
Z
X\to Z
X→Z,则
X
→
→
Y
∩
Z
X\to \to Y\cap Z
X→→Y∩Z,
X
→
→
Y
−
Z
X\to \to Y-Z
X→→Y−Z,
X
→
→
Z
−
Y
X\to \to Z-Y
X→→Z−Y。
6.5小结
- 关系模式的规范化,其基本思想如下:
- 规范化理论为数据库设计提供理论的指南和工具,仅仅是指南和工具。
- 并不是规范化程度越高,模式就越好,必须结合应用环境和现实世界的具体情况合理地选择数据库模式。