数据库系统第六章 关系数据库理论
第六章 关系数据库理论
- 当我们面对一个实际问题时,我们应该如何去建数据库,建表,库的结构,表的结构我们该如何组织,才能更好的解决问题。
- 如何省内存,提高查询修改删除更新的效率?
- 如何避免可能出现的隐患,如修改删除更新插入等异常?
- 以上就是关系数据库规范化理论研究解决的问题,实际上就是
如何才能设计出合适的库和表
(一) 问题的提出
1. 关系模式的表示
关系模式由五部分组成,是一个五元组:R(U,D,DOM,F)。
-
关系名R是符号化的元组语义。
-
U为一组属性。
本节中,一个关系中的所有的属性,都用一个U表示
-
D为属性U中的属性所来自的域。
-
DOM为属性到域的映射。
-
F为属性组U上的一组数据依赖。
说明:
- 由于D、DOM与模式设计关系不大,因此在本章中把关系模式看作一个三元组:R<U,F>。
- 当且仅当U上的一个关系r(r是一个实际的关系模式,一个属性U可以有多个关系模式,比如说学生关系,员工关系等)满足F时,r称为关系模式R<U,F>的一个关系。
- 作为二维表,关系要符合一个最基本的条件:
每个分量必须是不可分开的数据项。满足了这个条件的关系模式就属于第一范式(1NF)
。
2. 数据依赖
数据依赖是一个关系内部属性与属性之间的一种约束关系,是通过属性间值的相等与否体现出来的数据间相互联系。它是现实世界属性间相互联系的抽象,是数据内在的性质,是语义的体现。
数据依赖的主要类型:
-
函数依赖(简记为FD)。
相当于y = f(x),给出x,推出y
-
多值依赖(简记为MVD)。
多个属性间的函数依赖
【例】描述一个学生关系,可以有学号、姓名、系名等属性。
一个学号只对应一个学生,一个学生只在一个系学习。因而当“学号”值确定之后,学生的
姓名
及所在系
的值也就被唯一地确定了。
- Sname = f(Sno),Sdept = f(Sno)
- 读作
Sno函数决定Sname,Sname函数依赖于Sno
- 记作 Sno → Sname,Sno → Sdept
3. 函数依赖在生活中的体现
【例】建立一个描述学校教务的数据库,数据库涉及的对象有:
学生的学号(Sno)、所在系(Sdept)、系主任姓名(Mname)、课程名(Cname)、成绩(Grade)
假设学校教务的数据库模式用一个单一的关系模式Student来表示,则该关系模式的属性集合为
现实世界的已知事实(语义):
- 一个系有若干学生,但一个学生只属于一个系;
- 一个系只有一名(正职)负责人;
- 一个学生可以选修多门课程,每门课程有若干学生选修;
- 每个学生学习每一门课程有一个成绩。
由此可得到属性组U上的一组函数依赖F:
我们看下面的表,是否有些问题
4. 函数依赖存在的问题
- 数据冗余
浪费大量的储存空间,每一个系主任的姓名重复出现,重复次数与该系所有学生的所有课程成绩出现次数相同。 - 更新异常
数据冗余,更新数据时,维护数据完整性代价太大。某系更换系主任后,必须修改与该系学生有关的每一个元组,否则会出现数据不一致的异常。 - 插入异常
如果一个系刚成立,尚无学生,则无法把这个系及其系主任的信息存入数据库。 - 删除异常
如果某个系的学生毕业了,则在删除该系学生信息的同时,把这个系及其系主任的信息也丢掉了。
说明:
- Student关系模式不是一个好的模式。一个“好”的模式应当不会发生插入异常、删除异常和更新异常,数据冗余应尽量少。
- 存在以上问题的原因是由于存在于模式中的某些数据依赖引起的。
- 解决方法是用规范化理论改造关系模式来消除其中不合适的数据依赖。
5. 函数依赖的解决方式
把这个单一的模式分成三个关系模式:
- S(Sno,Sdept,Sno→Sdept);
- SC(Sno,Cno,Grade,(Sno,Cno)→Grade);
- DEPT(Sdept,Mname,Sdept→Mname);
这三个模式都不会发生插入异常、删除异常的问题,数据的冗余也得到了控制。
(二) 规范化
- 规范化讨论如何
根据属性间依赖情况来判定关系是否具有某些不合适的性质
- 通常
按属性间依赖情况来区分关系规范化程度
为第一范式、第二范式、第三范式和第四范式等
- 用来改造关系模式,
通过分解关系模式来消除其中不合适的数据依赖,以解决插入异常、删除异常、更新异常和数据冗余问题。
1. 函数依赖(相关定义)
(1) 函数依赖
- 定义1:设R(U)是属性集U上的关系模式,X、Y是U的子集。若对于R(U)的任意一个可能的关系r,r中不可能存在两个元组在X上的属性值相等,而在Y上的属性值不等,则称
“X函数确定Y”
或”Y函数依赖于X“
,记作X →Y。
类似于 y = f(x)中x与y的关系
例Student(Sno, Sname, Ssex, Sage, Sdept)
假设不允许重名:
Sno→Ssex,Sno→Sage,Sno→Sdept
由于不允许重名,有 Sno←→Sname
Sname→Ssex,Sname→Ssage,Sname→Sdept
但是Ssex↛Sage,Ssex↛Sdept
-
X → Y,但Y∉X则称X→ Y是
非平凡的函数依赖
。比如(Sno, Sname) → Grade,但是Grade不属于(Sno, Sname)
-
X → Y,但Y⊆X则称X→ Y是
平凡的函数依赖
。比如(Sno, Sname) → Sno,Sno在组合里面,这是必然的
-
对于任一关系模式,
平凡函数依赖都是必然成立
的,若不特别声明,我们总是讨论非平凡函数依赖
。 -
若X → Y,则X称为这个函数依赖的决定属性组,也称为决定因素。
-
若X → Y,并且Y→X,则记为X ←→Y。
-
若Y不函数依赖于X,则记为X↛Y。
(2) 完全/部分函数依赖
定义2:在R(U)中,如果X→Y,并且对于X的任何一个真子集X',都有X'不函数决定Y,称Y对X完全函数依赖,记作
比如说(Sno, Sname)→Grade,但是Sno和Sname不决定Grade
若X→Y,但Y不完全函数依赖于X,则称Y对X部分函数依赖,记作
(3) 传递函数依赖
在R(U)中,如果X → Y(Y⊊X),Y↛X,Y→ Z,Z⊊Y,则称Z对X传递函数依赖。
记为
比如说Std(Sno, Sdept, Mname(系主任))中,Sno→Sdept,Sdept→Mname,Mname传递函数依赖于Sno
但是Sno不函数决定Sname
注意:如果Y→X,即X ←→ Y,则Z直接依赖于X,而不是传递函数依赖
2. 码
(1) 候选码/超码/主码
-
定义4:设K为R<U,F>中的属性或属性组合,若,就是这个K完全函数决定整个元组U,称K为R的一个
候选码
-
如果U部分函数依赖于K,即则K称为
超码
。 -
候选码
是最小的超码,即K的任意一个真子集都不是候选码。 -
若关系模式R有
多个候选码
,则选定其中的一个做为主码
候选码和主码都是不是只有一个属性,可以是一个属性组
(2) 主属性/非主属性/全码
- 主属性:包含在任何一个候选码中的属性。
- 非主属性:不包含在任何码中的属性。
- 全码:整个属性组是码,称为全码
S(Sno, Sdept,Sage),单个属性Sno是码。sc(Sno, Cno, Grade)中,(Sno, Cno)是码。
关系模式R(P,W,A),P:演奏者 W:作品 A:听众
- 一个演奏者可以演奏多个作品
- 某一作品可被多个演奏者演奏
- 听众可以欣赏不同演奏者的不同作品
码为(P,W,A),即All-Key
(3) 外码
- 定义5:关系模式R中属性或属性组X
并非R的码
(当然可以是候选码),但X是另一个关系模式的码,则称X是R的外部码也称外码。
如在SC (Sno,Cno,Grade)中,Sno不是码,但Sno是关系模式S (Sno, Sdept,Sage)的码,则Sno是关系模式SC的外部码
3. 范式
- 范式是符合某一种级别的关系模式的集合。
- 关系数据库中的关系必须满足一定的要求,满足不同程度要求的为不同范式。
- 级别越高,表设计的越合理
范式的种类:
1NF、2NF、3NF、BCNF、4NF、5NF
范式之间的联系
意思是满足第 2范式一定满足第一范式,满足第三范式一定满足第2范式
-
某一关系模式
R为第n范式
,可简记为R∈nNF。
-
一个低一级范式的关系模式,通过
模式分解
可以转换为若干个高一级范式的关系模式的集合,这种过程就叫规范化
就是将一个模式(一张表)分解成多个模式从而提高范式等级
(1) 1NF
定义
- 如果一个关系模式R的所有属性都是
不可分的基本数据项
,则R∈1NF
- 第一范式是对关系模式的最起码的要求。
不满足第一范式的数据库模式不能称为关系数据库
- 但是满足第一范式的关系模式并不一定是一个好的关系模式
案例
以下是一个满足1NF,但不是好的关系模式的例子:
关系模式 S-L-C(Sno, Sdept, Sloc, Cno, Grade)
Sloc为学生住处,假设每个系的学生住在同一个地方
- 这个例子中存在函数依赖,不是一个好的关系模式
- 函数依赖如下
- 图形化表示如下
- S-L-C的码为(Sno, Cno)
- S-L-C满足第一范式。
- 非主属性Sdept和Sloc部分函数依赖于码(Sno, Cno)
问题
S-L-C不是一个好的关系模式,一个关系模式 R不属于2NF,就会产生以下几个问题:
异常类型 | 说明 |
---|---|
插入异常 | 假若要插入一个学生Sno=S7, Sdept =PHY, Sloc =BLD2, 但该生还未选课,即这个学生无Cno ,这样的元组就插不进S-L-C中。因为 插入元组时必须给定码值,而这时码值的一部分 为空,因而学生的固有信息无法插入。 |
删除异常 | 假定某个学生只选一门课,如S4就选了一门课C3,现在C3这门课他也不选了,那么C3这个数据项就要删除。 而 C3是主属性,删除了C3,整个元组就必须一起删除,使得S4的其他信息也被删除了 ,从而造成删除异常,即不应删除的信息也删除了。 |
修改复杂 | 某个学生从数学系(MA)转到计算机科学系(CS),这本来只需修改此学生元组中的Sdept分量即可,但因为关系模式S-L-C中还含有系的住处Sloc属性,学生转系将同时改变住处,因而还必须修改元组中的Sloc分量。 另外,如果这个学生选修了k门课,Sdept、 Sloc重复存储了k次,不仅存储冗余度大,而且必须无遗漏地修改k个元组中全部Sdept、Sloc 信息,造成修改的复杂化。 |
分析
为什么会有这些问题呢?
- 原因:
Sdept、 Sloc部分函数依赖于码
。
(2) 2NF
定义
定义6.6若R∈1NF, 且每一个非主属性完全函数依赖于码,则R∈2NF。
(也就是说,非主属性必须完全依赖于码,不能只依赖于码的一部分)
解决1NF的问题
S-L-C分解为两个关系模式
,以消除这些部分函数依赖
SC(Sno, Cno, Grade)
S-L(Sno, Sdept, Sloc)
函数依赖图
关系模式SC的码为(Sno,Cno)关系模式S-L的码为Sno
这样非主属性对码都是完全函数依赖
如果有非主属性部分依赖于主属性,那么将非主属性移到主属性的一边
2NF主要消除的就是部分依赖主属性的问题
- 采用投影分解法将一个1NF的关系分解为多个2NF的关系,可以在一定程度上减轻原1NF关系中存在的插入异常、删除异常、数据冗余度大、修改复杂等问题。
问题
- 将一个1NF关系分解为多个2NF的关系,并
不能完全消除关系模式中的各种异常情况和数据冗余
。所以又引入了3NF。
(3) 3NF
定义
定义:关系模式R<U,F>中若不存在这样的码X
、属性组Y
及非主属性Z
(Z⊊Y),使得X→Y,Y→Z成立,
Y↛X,则称R<U,F> E 3NF。
简单来说就是存在传递依赖
若R=3NF,则每…个非主属性既不部分依赖于码也不..传递依赖于码。
分析2NF的问题
这里我们对上面的2NF例子再次进行剖析:
函数依赖图
解决2NF的问题
- 采用投影分解法,把S-L
分解
为两个关系模式,以消除传递函数依赖
:
S-D(Sno, Sdept)
D-L(Sdept,Sloc) - S-D的码为Sno, D-L的码为Sdept。
分解后的关系模式S-D与D-L中不再存在传递依赖
- 采用投影分解法将一个2NF的关系分解为多个3NF的关系,可以
在一定程度上解决原2NF关系中存在的插入异常、删除异常、数据冗余度大、修改复杂等问题。
问题
- 将一个2NF关系分解为多个
3NF
的关系后,仍然不能完全消除关系模式中的各种异常情况和数据冗余。
(4) BCNF
定义
BCNF ( Boyce Codd Normal Form)是由Boyce与Codd提出的,比上述的3NF又进了一步,
通常认为BCNF是修正的第三范式,有时也称为扩充的第三范式。
定义关系模式R<U,F>属于1NF,若X不函数决定Y且Y⊆X时X必含有码,则R<U,F> ∈BCNF
换言之,在关系模式R<U,F>中,如果每一个决定属性集都包含候选码,则R∈BCNF。
再换句话说,如果X→Y,那么X必定是候选码,不能仅仅是主属性
决定属性集就是可以函数决定另一个属性的
BCNF & 3NF 区别
例1:关系模式C(Cno,Cname,Pcno)
(PCno是前置课程)
C∈3NF
C∈BCNF
关系模式C(Cno, Cname, Peno), 它
只有一个码Cno, 这里没有任何属性对Cno部分依赖或传递依赖,所以C∈3NF。
同时C中Cno
是唯一的决定因素
, 所以C ∈BCNF。
这里只有一个关系
例2:关系模式S(Sno, Sname, Sdept, Sage)
假定S有两个码Sno,Sname
S∈3NF。
S ∈ BCNF
假定Sname也具有唯一性, 那么S就有两个码,这两个码都由单个属性组成,彼此不相交。其他属性不存在对码的传递依赖与部分依赖,所以S∈3NF。
同时S中除Sno、Sname外没有其他决定因素
,所以S也属于BCNF。
两个候选码,不存在交叉关系
例3:关系模式SJP(S,J,P)
S是学生,J表示课程,P表示名次。
SJP∈3NF,
SJP∈BCNF
每一个学生选修每门课程的成绩有一定的名次,
每门课程中每一名次只有一个 学生(即没有并列名次)。
由语义可得到下面的函数依赖:
(S,J)→P; (J,P)→S
所以(S,J) 与(J,P)都可以作为候选码。
这两个码各由两个属性组成,而且它们是相交的。
这个关系模式中显然没有属性对码传递依赖或部分依赖。
所以SJP∈3NF,而且除(S,J)与(J,P)以外没有其他决定因素,所以SJP∈BCNF。
例4:关系模式STJ(S, T, J)中,S表示学生,T表示教师,J表示课程
每一教师只教一门课,每门课有若干教师,某一学生选定某门课, 就对应一个固定的教师。
由语义可得到如下的函数依赖。
(S,J)→T,(S,T)-J, T→J
函数依赖
关系可以用如图表示
这里(S,J)、 (S,T)都是候选码
。
STJ是3NF,因为没有任何非主属性对码传递依赖或部分依赖
,
但STJ不是BCNF关系
,因为T是决定因素,而T不包含码。
解决3NF的问题
解决方法:将STJ分解为二个关系模式ST(S,T)∈BCNF, TJ(T,J)∈BCNF
没有任何属性对码的部分函数依赖和传递函数依赖
3NF & BCNF 关系
如果R∈3NF,且R只有一个候选码,只有一个候选码的3范式就是BC范式
意义
- 3NF和BCNF是在函数依赖的条件下对模式分解所能达到的分离程度的测度。
- 一个模式中的关系模式如果都属于
BCNF
,那么在函数依赖范畴内它已实现了彻底的分离,已消除了插入和删除的异常。
3NF的“不彻底”性
表现在可能存在主属性对码
的部分依赖
和传递依赖
。
(5) 多值依赖
- 前面我们讲了数据依赖分为函数依赖和多值依赖,函数依赖在上面已经叙述了,这里我们再讨论多值依赖。
举例
[例] 学校中某一门课程由多个教师讲授,他们使用相同的一套参考书。每个教员可以讲授多门课程,每种参考书可以供多门课程使用。
可以用一个非规范化的关系
来表示教师T、课程C和参考书B之间的关系
转换成规范化的二维表
-
关系模型Teaching (C, T,B)的码是(C, T, B),即all-key,因而Teaching∈BCNF。
(因为
决定因素的必定是候选码
)
存在的问题
问题 | 说明 |
---|---|
数据冗余度大 | 有多少名任课教师,参考书就要存储多少次 |
增加操作复杂 | 当某一课程增加一名任课教师时,该课程有多少本参照书,就必须插入多少个元组 |
删除操作复杂 | 某一门课要去掉一本参考书,该课程有多少名教师,就必须删除多少个元组 |
修改操作复杂 | 某一门课要修改一本参考书,该课程有多少名教师,就必须修改多少个元组 |
定义
定义1
设R(U)是一个属性集U上的一个关系模式,X、Y和Z是U的子集,并且Z=U-X-Y。
关系模式R(U)中多值依赖X→→Y成立,当且仅当
对R(U)的任一关系r
,给定的一对(x,z)值,有一组Y的值,这组值仅仅决定于x值而与z值无关
- 【例】关系Teaching(C,T,B)中,对于C的每一个值,T有一组值与之对应,而不论B取何值。因此T多值依赖于C,即C→→T。
- 在关系模式Teaching中,对于一个(物理,光学原理)有一组T值{李勇,王军},这组值仅仅决定于课程C上的值(物理)。
- 也就是说对于另一个(物理,普通物理学),它对应的一组T值仍是{李勇,王军},尽管这时参考书B的值已经改变了。
因此
T多值依赖于C,即C→→T
。
前提是:Z=U-X-Y,不能有多余的属性
定义2
多值依赖的另一个等价的形式化的定义:
- 在R(U)的任专关系r中,如果存在元组t,s使得t[X]=s[X],那么就必然存在元组.w,v∈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→→Y。这里,X,Y是U的子集,Z=U-X-Y.
【例】关系模式WSC(W, S,C)中
- W表示仓库,S表示保管员,C表示商品。
- 每个仓库有若干个保管员,有若干种商品。
- 每个保管员保管所在仓库的所有商品
- 每种商品被所有保管员保管。
按照语义,对于W的每一个值Wi,S有一个完整的集合与之对应,不问C取何值。所以W→→S。
如果用图下图来表示这种对应
-
则对应W的某一个值Wi的全部S值记作{S}wi (表示此仓库工作的全部保管员)
全部C值记作{C}wi (表示在此仓库中存放的所有商品)。
-
应当有{S}wi中的
每一个值
和{C}wi中的每一个C值对应
。 -
于是{S}wi与{C}wi之间正好形成一个完全二分图,因而W→→S。
由于C与S的完全对称性,必然有W→→C成立。
平凡多值依赖和非平凡的多值依赖
- 若X→→Y,而Z=∅,即Z为空,则称X→→Y为平凡的多值依赖。
- 否则称X→→Y为
非平凡的多值依赖
。
多值依赖的性质
- 多值依赖具有对称性:若X→→Y,则X→→Z,其中Z=U - X - Y
- 多值依赖具有传递性:若X→→Y,Y→→Z,则X→→Z-Y(就是Z中不属于Y 的部分)
- 函数依赖是多值依赖的特殊情况。若X→Y,则X→→Y。(函数依赖相当于单值依赖)
- 若X→→Y,X→→Z,则X→→Y∪Z
- 若X→→Y,X→→Z,则X→→Y∩Z。
- 若X→→Y,X→→Z,则X→→Y-Z,X→→Z-Y。
多值依赖与函数依赖的区别
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)上成立。
-
若函数依赖X→Y在R (U)上成立,则对于任何Y‘ ⊂ Y均有X→Y’ 成立。
多值依赖X→→Y若在R(U)上成立,不能断言对于任何Y’ ⊂ Y有X→→Y’ 成立。
例如,关系R(A,B,C,D),A→→BC成立,当然也有A→→D成立。有R的一个关系实例,在此实例上A→→B是不成立的。
A→→B,必须得看CD的情况
(6) 4NF
定义关系模式R<U,F>∈1NF,如果对于R的每个非平凡多值依赖X→→Y(Y ⊈ X),X都含有码,则R<U,F>∈4NF。
4NF就是限制关系模式的属性之间
不允许有非平凡且非函数依赖的多值依赖
。4NF所允许的非平凡多值依赖实际上是函数依赖
- 如果一个关系模式是4NF, 则必为BCNF。
- 在的WSC中,W →→S, W→→C,他们都是非平凡多值依赖。而
W不是码
,关系模式WSC的码是(W,S,C),即All-key,因此WSC ∉ 4NF。 - 可以把WSC分解成WS(W,S),WC(W,C), WS∈4NF,WC∈4NF。
简单来说,要求多值依赖的决定属性是码
4. 规范化小结
- 在关系数据库中,对关系模式的基本要求是满足第一范式。
- 规范化程度过低的关系不一定能够很好地描述现实世界
- 可能存在插入异常、删除异常、修改复杂、数据冗余等问题
- 解决方法就是对其进行规范化,转换成高级范式。
- 一个低一级范式的关系模式,通过模式分解可以转换为若干个高一级范式的关系模式集合,这种过程就叫
关系模式的规范化
。 - 关系数据库的规范化理论是数据库逻辑设计的工具。
- 规范化的基本思想
- 是逐步消除数据依赖中不合适的部分,使模式中的各关系模式达到某种程度的“分离”。
- 即采用“一事一地”的模式设计原则(一个表表达一个实例)
- 让一个关系描述一个概念、一个实体或者实体间的一种联系。
- 若多于一个概念就把它“分离”出去。
- 因此 规
范化实质上是概念的单一化
。
- 不能说规范化程度越高的关系模式就越好。
- 必须对现实世界的实际情况和用户应用需求作进一步分析,确定一个合适的、能够反映现实世界的模式。
- 上面的规范化步骤可以在其中任何一步终止。
(三) 数据依赖的公理系统
定义11:对于满足一组函数依赖F的关系模式R<U,F>,其任何一个关系r,若函数依赖X→Y都成立(即r中任意两元组t、s,若t[X]=s[X],则t[Y]=s[Y]),则称F逻辑蕴涵X → Y。
1. Armstrong公理系统
Armstrong公理系统:是一套推理规则,是模式分解算法的理论基础。主要用于求给定关系模式的码,从一组函数依赖求得蕴涵的函数依赖
。
(1) 推理规则
Armstrong公理系统设U为属性集总体,F是U上的一组函数依赖,于是有关系模式R<U,F>,对R<U,F>来说有以下的推理规则:
- A1自反律:若Y⊆ X⊆ U,则X → Y为F所蕴涵(自己可以推出自己内部的)。
- A2增广律:若X → Y为F所蕴涵,且Z⊆ U,则XZ → YZ为F所蕴涵。
- A3传递律:若X → Y及Y → Z为F所蕴涵,则X → Z为F所蕴涵。
注意:
- 由自反律所得到的函数依赖均是平凡的函数依赖
- 自反律的使用并不依赖于F(任意依赖都有自反律)。
定理1:Armstrong推理规则是正确的。
(2) 证明
证明X→Y,即证明对于任意两个元组t,s,若t[X] = s[X],则t[Y] = s[Y]
下面从定义触发证明推理规则的正确性。
证明:
- 设Y⊆ X⊆ U。
对R<U,F>的任一关系r中的任意两个元祖t、s:若t[X]=s[X],由于Y⊆ X,有t[Y]=s[Y],所以X →Y成立,自反律得证。 - 设X→ Y为F所蕴涵,且Z⊆U。
设R<U,F>的任一关系r中任意的两个元组t、s:若t[XZ]=s[XZ],则有t[X]=s[X]和t[Z]=s[Z];由X → Y,于是有t[Y]=s[Y],所以t[YZ]=s[YZ],XZ→ YZ为F所蕴涵,增广律得证。 - 设X → Y,及Y → Z为F所蕴涵。
对R<U,F>的任一关系r中的任意两个元组t、s:若t[X]=s[X],由于X→ Y,t[Y]=s[Y];再由Y → Z,有t[Z]=s[Z],所以X → Z为F所蕴涵,传递律得证。
(2) 推导出的推理规则
根据A1,A2,A3这三条推理规则得到下面三条推理规则:
- 合并规则:由X → Y,X → Z,有X → YZ。
- 伪传递规则:由X → Y,WY → Z,有XW→ Z。
- 分解规则:由X → Y及Z⊆ Y,有X⊆ Z。
根据合并规则和分解规则,可得:
引理1:X→A1 A2…Ak成立的充分必要条件是X→Ai成立(i=1,2,…,k)。
2. 闭包
(1) F的闭包F+
定义12:在关系模式R<U,F>中为F所逻辑蕴涵的函数依赖的全体叫作F的闭包,记为F+
说明:
-
自反律、传递律和增广律称为Armstrong公理系统。
-
Armstrong公理系统具有有效性和完备性。
有效性是指由F出发根据Armstrong公理系统推导出的每一个函数依赖一定在F+中。
完备性是指F+中的每一个函数依赖,必定可以由F出发根据Armstrong公理系统推导出来。
(2) 属性集关于F的闭包XF+
定义
定义13 设F为属性集U上的一组函数依赖,X、Y ⊆ U, XF+={ A|X→A能由F根据Armstrong公理导出},XF+称为属性集X关于函数依赖集F的闭包。
引理2 设F为属性集U上的一组函数依赖,X、Y⊆ U,X→Y能由F根据Armstrong公理导出的充分必要条件是Y⊆ XF+。
判定X→Y是否能由F根据Armstrong公理导出的问题,就
转化为求出XF+,判定Y是否为XF+的子集的问题。
算法1:求闭包XF+
- 令X(0)=X,i = 0
- 求B,这里B ={A |(ョV)( ョW)(V→W∈F∧V⊆X(i)∧A∈W)}。
- X(i+1)=B∪X(i) 。
- 判断X(i+1)= X(i) 。
- 若X(i+1)与X(i)相等或X(i)=U ,则X(i)就是XF+,算法终止。
- 若否,则i=i+1,返回第2步。
[例6.11] 已知关系模式R<U, F>,其中U={A, B, C, D, E};F={AB→C, B→D, C→E, EC→B, AC→B}。求(AB)F+ 。
解 :
- 由算法,设X(0)=AB。
- 计算X(1):逐一的扫描F集合中各个函数依赖,找左部为A、B或AB的函数依赖。得到两个:AB→C,B→D。于
- 是X(1)=AB∪CD=ABCD。
- 因为X(0)≠ X(1),所以再找出左部为ABCD子集的那些函数
- 依赖,又得到C→E,AC→B,于是
- X(2)=X(1)∪BE=ABCDE。
- 因为X(2)已等于全部属性集合,所以(AB)F+ =ABCDE。
引理2:Armstrong公理系统是有效的、完备的。
有效性与完备性的含义
- 有效性:由F 出发根据Armstrong公理推导出来的每一个函数依赖一定在F+中
- 完备性:F+中的每一个函数依赖,必定可以由F出发根据Armstrong公理推导出来
证明如下
(3) F+的相关定义和求法
定义
定义14:如果F+ = G+ ,就说函数依赖集F覆盖G(F是G的覆盖,或G是F的覆盖),或F与G等价。
引理3:F+= G+的充分必要条件是F ⊆ G+和G ⊆ F+
定义15:如果函数依赖集F满足下列条件,则称F为一个极小函数依赖集。亦称为最小依赖集或最小覆盖。
- F中任一函数的
右部仅含有一个属性
。 - F中不存在这样的函数依赖X→A,使得F与F-{X→A}等价(就是去掉X→A也一样)。
- F中不存在这样的函数依赖X→A,X有真子集Z使得F-{X→A}∪{Z→A}与F等价。
求Fm
定理3:每一个函数依赖集F均等价于一个极小函数依赖集Fm。此Fm称为F的最小依赖集。
证明:构造性证明,找出F的一个最小依赖集。
F的最小依赖集Fm不唯一
(四) 模式(表)的分解
本节是通过分解函数依赖的角度来分解模式(表)
1. 概念
定义16:关系模式R<U,F>的一个分解:
ρ={R1<U1,F1>,R2<U2,F2>,...,Rn<Un,Fn>}
其中,
并且没有 Ui ⊆ Uk(就是U之间没有包含关系),Fi为F在Ui上的投影
比如分解表(A, B, C, D),不能分解出(A, B, C)和表(A, B),这样就是包含关系了
定义17:函数依赖集合{X→Y|{X→Y∈F+∧ XY ⊆ Ui}的一个覆盖Fi叫做F在属性Ui上的投影
2. 模式分解的三个定义
对于一个模式的分解是多种多样的,但是分解后产生的模式应与原模式等价。对“等价”的概念形成了三种不同的定义:
- 分解具有无损连接性。
- 分解要保持函数依赖。
- 分解既要保持函数依赖,又要具有无损连接性。
说明:
- 这三个定义实际是实行分解的三条不同的准则。按照不同的分解准则,模式所能达到的分离程度各不同,各种范式就是对分离程度的测度。
举例
【例】已知关系R<U,F>,其中,U={Sno,Sdept,Mname},F={Sno→Sdept,Sdept→Mname}。
- R<U.F>的元组语义是学生Sno正在Sdept系学习,系主任是Mname;并且一个学生(Sno)只在一个系学习,一个系只有一主任。R的一个关系见下表。
- 该模式存在的问题:更新异常,如果S4毕业了,则D3系的系主任王一的信息也就丢掉了。反过来,如果一个系D5尚无在校学生,那么这个系的系主任赵某的信息也无法存入。
- 问题的原因:R中存在传递函数依赖Sno→ Mname。
- 解决方法:模式分解,下面进行三种模式分解,并分析哪种分解更合理?
方法一
方法一:
- ρ={R,<Sno,∅ >,R,<Sdept,∅ >,R,<Mname,∅ >
- (注:R1<Sno,∅ >表示R1的函数依赖集为∅)
- 分解后诸Ri的关系ri是R在Ui上的投影,即ri=R[Ui]
- r1={S1,S2,S3,S4]},r2={D1,D2,D3],r3={张五.李四.王一]。
尝试恢复原来的表,R1⋈R2⋈R3,这是一个笛卡尔集,无法恢复原来的表
- 该分解的缺点:分解后的数据库丢失了许多信息;例如询S1学生所在系以及系主任的信息。
- 如果分解后的数据库能够恢复到原来的情况,不丢失信息的要求也就达到了。
方法二
方法二:
p2={R,<{Sno,Sdept} ,{Sno→Sdept}>,R<{Sno,Mname} ,{Sno→Mname}>]。
R1⋈R2可以恢复到原来的表,因为有相同的属性
【说明】 ,对R的分解是可恢复的,但是前面提到的插入和删除异常仍然没有解决,原因就在于原来在R中存在的函数依赖Sdept→Mname,在R,和R,中都不再存在了。因此人们又要求分解具有“保持函数依赖
”的特性。
方法三
方法三:p={R,<{Sno,Sdept},{Sno→Sdept}>,R,<{Sdept,Mname} , {Sdept→ Mname} >]。
既具有无损连接性,又保持函数依赖。它解决了更新异常又没有丢失原数据库的信息。这是所希望的分解。
3. 分解的无损连接性和保持函数依赖性
(1) 投影连接
定义
设ρ={R1<U1,F1>,R2<U2,F2>,...,Rn<Un,Fn>}(用ρ来表示分解),r是R<U, F>的一个关系,定义
即mρ(R)是r在ρ中各关系模式上投影的连接
πRi(r)= {t.Ui| t ∈ r},即r中的每一个元组t在属性Ui上的取值
比如r(Sno, Sdept, Mname)分解为R1(Sno, Sdept),R2(Sdept, Mname),则πR1(r) = (Sno, Sdept)
说明
- 注意⋈的含义不同于一般的自然连接,它是一种特殊的连接运算。上式含义为:
- 如果两个关系中
有相同的属性列
,则按自然连接
的定义进行; - 如果两个关系中
没有相同的属性列
,则按笛卡尔积
运算进行;
- 如果两个关系中
- 将运算后得到的结果与其他关系进行重复1、2步的计算,直到完成全部的连接运算。
投影连接的性质
引理4:设ρ = {R<U1,F1 >,R2<U2,F2 >,...,Rk<Uk,Fk >}为关系模式R的一个分解,r为R的任一个关系,ri = πRi(r),则
- r ⊆ mρ(r)(即r的投影连接包含r,这里是⊆,表示可以等于,但mρ(r)可能大于r)
- 如果s = mρ(r),则πRi(s) = ri
- mρ(mρ(r)) = mρ(r)
区分清楚,r是原来的关系,mρ(r)是r分解后再连接起来的关系
说明
-
r ⊆ mρ(r)
r的投影连接包含,分解后再连接起来的r肯定不会比原来的r小;
-
如果s = mρ(r),则πRi(s) = ri
投影连接后再投影到子关系模式=直接投影到该子关系模式。即πRi(r) = πRi(mρ(r))
-
mρ(mρ(r)) = mρ(r)
多次投影连接的结果等于一次投影连接后的结果
举例
【例】设有关系模式R(A,B,C),p={R1,R2}为它的一个分解,其中R1=AB,R2=BC,r为R的一个关系,r1 = πR1(r),r2=πR2(r)。
求r1,r2,mρ(r),由此可得到什么结论?
可以看到
- 分解连接mρ(r) > r的,多出来一行,但是肯定包含r
- πRi(s) = ri,上下两个r1 r2相同
【结论】分解后的关系进行自然联接必包含
分解前的关系,即分解不会丢失信息,但可能增加信息,只有r=mρ(r)时,分解才具有无损联接性
。
(2) 无损连接性
定义
定义:关系模式R<U, F>的一个分解ρ={R1<U1,F1>,R2<U2,F2>,...,Rn<Un,Fn>}
若对于R 的任何一个关系r均有r = mρ(r),则称分解ρ具有无损连接性,简称ρ为无损连接
算法2:判别无损连接性
ρ={R1<U1,F1>,R2<U2,F2>,...,Rn<Un,Fn>}是R<U, F>的一个分解,U = {A1, A2, ..., AN},F = {FD1. FD2, ... FDρ},设F是一极小依赖集,FDi 为 Xi→ Ali
a. 方法一
-
构造初始表:构造一个k行n列的初始表(k是分解的模式的个数,分解为k个表就k行,n是总共的属性的个数,r有n个属性就n列),其中每列对应于R的一个属性,每行用于表示分解后的一个模式组成。如果属性Aj属于关系模式Ri,则在表的第i行第j列置符号aj,否则符号blj
-
根据F中的函数依赖修改表内容
对每个Fdi做下列操作
- 找到Xi具有相同符号的行,考察这些行中li列的元素。若其中有ali,则全部改为ali;否则全部改为bmli,其中m是这些行的行号最小值。
- 注意:若某个btli被更改,则表的li列中凡是btli的符号(不管它是否开始找到的那些行)均应做相应的更改。
- 循环执行以上操作,若有一行变为a1, a2,...an则算法终止,ρ具有无损连接性,否则ρ 不具有无损连接性。
-
比较扫描前后表有无变化,如有变化则返回2中,否则算法终止。
【定理4】如果算法2终止时表中有一行为a1, a2,…,an,则p 为无损连接分解。
【例】已知R<U,F>,U={A,B,C,D,E},F={AB→C,C→D,D→F的一个分解为R1(A,B,C),R2(C,D),R3(D, E)。
- 第一步,构建初始表如下
-
第一行,a1,a2,a3是因为R1中含有ABC,b14,b15是因为R1中没有DE
-
第二行,a3,a4是因为R2中有CD,b21,b22,b25是因为R2中没有ADE
- 根据F中的函数依赖修改表内容
- 对AB→C,因个元组的第一、第二列没有相同的分量,所以标不变
- C→D可以把b14改为a4。
- D→E可以把b15、 b25改为a5
可以看到第一行出现了a1-a5,说明具有无损连接性
b. 方法二
对于R<U,F>的一个分解ρ={R1<U1,F1>,R2<U2,F2>,...,Rn<Un,Fn>},如果(U1 ∩ U2) → U1 - U2 或者 (U1 ∩ U2) → U2 - U1,则ρ具有无损连接性
(3) 函数依赖性
定义19:若
则 ρ={R1<U1,F1>,R2<U2,F2>,...,Rn<Un,Fn>}保持函数依赖
4. 模式分解的算法
模式分解对应的范式等级
-
若要求分解
保持函数依赖
,那么模式分解总可以达到3NF,但不一定能达到BCNF;BCNF要求决定因素必须为码,3NF只能要求决定因素为主属性或者码
-
若要求分解既保持函数依赖,又具有无损连接性,可以达到3NF,但不一定能达到BCNF;
-
若要求分解具有
无损连接性
,那一定可达到4NF。
算法3(合成法):转换为3NF的保持函数依赖的分解
-
对R<U,F>中的F进行极小化处理。
-
找出不在F中出现的属性(记作U0),把这样的属性构成一个关系模式R0<U0,F0>,把这些属性从U中去掉,剩余的属性仍记为U。
-
若有X→A∈F,且XA=U,则则ρ ={R},算法终止。
也就是如果→左右两边构成的集合是全部的属性,则不用分了
-
否则,对F按具有相同左部的原则分组(假定分为K组),每一组函数依赖所涉及的全部属性形成一个属性集Ui,若Ui ⊆ Uj,(i ≠ j),就去诶到Ui, 于是ρ = ρ={R1<U1,F1>,R2<U2,F2>,...,Rk<Uk,Fk>} ∪ R0<U0, F0>(将原来的分组加起来),构成R<U,F>的一个保持函数依赖的分解,并且每个Ri <Ui,Fi>均属于3NF。
总结来说:就是左部相同原则
【例】R (Sno,Sname,Sdept,Mname) ,F={Sno→Sname,Sno→sdept,Sdept→Mname},分解R,使其保持函数依赖达到3NF。
解:
-
F已经是最小集
-
同时也找不出不在F中出现的属性
-
现将按照相同左部原则进行分组,结果为:
R1<(Sno,Sname,Sdept),{Sno→Sname,Sno→Sdept}>这两个函数依赖的左边都是Sno
R2<(Sdept,Mname) , Sdept→Mname>
算法4:转换为3NF既有无损连接性又保持函数依赖的分解
- 设X是R<U,F>的码,R<U,F>已有算法3分解为ρ = ρ={R1<U1,F1>,R2<U2,F2>,...,Rk<Uk,Fk>} ∪ R0<U0, F0>,令τ = ρ ∪ {R*<X, FX>}
- 如果有某个Ui。X ⊆ Ui,将{R*<X, FX>} 从τ中去掉,或者Ui ⊆ X,将R<Ui, FX>从掏中去掉
- τ就是所求的分解
【例】设R(ABCDE),F={A→B.C→D},分解R为一组3NF的关系模式,要求分解既具有无损联接性又保持函数依赖。
解:
-
ACE为侯选码;
(因为在上述关系中,CE并不能由函数依赖推出来,因此必须作为码)
-
按算法3,p={R1(AB),R2(CD)} ;
-
判断侯选码ACE不在分解后的子关系模式中,所以加上码ACE组成的模式R3(ACE)。
-
所以p={R1(AB), R2(CD),R3(ACE)}是一个3NF的关系模式,既具有无损联接性又保持函数依赖。
算法5(分解法):转换为BCNF的无损连接分解
-
令ρ =
-
检查ρ中各关系模式是否均属于BCNF。若是,则算法终止。
属于BCNF要求X→Y的所有X都是候选码,候选码是能够标识整个元组的
-
设ρ中Ri<Ui,Fi>,不属于BCNF,那么必有X→A∈Fi+(A∉X),且X非Ri的码。因此XA是Ui的真子集。
对Ri进行分解,σ = {S1, S2},US1 = XA, US2 = Ui - {A}, 以σ代替Ri<Ui,Fi>返回第二步
相关引理
- 引理5:若p={R1<U1,F1>,...Rk <Uk,Fk >}是R<U,F>的一个无损连接分解,σ={S1, S2,.... Sm}是ρ中Ri<Ui,Fi>的一个无损连接分解,那么,p'=
{R,R2,....Ri-1,S1, S2,.. Sm,Ri+1 ..,Rk}和p"= {R1,....Rk, Rk+1,...Rn},均为R<U,F>的无损连接分解。 - 引理6:(R1⋈R2)⋈R3=R1⋈(R2⋈R3)
- 定理6:关系模式R<U,D>中,D为R中函数依赖FD和多值依赖MVD的集合。则X →→ Y成立的充分必要条件是:R的分解 p={R1<X,Y>,R2 <X,Z>}具有无损连接性,其中Z = U - X - Y
算法6:达到4NF的具有无损连接性的分解。
首先使用算法5得到R的一个达到BCNF的无损连接分解ρ,然后对某一个Ri<Ui,Fi>,若不属于4NF,则可按定理6进行分解,直到每一个关系模式均属于4NF为止。
5. 包含函数依赖和多值依赖的有效且完备的公理系统
- A1:若Y ⊆ X ⊆ U,则X→ Y。
- A2:若X→Y,且Z ⊆ U,则XZ→YZ
- A3:若X→Y,Y →Z,则X → Z。
- A4:若X →→Y, V ⊆ W ⊆ U,则XW → Y V(X与大的∪,Y与小的∪)
- A5:若X→→ Y,则X→→U―X -Y(多值依赖的对称性)
- A6:若X→→Y,Y →→Z,则X→→Z-Y(相当于X→→Z对应Y 的那一部分)
- A7:若X →Y,则X→→ Y。
- A8:若X →→Y,W →Z,W ∩Y = ∅, Z ⊆ Y,则X→Z。
由以上8条公理得知如下4条有用的推理规则:
- 合并规则:X→→ Y,Y →→Z,则X→→YZ。
- 伪传递规则:X →→ Y , WY →→Z,则WX→→Z-WY
- 混合伪传递规则:X→→Y,XY →→Z,则X→→Z-Y
- 分解规则:X→→Y,X →Z,则X→→Y ∩Z,X →→Y -Z,X →→Z - Y
(五) 小结
FD是函数依赖,MVD是多值函数依赖
- 规范化理论为数据库设计提供理论的指南和工具,仅仅是指南和工具。
- 并不是规范化程度越高,模式就越好,必须结合应用环境和现实世界的具体情况合理地选择数据库模式。