参考《数据库系统概论》
问题的提出
关系数据库逻辑设计
- 针对具体问题,如何构造一个适合于它的数据模式,即应该构造几个关系模式,每个关系由哪些属性组成等
- 数据库逻辑设计的工具──关系数据库的规范化理论
关系模式的形式化定义
- 关系模式由五部分组成,即它是一个五元组:
R ( U , D , D O M , F ) R(U, D, DOM, F) R(U,D,DOM,F)- R R R:关系名
- U U U:组成该关系的属性名集合
- D D D:属性组 U U U 中属性所来自的域
- D O M DOM DOM:属性向域的映象集合
- F F F:属性间数据的依赖关系集合
- 在本章中把关系模式看作是一个三元组:
R ( U , F ) R ( U,F) R(U,F)当且仅当 U U U 上的一个关系 r r r 满足 F F F 时, r r r 称为关系模式 R < U , F > R<U,F> R<U,F> 的一个关系
数据依赖
- 一个关系内部属性与属性之间的约束关系(主要体现于值的相等与否)
- 函数依赖(Functional Dependency,简记为 FD)
- 比如描述一个学生的关系,可以有学号等属性,由于一个学号只对应一个学生,一个学生只在一个系学习。因而当“学号”值确定之后,学生的姓名及所在系的值也就被唯一地确定了。属性间的这种依赖关系类似于数学中的函数 y = f ( x ) y=f(x) y=f(x), 自变量 x x x 确定之后,相应的函数值 y y y 也就唯一地确定了
- 记作 S n o → S n a m e Sno\rightarrow Sname Sno→Sname, S n o → S d e p t Sno\rightarrow Sdept Sno→Sdept
- 多值依赖(Multivalued Dependency,简记为 MVD)
- 函数依赖(Functional Dependency,简记为 FD)
数据依赖对关系模式的影响
例
- 建立一个描述学校教务的数据库:学生的学号(Sno)、所在系(Sdept)系主任姓名(Mname)、课程名(Cname)、成绩(Grade)
- 单一的关系模式 :
S
t
u
d
e
n
t
<
U
、
F
>
Student <U、F>
Student<U、F>
U = { S n o , S d e p t , M n a m e , C n a m e , G r a d e } F = { S n o → S d e p t , S d e p t → M n a m e , ( S n o , C n a m e ) → G r a d e } U ={Sno,Sdept,Mname,Cname,Grade}\\ F ={Sno→Sdept, Sdept→Mname,(Sno,Cname)→Grade} U={Sno,Sdept,Mname,Cname,Grade}F={Sno→Sdept,Sdept→Mname,(Sno,Cname)→Grade} - 但是,这个关系模式存在以下问题:
- (1) 数据冗余太大
- 比如每个元组里都有系主任
- (2) 更新异常(Update Anomalies): 由于数据冗余、当更新数据库中的数据时,系统要付出很大的代价来维护数据库的完整性,否则会面临数据不一致的危险
- 比如,某系更换系主任后,必须修改与该系学生有关的每一个元组
- (3) 插入异常(Insertion Anomalies)
- 如果一个系刚成立,尚无学生,就无法把这个系及其系主任的信息存入数据库
- (4) 删除异常(Deletion Anomalies)
- 如果某个系的学生全部毕业了,在删除该系学生信息的同时,把这个系及其系主任的信息也丢掉了
- (1) 数据冗余太大
- 结论:Student 关系模式不是一个好的模式; 一个 “好” 的模式不会发生插入异常、删除异常、更新异常。数据冗余应尽可能少
- 原因:由存在于模式中的某些数据依赖引起的
- 解决方法:通过分解关系模式来消除其中不合适的数据依赖
S ( S n o , S d e p t , S n o → S d e p t ) ; S C ( S n o , C n o , G r a d e , ( S n o , C n o ) → G r a d e ) ; D E P T ( S d e p t , M n a m e , S d e p t → M n a m e ) ; S(Sno,Sdept,Sno→Sdept);\\ SC(Sno,Cno,Grade,(Sno,Cno)→ Grade); \\ DEPT(Sdept,Mname,Sdept → Mname); S(Sno,Sdept,Sno→Sdept);SC(Sno,Cno,Grade,(Sno,Cno)→Grade);DEPT(Sdept,Mname,Sdept→Mname);
规范化
- 规范化理论正是用来改造关系模式,通过分解关系模式来消除其中不合适的数据依赖,以解决插入异常、删除异常、更新异常和数据冗余问题
函数依赖
函数依赖
- 设
R
(
U
)
R(U)
R(U) 是一个属性集
U
U
U 上的关系模式,
X
X
X 和
Y
Y
Y 是
U
U
U 的子集。若对于
R
(
U
)
R(U)
R(U) 的任意一个可能的关系
r
r
r,
r
r
r 中不可能存在两个元组在
X
X
X 上的属性值相等,而在
Y
Y
Y 上的属性值不等,则称 “
X
X
X 函数确定
Y
Y
Y”或 “
Y
Y
Y 函数依赖于
X
X
X”,记作
X
→
Y
X→Y
X→Y
- 注意: 所有关系实例均要满足; 函数依赖和别的数据依赖一样是语义范畴的概念,只能根据语义来确定一个函数依赖; 数据库设计者可以对现实世界作强制的规定 (例如规定不允许同名人出现,因而使 姓 名 → 年 龄 姓名→年龄 姓名→年龄 函数依赖成立)
- 若 X → Y X→Y X→Y,则 X X X 称为这个函数依赖的决定属性组,也称为决定因素(Determinant)
- 若 X → Y X→Y X→Y, Y → X Y→X Y→X,则记作 X ← → Y X←→Y X←→Y
- 若 Y Y Y 不函数依赖于 X X X,则记作 X ↛ Y X\not→Y X→Y
平凡函数依赖与非平凡函数依赖
- 若 X → Y X→Y X→Y,但 Y ⊄ X Y \not\subset X Y⊂X,则称 X → Y X→Y X→Y 是非平凡的函数依赖
- 若
X
→
Y
X→Y
X→Y,但
Y
⊆
X
Y ⊆ X
Y⊆X, 则称
X
→
Y
X→Y
X→Y 是平凡的函数依赖
- 对于任一关系模式,平凡的函数依赖都是必然成立的,不反映新的语义,因此若不特别声明,总是讨论非平凡函数依赖
完全函数依赖与部分函数依赖
- 在 R ( U ) R(U) R(U) 中,如果 X → Y X→Y X→Y,并且对于 X X X 的任何一个真子集 X ’ X’ X’,都有 X ’ ↛ Y X’ \not→ Y X’→Y, 则称 Y Y Y 对 X X X 完全函数依赖,记作 X → F Y X\mathop{→}\limits^{F}Y X→FY; 反之称 Y Y Y 对 X X X 部分函数依赖,记作 X → P Y X\mathop{→}\limits^{P}Y X→PY
传递函数依赖
- 在
R
(
U
)
R(U)
R(U) 中,如果
X
→
Y
X→Y
X→Y,
(
Y
⊈
X
)
(Y\not ⊆X)
(Y⊆X) ,
Y
↛
X
Y\not →X
Y→X,
Y
→
Z
Y→Z
Y→Z,则称
Z
Z
Z 对
X
X
X 传递函数依赖。记为:
X
→
传
递
Z
X \mathop{→}\limits^{传递} Z
X→传递Z
- 注: 如果 Y → X Y→X Y→X, 即 X ← → Y X←→Y X←→Y,则 Z Z Z 直接依赖于 X X X
码
- 设
K
K
K 为
R
<
U
,
F
>
R<U,F>
R<U,F> 中的属性或属性组合。若
K
→
F
U
K \mathop{→}\limits^FU
K→FU 则
K
K
K 称为
R
R
R 的侯选码(Candidate Key)。若候选码多于一个,则选定其中的一个做为主码(Primary Key)
- 整个属性组是码,称为全码(All-key)
- 关系模式 R R R 中属性或属性组 X X X 并非 R R R 的码,但 X X X 是另一个关系模式的码,则称 X X X 是 R R R 的外部码(Foreign key)也称外码
- 包含在任何一个候选码中的属性 ,称为主属性(Prime attribute)
- 不包含在任何码中的属性称为非主属性(Nonprime attribute)或非码属性(Non-key attribute)
范式
- 范式是符合某一种级别的关系模式的集合
- 一个低一级范式的关系模式,通过模式分解可以转换为若干个高一级范式的关系模式的集合,这种过程就叫规范化
1NF
- 如果一个关系模式
R
R
R 的所有属性都是不可分的基本数据项,则
R
∈
1
N
F
R∈1NF
R∈1NF
- 第一范式是对关系模式的最起码的要求。不满足第一范式的数据库模式不能称为关系数据库
- 满足第一范式的关系模式并不一定是一个好的关系模式
例
- 关系模式 S − L − C ( S n o , S d e p t , S l o c , C n o , G r a d e ) S-L-C(Sno, Sdept, Sloc, Cno, Grade) S−L−C(Sno,Sdept,Sloc,Cno,Grade); S l o c Sloc Sloc 为学生住处,假设每个系的学生住在同一个地方
-
S
−
L
−
C
S-L-C
S−L−C 满足第一范式,码为
(
S
n
o
,
C
n
o
)
(Sno, Cno)
(Sno,Cno);函数依赖包括:
( S n o , C n o ) → F G r a d e S n o → S d e p t S n o → S l o c S d e p t → S l o c (Sno, Cno) \mathop{→}\limits^{F}Grade\\ Sno → Sdept\\ Sno → Sloc\\ Sdept → Sloc (Sno,Cno)→FGradeSno→SdeptSno→SlocSdept→Sloc
虚线表示部分函数依赖
-
S
−
L
−
C
S-L-C
S−L−C 不是一个好的关系模式
- (1) 插入异常: 无法插入未选课的学生
- (2) 删除异常: 只选一门课的学生不选课之后他的其他信息也都被删除了
- (3) 修改复杂
- (4) 数据冗余度大
- 原因:
S
d
e
p
t
Sdept
Sdept、
S
l
o
c
Sloc
Sloc 部分函数依赖于码
- 解决方法:
S
−
L
−
C
S- L-C
S−L−C 分解为两个关系模式,以消除这些部分函数依赖 (仍无法解决(3)(4))
S C ( S n o , C n o , G r a d e ) S − L ( S n o , S d e p t , S l o c ) SC(Sno, Cno, Grade)\\ S-L(Sno, Sdept, Sloc) SC(Sno,Cno,Grade)S−L(Sno,Sdept,Sloc)
- 解决方法:
S
−
L
−
C
S- L-C
S−L−C 分解为两个关系模式,以消除这些部分函数依赖 (仍无法解决(3)(4))
2NF
- 若
R
∈
1
N
F
R∈1NF
R∈1NF,且每一个非主属性完全函数依赖于码,则
R
∈
2
N
F
R∈2NF
R∈2NF
- 去除了非主属性对主属性的部份依赖
- 由上例可知,将一个 1NF 的关系分解为多个 2NF 的关系,可以在一定程度上减轻原1NF关系中存在的插入异常、删除异常、数据冗余度大、修改复杂等问题,但并不能完全消除关系模式中的各种异常情况和数据冗余
- 例如:插入异常:系刚成立,没有学生则无法插入;删除异常:该系所有学生毕业后息也没了;修改复杂:住所修改复杂;数据冗余:每个系的学生都住在一个地方,但每个系的学生却都要存一遍住处
3NF
- 关系模式
R
<
U
,
F
>
R<U,F>
R<U,F> 中若不存在这样的码
X
X
X、属性组
Y
Y
Y 及非主属性
Z
(
Z
⊈
Y
)
Z(Z \not⊆ Y)
Z(Z⊆Y),使得
X
→
Y
X→Y
X→Y,
Y
→
Z
Y→Z
Y→Z 成立,
Y
↛
X
Y \not→ X
Y→X,则称
R
<
U
,
F
>
∈
3
N
F
R<U,F>∈3NF
R<U,F>∈3NF
- 去除了非主属性对主属性的传递依赖
例
- 2NF 关系模式
S
−
L
(
S
n
o
,
S
d
e
p
t
,
S
l
o
c
)
S-L(Sno,Sdept,Sloc)
S−L(Sno,Sdept,Sloc) 中, 函数依赖:
S n o → S d e p t S d e p t ↛ S n o S d e p t → S l o c Sno→Sdept\\Sdept \not→ Sno\\Sdept→Sloc Sno→SdeptSdept→SnoSdept→Sloc可得: S n o → 传 递 S l o c Sno\mathop{→}\limits^{传递} Sloc Sno→传递Sloc - 把
S
−
L
S-L
S−L 分解为两个关系模式,以消除传递函数依赖:
S − D ( S n o , S d e p t ) D − L ( S d e p t , S l o c ) S-D(Sno, Sdept)\\ D-L(Sdept,Sloc) S−D(Sno,Sdept)D−L(Sdept,Sloc)
- 将一个 2NF 的关系分解为多个 3NF 的关系,可以在一定程度上解决原 2NF 关系中存在的插入异常、删除异常、数据冗余度大、修改复杂等问题,但仍然不能完全消除关系模式中的各种异常情况和数据冗余
- 例如,关系模式 S T ( S , T , J ) ST(S,T,J) ST(S,T,J);其中 S , T , J S,T,J S,T,J 分别表示学生、教师、课程,每一教师只教一门课。每门课有若干教师,某一学生选定某门课,就对应一个固定的教师
- 因此函数依赖为:
( S , J ) → T , ( S , T ) → J , T → J (S,J)→T,(S,T)→J,T→J (S,J)→T,(S,T)→J,T→J -
(
S
,
T
)
,
(
S
,
J
)
(S,T),(S,J)
(S,T),(S,J) 均为候选码,因此
S
,
T
,
J
S,T,J
S,T,J 均为主属性,关系模式
S
T
(
S
,
T
,
J
)
ST(S,T,J)
ST(S,T,J) 属于 3NF
- 插入异常:如果某教师开设了某门课程,但无人选修,则无法存入数据库
- 删除异常:选修过某门课的学生都毕业了,则删除这些学生元组时,相应教师开设该门课的信息也丢失了
- 修改复杂:某个教师教授的课程更名后,所有选修了该教师该门课程的学生元组都要进行修改
- 数据冗余度大:虽然一个教师只教一门课,但每个选修该教师该门课程的学生元组都要记录这一信息
- 原因:主属性 J J J 部分依赖于码 ( S , T ) (S,T) (S,T)
- 解决方法:将 S − T − J S-T-J S−T−J 分解为两个关系模式: S J ( S , J ) ; T J ( T , J ) SJ(S,J);TJ(T,J) SJ(S,J);TJ(T,J)
BCNF
- 关系模式
R
<
U
,
F
>
∈
1
N
F
R<U,F>∈1NF
R<U,F>∈1NF, 若
X
→
Y
X→Y
X→Y 且
Y
⊈
X
Y\not⊆X
Y⊆X 时
X
X
X 必含有码, 则
R
<
U
,
F
>
∈
B
C
N
F
R<U,F>∈BCNF
R<U,F>∈BCNF
- 即,每一个决定属性因素都包含码
- 所有非主属性对每一个码都是完全函数依赖
- 所有的主属性对每一个不包含它的码,也是完全函数依赖
- 没有任何属性完全函数依赖于非码的任何一组属性
例
- 在上例的关系模式
S
T
J
(
S
,
T
,
J
)
STJ(S,T,J)
STJ(S,T,J) 中,
S
T
J
∉
B
C
N
F
STJ\not\in BCNF
STJ∈BCNF
- 解决方法:将
S
T
J
STJ
STJ 分解为二个关系模式:
S T ( S , T ) ∈ B C N F , T J ( T , J ) ∈ B C N F ST(S,T)∈BCNF, TJ(T,J)∈BCNF ST(S,T)∈BCNF,TJ(T,J)∈BCNF
- 一个模式中的关系模式如果都属于 BCNF, 那么在函数依赖范畴内,它已实现了彻底的分离,已消除了插入和删除的异常
- 3NF 的 “不彻底性” 表现在可能存在主属件对码的部分依赖和传递依赖
题目参考 4.23 相册
* 多值依赖
例
- 学校中某一门课程由多个教师讲授,他们使用相同的一套参考书。每个教员可以讲授多门课程,每种参考书可以供多门课程使用
- 非规范化关系
- 用二维表表示 Teaching
- Teaching 具有唯一候选码
(
C
,
T
,
B
)
(C,T,B)
(C,T,B), 即全码; 因此
T
e
a
c
h
i
n
g
∈
B
C
N
F
Teaching∈BCNF
Teaching∈BCNF; Teaching 模式中存在的问题 (存在多值依赖):
- (1) 数据冗余度大
- (2) 插入操作复杂
- (3) 删除操作复杂
- (4) 修改操作复杂
- 非规范化关系
多值依赖
- 设
R
(
U
)
R(U)
R(U) 是一个属性集
U
U
U 上的一个关系模式,
X
X
X、
Y
Y
Y 和
Z
Z
Z 是
U
U
U 的子集,并且
Z
=
U
-
X
-
Y
Z=U-X-Y
Z=U-X-Y。关系模式
R
(
U
)
R(U)
R(U) 中多值依赖
X
→
→
Y
X→→Y
X→→Y 成立,当且仅当对
R
(
U
)
R(U)
R(U) 的任一关系
r
r
r,给定的一对
(
x
,
z
)
(x,z)
(x,z) 值,有一组
Y
Y
Y 的值,这组值仅仅决定于
x
x
x 值而与
z
z
z 值无关
- 例如,在关系模式 Teaching 中,对于一个 ( 物 理 , 光 学 原 理 ) (物理,光学原理) (物理,光学原理) 有一组 T T T 值 ∣ 李 勇 、 王 军 ∣ |李勇、王军| ∣李勇、王军∣. 这组值仅仅决定于课程 C C C 的值(物理),也就是说对于另一个 ( 物 理 , 普 通 物 理 学 ) (物理,普通物理学) (物理,普通物理学) 它对应的一组 T T T 值仍是 ∣ 李 勇 、 王 军 ∣ |李勇、王军| ∣李勇、王军∣, 尽管这时参考书 B B B 的值已经改变。因此 T T T 多值依赖于 C C C, 即 C → → T C→→T C→→T
… (未完待续)
* 4NF
… (未完待续)
规范化小结
- 不能说规范化程度越高的关系模式就越好; 在设计数据库模式结构时,必须对现实世界的实际情况和用户应用需求作进一步分析,确定一个合适的、能够反映现实世界的模式
- 上面的规范化步骤可以在其中任何一步终止
数据依赖的公理系统
- 数据依赖的公理系统是模式分解算法的理论基础
逻辑蕴含
- 对于满足一组函数依赖 F F F 的关系模式 R < U , F > R<U,F> R<U,F>,其任何一个关系 r r r,若函数依赖 X → Y X→Y X→Y 都成立,(即 r r r 中任意两元组 t t t, s s s,若 t [ X ] = s [ X ] t[X]=s[X] t[X]=s[X],则 t [ Y ] = s [ Y ] t[Y]=s[Y] t[Y]=s[Y]),则称 F F F 逻辑蕴含 X → Y X→Y X→Y
Armstrong 公理系统
- 关系模式
R
<
U
,
F
>
R <U,F>
R<U,F> 有以下的推理规则:
- A 1 A_1 A1 自反律(Reflexivity):若 Y ⊆ X ⊆ U Y⊆X⊆U Y⊆X⊆U,则 X → Y X→Y X→Y 为 F F F 所蕴含
- A 2 A_2 A2 增广律(Augmentation):若 X → Y X→Y X→Y 为 F F F 所蕴含,且 Z ⊆ U Z⊆U Z⊆U,则 X Z → Y Z XZ→YZ XZ→YZ 为 F F F 所蕴含
- A 3 A_3 A3 传递律(Transitivity):若 X → Y X→Y X→Y 及 Y → Z Y→Z Y→Z 为 F F F 所蕴含,则 X → Z X→Z X→Z 为 F F F 所蕴含
导出规则
- 可以进一步导出下面三条推理规则:
- 合并规则:由
X
→
Y
X→Y
X→Y,
X
→
Z
X→Z
X→Z,有
X
→
Y
Z
X→YZ
X→YZ(
A
2
A_2
A2 ,
A
3
A_3
A3)
- X → Y ⇒ X X → X Y X→Y\Rightarrow XX→XY X→Y⇒XX→XY, X → Z ⇒ X Y → Y Z X→Z\Rightarrow XY→YZ X→Z⇒XY→YZ ; 因此有 X → Y Z X→YZ X→YZ
- 伪传递规则:由 X → Y X→Y X→Y, W Y → Z WY→Z WY→Z,有 X W → Z XW→Z XW→Z( A 2 A_2 A2 , A 3 A_3 A3)
- 分解规则:由 X → Y X→Y X→Y 及 Z ⊆ Y Z⊆Y Z⊆Y,有 X → Z X→Z X→Z ( A 1 A_1 A1 , A 3 A_3 A3)
- 合并规则:由
X
→
Y
X→Y
X→Y,
X
→
Z
X→Z
X→Z,有
X
→
Y
Z
X→YZ
X→YZ(
A
2
A_2
A2 ,
A
3
A_3
A3)
- 根据合并规则和分解规则,可得引理 6.1
- 引理 6.1 X → A 1 A 2 … A k X→A_1 A_2…A_k X→A1A2…Ak 成立的充分必要条件是 X → A i X→A_i X→Ai 成立( i = 1 , 2 , … , k i=1,2,…,k i=1,2,…,k)
闭包
- 在关系模式
R
<
U
,
F
>
R<U,F>
R<U,F> 中为
F
F
F 所逻辑蕴含的函数依赖的全体叫作
F
F
F 的闭包,记为
F
+
F^+
F+
- Armstrong 公理系统是有效的、完备的; 有效性:由
F
F
F 出发根据 Armstrong 公理推导出来的每一个函数依赖一定在
F
+
F^+
F+ 中;完备性:
F
+
F^+
F+ 中的每一个函数依赖,必定可以由
F
F
F 出发根据 Armstrong 公理推导出来
- Armstrong 公理系统是有效的、完备的; 有效性:由
F
F
F 出发根据 Armstrong 公理推导出来的每一个函数依赖一定在
F
+
F^+
F+ 中;完备性:
F
+
F^+
F+ 中的每一个函数依赖,必定可以由
F
F
F 出发根据 Armstrong 公理推导出来
函数依赖闭包
- 设
F
F
F 为属性集
U
U
U 上的一组函数依赖,
X
⊆
U
X⊆U
X⊆U,
X
F
+
=
{
A
∣
X
→
A
能
由
F
根
据
A
r
m
s
t
r
o
n
g
公
理
导
出
}
X_F^+=\{A|X→A能由F根据Armstrong公理导出\}
XF+={A∣X→A能由F根据Armstrong公理导出},
X
F
+
X_F^+
XF+ 称为属性集
X
X
X 关于函数依赖集
F
F
F 的闭包
- 设 F F F 为属性集 U U U 上的一组函数依赖, X , Y ⊆ U X,Y⊆U X,Y⊆U, X → Y X→Y X→Y 能由 F F F 根据 Armstrong 公理导出的充分必要条件是 Y ⊆ X F + Y⊆X_F^+ Y⊆XF+
- 用途: 将判定 X → Y X→Y X→Y 是否能由 F F F 根据 Armstrong 公理导出的问题,转化为求出 X F + X_F^+ XF+、判定 Y Y Y 是否为 X F + X_F^+ XF+ 的子集的问题
求闭包的算法
- 输入: X , F X,F X,F; 输出: X F + X_F^+ XF+
- 步骤:
- (1) 令 X ( 0 ) = X , i = 0 X^{(0)}=X,i=0 X(0)=X,i=0
- (2) 求 B B B,这里 B = { A ∣ ( ∃ V ) ( ∃ W ) ( V → W ∈ F ∧ V ⊆ X ( i ) ∧ A ∈ W ) } B=\{A|(∃V)(∃W)(V→W∈F∧V⊆X^{(i)}∧A∈W)\} B={A∣(∃V)(∃W)(V→W∈F∧V⊆X(i)∧A∈W)}
- (3) X ( i + 1 ) = B ∪ X ( i ) X^{(i+1)}=B∪X^{(i)} X(i+1)=B∪X(i)
- (4) 判断 X ( i + 1 ) = X ( i ) X^{(i+1)}= X^{(i)} X(i+1)=X(i) 吗?
- (5) 若相等或 X ( i ) = U X^{(i)}=U X(i)=U, 则 X ( i ) X^{(i)} X(i) 就是 X F + X_F^+ XF+ , 算法终止
- (6) 若否,则 i = i + 1 i=i+1 i=i+1,返回第(2)步
该算法最多 ∣ U ∣ − ∣ X ∣ |U|-|X| ∣U∣−∣X∣ 次循环就会终止
例
- 已知关系模式
R
<
U
,
F
>
R<U,F>
R<U,F>,其中
U = { A , B , C , D , E } F = { A B → C , B → D , C → E , E C → B , A C → B } U=\{A,B,C,D,E\}\\ F=\{AB→C,B→D,C→E,EC→B,AC→B\} U={A,B,C,D,E}F={AB→C,B→D,C→E,EC→B,AC→B}求 ( A B ) F + (AB)_F^+ (AB)F+
解
- 设
X
(
0
)
=
A
B
X^{(0)}=AB
X(0)=AB
- (1) X ( 1 ) = A B ∪ C D = A B C D X^{(1)}=AB∪CD=ABCD X(1)=AB∪CD=ABCD
- (2) X ( 2 ) = X ( 1 ) ∪ B E = A B C D E X^{(2)}=X^{(1)}∪BE=ABCDE X(2)=X(1)∪BE=ABCDE
- (3) X ( 2 ) = U X^{(2)}=U X(2)=U,算法终止
上述算法可以用来判断主键
函数依赖集等价
- 如果 G + = F + G^+=F^+ G+=F+,就说函数依赖集 F F F 覆盖 G G G( F F F 是 G G G 的覆盖,或 G G G 是 F F F 的覆盖),或 F F F 与 G G G 等价
- G + = F + G^+=F^+ G+=F+ 的充分必要条件是 F ⊆ G + F ⊆ G^+ F⊆G+, G ⊆ F + G ⊆ F^+ G⊆F+
例
- F = { A B → C , A → B , B → A } , G = { A → C , A → B , B → A } F=\{AB→C,A→B,B→A\},G=\{A→C,A→B,B→A\} F={AB→C,A→B,B→A},G={A→C,A→B,B→A}, F , G F,G F,G 是否等价?
解
- ( A B ) G + = { A B C } ⇒ A B → C ⊂ G + ⇒ F ⊂ G + (AB)_G^+=\{ABC\}\Rightarrow AB\rightarrow C\subset G^+\Rightarrow F\subset G^+ (AB)G+={ABC}⇒AB→C⊂G+⇒F⊂G+
- ( A ) F + = { A B C } ⇒ A → C ⊂ F + ⇒ G ⊂ F + (A)_F^+=\{ABC\}\Rightarrow A\rightarrow C\subset F^+\Rightarrow G\subset F^+ (A)F+={ABC}⇒A→C⊂F+⇒G⊂F+
- 所以它们等价
最小依赖集
- 如果函数依赖集
F
F
F 满足下列条件,则称
F
F
F 为一个极小函数依赖集。亦称为最小依赖集或最小覆盖
- (1) F F F 中任一函数依赖的右部仅含有一个属性
- (2) F F F 中不存在这样的函数依赖 X → A X→A X→A,使得 F F F 与 F − { X → A } F-\{X→A\} F−{X→A} 等价
- (3) F F F 中不存在这样的函数依赖 X → A X→A X→A, X X X 有真子集 Z Z Z 使得 F − { X → A } ∪ { Z → A } F-\{X→A\}∪\{Z→A\} F−{X→A}∪{Z→A} 与 F F F 等价
- 每一个函数依赖集 F F F 均等价于一个极小函数依赖集 F m F_m Fm。此 F m F_m Fm 称为 F F F 的最小依赖集
例
- 关系模式
S
<
U
,
F
>
S<U,F>
S<U,F>,其中:
U = { S n o , S d e p t , M n a m e , C n o , G r a d e } F = { S n o → S d e p t , S d e p t → M n a m e , ( S n o , C n o ) → G r a d e } U=\{ Sno,Sdept,Mname,Cno,Grade \}\\ F=\{ Sno→Sdept,Sdept→Mname,(Sno,Cno)→Grade \} U={Sno,Sdept,Mname,Cno,Grade}F={Sno→Sdept,Sdept→Mname,(Sno,Cno)→Grade}设 F ’ = { S n o → S d e p t , S n o → M n a m e , S d e p t → M n a m e , ( S n o , C n o ) → G r a d e , ( S n o , S d e p t ) → S d e p t } F’=\{Sno→Sdept,Sno→Mname,Sdept→Mname,(Sno,Cno)→Grade,(Sno,Sdept)→Sdept\} F’={Sno→Sdept,Sno→Mname,Sdept→Mname,(Sno,Cno)→Grade,(Sno,Sdept)→Sdept} - F F F 是最小覆盖,而 F ’ F’ F’ 不是。因为: F ’ − { S n o → M n a m e } F’- \{Sno→Mname\} F’−{Sno→Mname} 与 F ’ F’ F’ 等价
极小化过程
- (1) 逐一检查 F F F 中各函数依赖 F D i : X → Y FD_i:X→Y FDi:X→Y,若 Y = A 1 A 2 … A k Y=A_1A_2 …A_k Y=A1A2…Ak, k > 2 k > 2 k>2,则用 { X → A j ∣ j = 1 , 2 , … , k } \{ X→A_j|j=1,2,…, k\} {X→Aj∣j=1,2,…,k} 来取代 X → Y X→Y X→Y
- (2) 逐一检查 F F F 中各函数依赖 F D i : X → A FD_i:X→A FDi:X→A,令 G = F − { X → A } G=F-\{X→A\} G=F−{X→A},若 A ∈ X G + A∈X_G^+ A∈XG+, 则从 F F F 中去掉此函数依赖
- (3) 逐一取出 F F F 中各函数依赖 F D i : X → A FD_i:X→A FDi:X→A,设 X = B 1 B 2 … B m X=B_1B_2…B_m X=B1B2…Bm,逐一考查 B i B_i Bi ( i = 1 , 2 , … , m i=1,2,…,m 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 X X
F F F 的最小依赖集 F m F_m Fm 不唯一
例
-
F
=
{
A
→
B
,
B
→
A
,
B
→
C
,
A
→
C
,
C
→
A
}
F = \{A→B,B→A,B→C,A→C,C→A\}
F={A→B,B→A,B→C,A→C,C→A};
F
m
1
F_{m_1}
Fm1、
F
m
2
F_{m_2}
Fm2 都是
F
F
F 的最小依赖集:
F m 1 = { A → B , B → C , C → A } F m 2 = { A → B , B → A , A → C , C → A } F_{m_1}= \{A→B,B→C,C→A\}\\ F_{m_2}= \{A→B,B→A,A→C,C→A\} Fm1={A→B,B→C,C→A}Fm2={A→B,B→A,A→C,C→A}
例
- F = { A → B D , A B → C , C → D } F=\{A\rightarrow BD,AB\rightarrow C,C\rightarrow D\} F={A→BD,AB→C,C→D}, 求 F F F 的最小依赖集:
- (1) 将 F F F 的所有函数依赖右边化为单一属性: F = { A → B , A → D , A B → C , C → D } F=\{A\rightarrow B,A\rightarrow D,AB\rightarrow C,C\rightarrow D\} F={A→B,A→D,AB→C,C→D}
- (2) 去掉
F
F
F 中所有函数依赖左边的冗余属性
-
A
B
→
C
AB\rightarrow C
AB→C, 检测
A
B
AB
AB: 通过闭包
A
+
=
{
A
,
B
,
C
,
D
}
,
B
+
=
{
B
}
A^+=\{A,B,C,D\},B^+=\{B\}
A+={A,B,C,D},B+={B} 可知,
B
B
B 为冗余属性
F = { A → B , A → D , A → C , C → D } F=\{A\rightarrow B,A\rightarrow D,A\rightarrow C,C\rightarrow D\} F={A→B,A→D,A→C,C→D}
-
A
B
→
C
AB\rightarrow C
AB→C, 检测
A
B
AB
AB: 通过闭包
A
+
=
{
A
,
B
,
C
,
D
}
,
B
+
=
{
B
}
A^+=\{A,B,C,D\},B^+=\{B\}
A+={A,B,C,D},B+={B} 可知,
B
B
B 为冗余属性
- (3) 去掉
F
F
F 中所有冗余的函数依赖关系:
F = { A → B , A → D , A → C , C → D } F=\{A\rightarrow B,A\rightarrow D,A\rightarrow C,C\rightarrow D\} F={A→B,A→D,A→C,C→D}去掉 A → D A\rightarrow D A→D, 而 A + = { A , B , C , D } A^+=\{A,B,C,D\} A+={A,B,C,D}, 因此可以去掉 A → D A\rightarrow D A→D,得
F = { A → B , A → C , C → D } F=\{A\rightarrow B,A\rightarrow C,C\rightarrow D\} F={A→B,A→C,C→D}
碰到题目中有冗余的函数依赖关系,可以用上面的方法将其化为最简
* 模式的分解
- 把低一级的关系模式分解为若干个高一级的关系模式的方法不是唯一的; 只有能够保证分解后的关系模式与原关系模式等价,分解方法才有意义
- 关系模式
R
<
U
,
F
>
R<U,F>
R<U,F> 的一个分解:
ρ
=
{
R
1
<
U
1
,
F
1
>
,
R
2
<
U
2
,
F
2
>
,
…
,
R
n
<
U
n
,
F
n
>
}
ρ=\{ R_1<U_1,F_1>,R_2<U_2,F_2>,…,R_n<U_n,F_n>\}
ρ={R1<U1,F1>,R2<U2,F2>,…,Rn<Un,Fn>},
U
=
∪
i
=
1
n
U
i
U= ∪_{i=1}^nU_i
U=∪i=1nUi,且不存在
U
i
⊆
U
j
U_i ⊆ U_j
Ui⊆Uj,
F
i
F_i
Fi 为
F
F
F 在
U
i
U_i
Ui 上的投影
- 函数依赖集合 { X → Y ∣ X → Y ∈ F + ∧ X Y ⊆ U i } \{X→Y | X→Y ∈ F^+∧XY ⊆U_i\} {X→Y∣X→Y∈F+∧XY⊆Ui} 的一个覆盖 F i F_i Fi 叫作 F F F 在属性 U i U_i Ui 上的投影
三种模式分解等价的定义:
- 分解具有无损连接性
- 若 R R R 与 R 1 R_1 R1、 R 2 R_2 R2、…、 R n R_n Rn 自然连接的结果相等,则称关系模式 R R R 的这个分解 ρ ρ ρ 具有无损连接性
- 具有无损连接性的分解保证不丢失信息, 但不一定能解决插入异常、删除异常、修改复杂、数据冗余等问题
- 分解要保持函数依赖
- 若 F F F 所逻辑蕴含的函数依赖一定也由分解得到的某个关系模式中的函数依赖 F i F_i Fi 所逻辑蕴含,则称关系模式 R R R 的这个分解是保持函数依赖的
- 如果一个分解保持了函数依赖,则它可以减轻或解决各种异常情况
- 分解既要保持函数依赖,又要具有无损连接性
- 若要求分解具有无损连接性,那么模式分解一定能够达到 4NF
- 若要求分解保持函数依赖,那么模式分解一定能够达到 3NF
- 若要求分解既具有无损连接性,又保持函数依赖,则模式分解一定能够达到 3NF,但不一定能够达到 BCNF
例
- S − L ( S n o , S d e p t , S l o c ) , F = { S n o → S d e p t , S d e p t → S l o c , S n o → S l o c } , S − L ∈ 2 N F S-L(Sno,Sdept,Sloc),F=\{Sno→Sdept,Sdept→Sloc,Sno→Sloc\},S-L∈2NF S−L(Sno,Sdept,Sloc),F={Sno→Sdept,Sdept→Sloc,Sno→Sloc},S−L∈2NF
- 分解方法可以有多种:
- (1)
S
−
L
S-L
S−L 分解为三个关系模式:
S
N
(
S
n
o
)
,
S
D
(
S
d
e
p
t
)
,
S
O
(
S
l
o
c
)
SN(Sno),SD(Sdept) ,SO(Sloc)
SN(Sno),SD(Sdept),SO(Sloc)
- 不满足无损连接性、不保持函数依赖,它不是原关系模式的一个等价分解:无法查找学号对应的系或住所,丢失了信息
- (2)
S
−
L
S-L
S−L 分解为下面二个关系模式:
N
L
(
S
n
o
,
S
l
o
c
)
,
D
L
(
S
d
e
p
t
,
S
l
o
c
)
NL(Sno, Sloc),DL(Sdept, Sloc)
NL(Sno,Sloc),DL(Sdept,Sloc)
- 不满足无损连接性、不保持函数依赖:对 N L NL NL 和 D L DL DL 作自然连接后,无法恢复原有信息
- (3)
S
−
L
S-L
S−L 分解为下面二个关系模式:
N
D
(
S
n
o
,
S
d
e
p
t
)
,
N
L
(
S
n
o
,
S
l
o
c
)
ND(Sno, Sdept),NL(Sno, Sloc)
ND(Sno,Sdept),NL(Sno,Sloc)
- 具有无损连接性、不保持函数依赖:例如一个学生转系之后还要同步对 N L NL NL 表的 S l o c Sloc Sloc 进行修改,否则会破坏数据库的一致性。原因是函数依赖 S d e p t → S l o c Sdept→Sloc Sdept→Sloc 没有投影到关系模式 N D ND ND 或 N L NL NL 上
- (4)
S
−
L
S-L
S−L 分解为下面二个关系模式:
N
D
(
S
n
o
,
S
d
e
p
t
)
,
D
L
(
S
d
e
p
t
,
S
l
o
c
)
ND(Sno, Sdept),DL(Sdept, Sloc)
ND(Sno,Sdept),DL(Sdept,Sloc)
- 具有无损连接性、保持了函数依赖
- (1)
S
−
L
S-L
S−L 分解为三个关系模式:
S
N
(
S
n
o
)
,
S
D
(
S
d
e
p
t
)
,
S
O
(
S
l
o
c
)
SN(Sno),SD(Sdept) ,SO(Sloc)
SN(Sno),SD(Sdept),SO(Sloc)