关系数据理论
数据依赖包括函数依赖和多值依赖。
5.1 函数依赖
5.1.1 函数依赖的定义
设 R ( U ) R(U) R(U)是属性集U上的关系模式, X , Y ⊆ U X,Y\subseteq U X,Y⊆U ( X , Y X,Y X,Y是属性), 若对于 ∀ r ( 值 ) ∈ R ( U ) \forall r(值)∈R(U) ∀r(值)∈R(U), ∀ t , s ∈ r \forall t,s∈r ∀t,s∈r(元组),如果 t [ X ] = s [ X ] t[X]=s[X] t[X]=s[X](若每个都不相等也满足条件),能推出 t [ Y ] = s [ Y ] t[Y]=s[Y] t[Y]=s[Y],则称“X函数决定Y”,或“Y函数依赖于X”,记作: X → Y X\rightarrow Y X→Y,称 X X X为决定因素。
若
∃
t
,
s
∈
r
,
t
[
X
]
=
s
[
X
]
\exists t, s \in r, t[X]=s[X]
∃t,s∈r,t[X]=s[X],但
t
[
Y
]
≠
s
[
Y
]
t[Y]\neq s[Y]
t[Y]=s[Y],则称“X不函数决定Y”或“Y不函数依赖于X”,记作:。
函数依赖关系可以理解成关系数据库中“码”的理论基础;函数依赖与别的数据依赖一样是语义范畴的概念,只能根据语义来确定一个函数依赖。
SDC中的函数依赖: S N O − > D E P T , D E P T − > M N A M E , ( S N O , C N A M E ) − > G R A D E SNO->DEPT,DEPT-> MNAME,(SNO,CNAME)-> GRADE SNO−>DEPT,DEPT−>MNAME,(SNO,CNAME)−>GRADE
5.1.2 函数依赖的分类
(1)平凡的函数依赖与非平凡的函数依赖
- 如果 X → Y X\rightarrow Y X→Y,且 Y ⊈ X Y \nsubseteq X Y⊈X,则称 X → Y X\rightarrow Y X→Y为非平凡的函数依赖。
- 如果 X → Y X\rightarrow Y X→Y,且 Y ⊆ X Y \subseteq X Y⊆X,则称 X → Y X\rightarrow Y X→Y为平凡的函数依赖。【必然成立】
如: S N O → S N O SNO\rightarrow SNO SNO→SNO是平凡的函数依赖。
在后面的讨论中,一般函数依赖指非平凡的函数依赖。
(2)完全函数依赖与部分函数依赖
- 如果
X
→
Y
X\rightarrow Y
X→Y,对于任意
X
X
X的真子集
X
′
X^{\prime}
X′,都有
,则称 Y Y Y对 X X X完全函数依赖,记作
- 如果 X → Y X\rightarrow Y X→Y,存在 X X X的真子集 X ′ X^{\prime} X′,使得 X ′ → Y X^{\prime}\rightarrow Y X′→Y ,则称 Y Y Y对 X X X部分函数依赖,记作 X ⟶ p Y X \stackrel{p}{\longrightarrow} Y X⟶pY
(3)传递函数依赖与直接函数依赖
- 在
R
(
U
)
R(U)
R(U)中,如果
X
→
Y
(
Y
⊈
X
)
\mathrm{X} \rightarrow \mathrm{Y}(\mathrm{Y} \nsubseteq \mathrm{X})
X→Y(Y⊈X),
, Y → Z \mathrm{Y} \rightarrow \mathrm{Z} Y→Z,则称 Z Z Z对 X X X传递函数依赖
5.1.3 函数依赖的逻辑蕴含
关系模式 R R R, F F F是其函数依赖, X , Y X,Y X,Y是其属性子集,如果从 F F F的函数依赖能够推出 X → Y X\rightarrow Y X→Y,则称 F F F逻辑蕴含 X → Y X\rightarrow Y X→Y,记作 F ⊨ X → Y F\models X\rightarrow Y F⊨X→Y。
被 F F F所逻辑蕴含的函数依赖的全体所构成的集合称作 F F F的闭包,记作 F + F^{+} F+。[即根据已知F函数依赖能推导出来的集合]
示例:
R ( X , Y ) , F = X → Y R(X, Y), F = {X\rightarrow Y} R(X,Y),F=X→Y
F + = { X → ∅ , X → X , X → Y , X → X Y , Y → ∅ , Y → Y , X Y → ∅ , X Y → X , X Y → Y , X Y → X Y } F^{+} = \{X\rightarrow \varnothing, X\rightarrow X, X\rightarrow Y,X\rightarrow XY, Y\rightarrow \varnothing, Y\rightarrow Y, XY\rightarrow \varnothing,XY\rightarrow X,XY\rightarrow Y,XY\rightarrow XY\} F+={X→∅,X→X,X→Y,X→XY,Y→∅,Y→Y,XY→∅,XY→X,XY→Y,XY→XY}
5.1.4 Armstrong公理系统
为了从一组函数依赖求得蕴含的函数依赖,为了确定一个关系模式的码,就需要一套推理规则。下面介绍函数依赖的公理系统——Armstrong公理系统。
对于关系模式 R ( U , F ) R(U,F) R(U,F),设 F F F是 U U U上的一组函数依赖,则:
- 自反律:若 Y ⊆ X ⊆ U Y\subseteq X\subseteq U Y⊆X⊆U,则 X → Y X \rightarrow Y X→Y为 F F F所蕴含。
- 增广律:若 X → Y X \rightarrow Y X→Y为 F F F所蕴含( X → Y ∈ F + X\rightarrow Y∈F^{+} X→Y∈F+), Z ⊆ U Z\subseteq U Z⊆U,则 X Z → Y Z XZ\rightarrow YZ XZ→YZ为 F F F所蕴含。【两边加相同的属性】
- 传递律:若 X → Y X \rightarrow Y X→Y及 Y → Z Y \rightarrow Z Y→Z为 F F F所蕴含( F + F^{+} F+) ,则 X → Z X \rightarrow Z X→Z为 F F F所蕴含。
三个有用的推理规则:
-
合并规则:由 X → Y X \rightarrow Y X→Y, Y → Z Y \rightarrow Z Y→Z,有 X → Y Z X \rightarrow YZ X→YZ。
-
伪传递规则:由 X → Y X \rightarrow Y X→Y, W Y → Z WY \rightarrow Z WY→Z,有 X W → Z XW \rightarrow Z XW→Z。[推导:1式两边都加 W W W]
-
分解规则:由 X → Y X \rightarrow Y X→Y, Z ⊆ Y Z\subseteq Y Z⊆Y,有 X → Z X \rightarrow Z X→Z。[推导: Z ⊆ Y Z\subseteq Y Z⊆Y是平凡函数依赖,则 Y → Z Y\rightarrow Z Y→Z,然后传递]
[推论] X → Y , X → Z , X → A ⟷ X → Y Z A X\rightarrow Y,X\rightarrow Z,X\rightarrow A \longleftrightarrow X\rightarrow YZA X→Y,X→Z,X→A⟷X→YZA
5.1.5 由函数依赖定义的码
候选码:设 K K K为 R < U , F > R< U , F > R<U,F>的属性或属性组,若 K ⟶ f U K \stackrel{f}{\longrightarrow} U K⟶fU( K K K要完全决定 U U U,即** K K K的任意真子集都不能决定 U U U**),则称 K K K为 R R R的候选码
主码:若 R ( U , F ) R(U , F) R(U,F)有多个候选码,则可以从中选定一个作为R的主码
主属性:包含在每一个候选码中的属性
非主属性:不包含在任何候选码中的属性
全码:关系模式的码由整个属性组构成
5.1.6 候选码的求解方法
给定一个关系模式 R ( U , F ) R(U,F) R(U,F), U = { A 1 , A 2 , … , A n } U=\{A_{1},A_{2},…,A_{n}\} U={A1,A2,…,An}, F F F是 R R R的函数依赖集,那么,可以将属性分为如下四类:
- L:仅出现在函数依赖集F左部的属性
- R:仅出现在函数依赖集F右部的属性
- LR:在函数依赖集F左右部都出现的属性
- NLR:在函数依赖集F左右部都未出现的属性
==求候选码的规则==如下:
-
如果有属性不在函数依赖集中出现,那么它必须包含在候选码中
[解释]不在函数依赖集中出现,即只有自己可以决定自己,别人不能决定它,该属性可以唯一标识元组,包含在候选码中。
-
如果有属性不在函数依赖集中任何函数依赖的右边出现,那么它必须包含在候选码中
-
如果有属性只在函数依赖集的左边出现,则该属性一定包含在候选码中
-
如果有属性或属性组能唯一标识元组,则它就是候选码(验证候选码是否唯一或有多个)
5.2 范式及其规范化
范式是对关系(关系模式 R R R)的不同数据依赖程度的要求。各种不同的范式都是以对关系模式的属性间允许的数据依赖加以限制的形式表示的。
若 R ( U , F ) R(U,F) R(U,F)符合 x x x范式的要求,则称 R R R为 x x x范式,记作: R ∈ x N F R\in xNF R∈xNF 例:x好学生,有德、德智、德智体……
通过模式分解将一个低级范式转换为若干个高级范式的过程称作规范化;限制最少,数据依赖条件越少,范围最广。
![image-20220428214919770](https://i-blog.csdnimg.cn/blog_migrate/0a30985a4c67c69cfdf89db3f6b03774.png)
5.2.1 1NF
属性不可再分,是原子量
定义
分量是否需要再分,与具体应用有关;如果用到值的一部分,则需要进一步分割。
-
如果只是查询出生日期,则它满足 1 N F 1NF 1NF;
-
如果查询两人生日是否相同,则只比较月、日,需要将生日分解,就不满足 1 N F 1NF 1NF。
姓名 | 生日 |
---|---|
王军 | 98.7.10 |
张立 | 99.7.10 |
李明 | 90.3.28 |
姓名 | 年 | 月日 |
---|---|---|
王军 | 98 | 7.10 |
张立 | 99 | 7.10 |
李明 | 90 | 3.28 |
5.2.2 2NF
若 R ∈ 1 N F R\in 1NF R∈1NF,且每个非主属性完全依赖于码,则称 R ∈ 2 N F R\in 2NF R∈2NF, 即** 2 N F 2NF 2NF不允许有非主属性对码的部分依赖**;若R中有非主属性对码的部分依赖,则 R ∉ 2 N F R\notin 2NF R∈/2NF。
[例1]关系模式 S D C ( S N O , D E P T , M N A M E , C N A M E , G R A D E ) SDC(SNO,DEPT,MNAME,CNAME,GRADE) SDC(SNO,DEPT,MNAME,CNAME,GRADE),判断 S D C ∈ 2 N F SDC\in 2NF SDC∈2NF?
步骤:
先根据函数依赖确定候选码,再观察每个非主属性是否完全依赖于码。
因为 D E P T , M N A M E DEPT,MNAME DEPT,MNAME部分依赖于码$(SNO,CNAME) , 所 以 ,所以 ,所以SDC\notin 2NF$ 。
若码为一个,一定是完全依赖关系;
消除非主属性对码的部分依赖——模式分解
改造:
非主属性有两种,一种完全依赖于码,一种部分依赖于码。
将 S D C SDC SDC分解为:
S C ( S N O , C N A M E , G ) ∈ 2 N F SC(SNO , CNAME , G)\in 2NF SC(SNO,CNAME,G)∈2NF
S D M ( S N O , D E P T , M N A M E ) ∈ 2 N F SDM(SNO , DEPT , MNAME)\in 2NF SDM(SNO,DEPT,MNAME)∈2NF
解决了部分插入异常和更新异常,删除异常还存在
[例2]关系模式 R ( A , B , C , D ) R(A,B,C,D) R(A,B,C,D),码为 A B AB AB,给出它的一个函数依赖集,使得 R R R属于 1 N F 1NF 1NF而不属于 2 N F 2NF 2NF。
F = { ( A , B ) → f C , B → D } F=\{(A, B) \stackrel{f}{\rightarrow} C, \quad B \rightarrow D\} F={(A,B)→fC,B→D}
5.2.3 3NF
关系模式 R < U , F > R< U , F > R<U,F>中,若不存在这样的码 X X X,属性组 Y Y Y及非主属性Z( Z ⊈ Y Z\nsubseteq Y Z⊈Y),使得下式成立:
则称 R ∈ 3 N F R\in 3NF R∈3NF。即 3 N F 3NF 3NF要求:非主属性既不部分也不传递依赖于码。
[例1]判断 S D M ( S N O , D E P T , M N A M E ) ∈ 3 N F SDM (SNO , DEPT , MNAME) \in 3NF SDM(SNO,DEPT,MNAME)∈3NF是否成立。
因为 S N O → D E P T , D E P T → M N A M E SNO \rightarrow DEPT,DEPT\rightarrow MNAME SNO→DEPT,DEPT→MNAME,所以 S D M ∉ 3 N F SDM\notin 3NF SDM∈/3NF
模式分解的方法是:消除非主属性对码的传递依赖
改造:
将 S D M ( S N O , D E P T , M N A M E ) SDM(SNO,DEPT,MNAME) SDM(SNO,DEPT,MNAME)分解为:
S D ( S N O , D E P T ) ∈ 3 N F SD (SNO , DEPT) \in 3NF SD(SNO,DEPT)∈3NF 二元/目关系
D M ( D E P T , M N A M E ) ∈ 3 N F DM(DEPT , MNAME) \in 3NF DM(DEPT,MNAME)∈3NF
[例2] S C ( S N O , C N A M E , G R A D E ) ∈ 3 N F SC(SNO , CNAME , GRADE) \in 3NF SC(SNO,CNAME,GRADE)∈3NF不能传递。
全码:所有属性加一起才能构成码,即 U ⟶ f U U \stackrel{f}{\longrightarrow} U U⟶fU,必满足 3 N F 3NF 3NF;
任意二元关系模式都属于第三范式。
[例3]关系模式 R ( A , B , C , D ) R(A,B,C,D) R(A,B,C,D),码为 A B AB AB,给出它的一个函数依赖集,使得 R R R属于 2 N F 2NF 2NF而不属于 3 N F 3NF 3NF。
F = ( A , B ) → C , C → D F={(A,B) \rightarrow C,C\rightarrow D} F=(A,B)→C,C→D
5.2.4 BCNF
每一个决定性因素都包含码。
定义:关系模式 R < U , F > R< U , F > R<U,F>中,对于属性组 X , Y X,Y X,Y,若 X → Y X\rightarrow Y X→Y且 Y ⊈ X Y \nsubseteq X Y⊈X时 X X X必含有码,则 R < U , F > ∈ B C N F R< U , F >\in BCNF R<U,F>∈BCNF
如 S T C ∉ B C N F STC \notin BCNF STC∈/BCNF,因为 T → C T\rightarrow C T→C,而 T T T不含有码;
$ STC(S , T , C)$关系模式中,每位老师只教授一门课,每门课有若干老师。某学生选定一门课,就对应一位老师。则:
它的一组函数依赖为: T → C , ( S , T ) → C , ( S , C ) → T T\rightarrow C,(S,T)\rightarrow C,(S,C)\rightarrow T T→C,(S,T)→C,(S,C)→T,候选码为 ( S , T ) (S,T) (S,T)和$ (S,C)$
此例子可说明:全是主属性不一定属于 B C N F BCNF BCNF,但一定属于 3 N F 3NF 3NF。
改造:
将 S T C ( S , T , C ) STC (S , T , C) STC(S,T,C)分解为:
S T ( S , T ) ∈ B C N F , T C ( T , C ) ∈ B C N F . ST(S,T)\in BCNF ,TC(T,C)\in BCNF. ST(S,T)∈BCNF,TC(T,C)∈BCNF.
结论:
任何一个二元关系都是BCNF的;
全码属于BCNF。
在函数依赖的范畴内,BCNF达到了最高的规范化程度。
5.3 多值依赖
5.3.1 多值依赖的定义
1.描述型:
关系模式 R ( U ) R(U) R(U), X 、 Y 、 Z ⊂ U X、Y、Z \subset U X、Y、Z⊂U,并且 Z = U – X – Y Z = U – X – Y Z=U–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值无关,则称 Y Y Y多值依赖于 X X X,记作: X → → Y X\rightarrow \rightarrow Y X→→Y。
关系模式 T E A C H ( C # , T # , B # ) TEACH(C\#, T\#, B\#) TEACH(C#,T#,B#) ,一门课程由多个教员担任,一门课程使用相同的一套参考书。
C# T# B# C1 {T1,T2} {B1,B2} C2 {T1,T3} {B3,B4} 有:
C# T# B# C1 T1 B1 C1 T1 B2 C1 T2 B1 C1 T2 B2 C2 T1 B3 C2 T1 B4 C2 T3 B3 C2 T3 B4
在关系模式 T E A C H TEACH TEACH中,对 ( C 1 , B 1 ) (C1 , B1) (C1,B1)有一组 T # T\# T#值 ( T 1 , T 2 ) (T1 , T2) (T1,T2),对 ( C 1 , B 2 ) (C1 , B2) (C1,B2)也有一组 T # T\# T#值 ( T 1 , T 2 ) (T1 , T2) (T1,T2),这组值仅取决于 C # C\# C#的取值,而与 B # B\# B#[如参考书]的取值无关。因此, T # T\# T#多值依赖于 C # C\# C#,记作 C # → → T # C\#\rightarrow \rightarrow T\# C#→→T#,同样有 C # → → B # C\#\rightarrow \rightarrow B\# C#→→B#。
2.标准化:
关系模式 R ( U ) R(U) R(U), X 、 Y 、 Z ⊂ U X、Y、Z\subset U X、Y、Z⊂U, Z = U – X – Y Z=U–X–Y Z=U–X–Y,对于 R ( U ) R(U) R(U)的任一关系 r r r,若存在元组 t 1 t1 t1, t 2 t2 t2,使得 t 1 [ X ] = t 2 [ X ] t1[X] = t2[X] t1[X]=t2[X],那么就必然存在元组 t 3 t3 t3, t 4 t4 t4,使得:
t 3 [ X ] = t 1 [ X ] = t 4 [ X ] = t 2 [ X ] t3[X] = t1[X] = t4[X] = t2[X] t3[X]=t1[X]=t4[X]=t2[X]
t 3 [ Y ] = t 1 [ Y ] , t 4 [ Y ] = t 2 [ Y ] t3[Y] = t1[Y], t4[Y] = t2[Y] t3[Y]=t1[Y],t4[Y]=t2[Y]
$t3[Z] = t2[Z], t4[Z] = t1[Z] $
则称 Y Y Y多值依赖于 X X X,记作: X → → Y X\rightarrow \rightarrow Y X→→Y。
若 X → → Y X\rightarrow \rightarrow Y X→→Y,而 Z = ∅ Z=\varnothing Z=∅,则称 X → → Y X\rightarrow \rightarrow Y X→→Y为平凡的多值依赖。
例如: ( C # , T # , B # ) (C\#, T\#, B\#) (C#,T#,B#)满足 C # → → T # C\#\rightarrow \rightarrow T\# C#→→T#,含有元组 t 1 = ( C 1 , T 1 , B 1 ) t1=(C1,T1, B1) t1=(C1,T1,B1), t 2 = ( C 1 , T 2 , B 2 ) t2=(C1, T2, B2) t2=(C1,T2,B2),则也一定含有元组 t 3 = ( C 1 , T 1 , B 2 ) t3=(C1, T1, B2) t3=(C1,T1,B2), t 4 = ( C 1 , T 2 , B 1 ) t4=(C1, T2, B1) t4=(C1,T2,B1)。
即:有三条记录,第四条记录肯定知道/肯定需找到。
5.3.2 多值依赖的性质
-
多值依赖具有对称性:若 X → → Y X\rightarrow \rightarrow Y X→→Y,则 X → → Z X\rightarrow \rightarrow Z X→→Z
-
多值依赖具有传递性:若 X → → Y X\rightarrow \rightarrow Y X→→Y, Y → → Z Y\rightarrow \rightarrow Z Y→→Z,则 X → → Z − Y X\rightarrow \rightarrow Z-Y X→→Z−Y。
-
函数依赖是多值依赖的特例:若 X → Y X\rightarrow Y X→Y,则 X → → Y X\rightarrow \rightarrow Y X→→Y。
-
若 X → → Y X\rightarrow \rightarrow Y X→→Y, X → → Z X\rightarrow \rightarrow Z X→→Z,则 Y Y Y、 Z Z Z的交集、并集、差集多值依赖于 X X X。
- 若 X → → Y X\rightarrow \rightarrow Y X→→Y, X → → Z X\rightarrow \rightarrow Z X→→Z,则 X → → Y ∪ Z X\rightarrow \rightarrow Y \cup Z X→→Y∪Z。
- 若 X → → Y X\rightarrow \rightarrow Y X→→Y, X → → Z X\rightarrow \rightarrow Z X→→Z,则 X → → Y ∩ Z X\rightarrow \rightarrow Y\cap Z X→→Y∩Z。
- 若 X → → Y X\rightarrow \rightarrow Y X→→Y, X → → Z X\rightarrow \rightarrow Z X→→Z,则 X → → Y − Z X\rightarrow \rightarrow Y-Z X→→Y−Z, X → → Z − Y X\rightarrow \rightarrow Z-Y X→→Z−Y。
5.3.3 多值依赖与函数依赖的区别
-
多值依赖是元组产生依赖,函数依赖是相等产生依赖。
- 函数依赖规定某些元组不能出现在关系中,也称为相等产生依赖。
- 多值依赖要求某种形式的其它元组必须存在于关系中,称为元组产生依赖。
-
多值依赖的有效性与属性集的范围有关,而函数依赖的有效性则与属性集的范围无关。
如: X → Y X\rightarrow Y X→Y在属性集 W ( X Y ⊆ W ⊆ U ) W(XY \subseteq W\subseteq U) W(XY⊆W⊆U)上成立,在 U U U上也成立; 而 X → → Y X\rightarrow \rightarrow Y X→→Y在属性集 W ( X Y ⊆ W ⊆ U ) W(XY \subseteq W\subseteq U) W(XY⊆W⊆U)上成立,但在 U U U上不一定成立。
多值依赖可以缩小范围,不可以扩大范围。如:若 X → → Y X\rightarrow \rightarrow Y X→→Y在 U U U上成立,则在属性集 W ( X Y ⊆ W ⊆ U ) W(XY \subseteq W\subseteq U) W(XY⊆W⊆U)上成立。
如: A → → B A\rightarrow \rightarrow B A→→B在 W = A B C W=ABC W=ABC上成立,而在 U = A B C D U=ABCD U=ABCD上不成立。 ( a 1 , c 1 , d 1 ) (a1,{c1,d1}) (a1,c1,d1) $ b1$ ; ( a 1 , c 1 , d 2 ) (a1,{c1,d2}) (a1,c1,d2) b 2 b2 b2
A | B | C | D |
---|---|---|---|
a1 | b1 | c1 | d1 |
a1 | b1 | c2 | d1 |
a1 | b2 | c1 | d2 |
a1 | b2 | c2 | d2 |
- 关于子集的问题:
- 若 X → Y X\rightarrow Y X→Y在 R ( U ) R(U) R(U)上成立,则对于 ∀ Y ′ ⊆ Y , X → Y ′ \forall Y' \subseteq Y, \quad X \rightarrow Y' ∀Y′⊆Y,X→Y′均成立。 [ Y → Y ’ Y\rightarrow Y’ Y→Y’是平凡的函数依赖]
- 若 X → → Y X\rightarrow \rightarrow Y X→→Y在 R ( U ) R(U) R(U)上成立,则不能断言对于 Y ′ ⊆ Y Y' \subseteq Y Y′⊆Y,有 X → Y ′ X \rightarrow Y' X→Y′成立。
在上面的关系模式中, A → → B C A\rightarrow \rightarrow BC A→→BC成立, A → → B A\rightarrow \rightarrow B A→→B不成立。
5.3.4 4NF
定义:
关系模式 R < U , F > ∈ 1 N F R< U , F >\in 1NF R<U,F>∈1NF,若对于每一个非平凡(Z不能为空)的多值依赖 X → → Y X\rightarrow \rightarrow Y X→→Y( Y ⊈ X Y\nsubseteq X Y⊈X), X X X都包含码,则称 R ∈ 4 N F R\in 4NF R∈4NF。
如关系模式 T E A C H ( C # , T # , B # ) TEACH(C\#,T\#,B\#) TEACH(C#,T#,B#), C # → → T # C\#\rightarrow \rightarrow T\# C#→→T#, C # → → B # C\#\rightarrow \rightarrow B\# C#→→B#,码为 ( C # , T # , B # ) (C\#, T\#, B\#) (C#,T#,B#),所以 T E A C H ∉ 4 N F TEACH\notin 4NF TEACH∈/4NF。
改造:
将 T E A C H TEACH TEACH分解为: C T ( C # , T # ) ∈ 4 N F CT(C\#,T\#)\in 4NF CT(C#,T#)∈4NF, C B ( C # , B # ) ∈ 4 N F CB(C\#,B\#)\in 4NF CB(C#,B#)∈4NF。
在分解后的关系中分量为 C i C_{i} Ci的元组共有 m + n m + n m+n个。
在多值依赖的范畴内,属于4NF的关系模式已达到了最高的规范化程度。
任何一个二元关系都满足4NF。[只有两个属性不存在非平凡的多值依赖。]
全码不一定属于4NF。(如上 T E A C H TEACH TEACH关系模式例子)
一个全是主属性的关系模式一定可以达到第3范式;
一个全码的关系模式一定可以达到 B C N F BCNF BCNF范式。
范式之间的关系:
![image-20220503232753112](https://i-blog.csdnimg.cn/blog_migrate/592b26454e37ff0fdbd020cf479201d0.png)
5.4 关系模式分解
引言:表的数量越多,查询速度越慢,更改(插入、更新、删除异常少)速度越快。
5.4.1 模式分解的定义和要求
模式分解的定义:
关系模式 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 > \rho = {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 = U 1 ∪ U 2 ∪ … ∪ U n U = U_{1}\cup U_{2}\cup …\cup U_{n} U=U1∪U2∪…∪Un ,并且没有$U_{i} \subseteq U_{j} , , ,i\ge 1 , , ,j ≤n , , ,F_{i} 是 是 是F 在 在 在U_{i}$上的投影。
模式分解的要求:
一个关系模式分解成若干个关系模式,则分解前后的模式要等价(即分解后没有信息的丢失)。等价的标准常用的有:
- 分解要具有无损连接性
- 分解要保持函数依赖
- 分解既要保持函数依赖又要具有无损连接性
5.4.2 无损分解与有损分解
无损分解的定义:
关系模式
R
<
U
,
F
>
R<U , F>
R<U,F> ,
U
=
U
1
∪
U
2
∪
…
∪
U
n
U = U_{1}\cup U_{2}\cup …\cup U_{n}
U=U1∪U2∪…∪Un ,
ρ
=
R
1
<
U
1
,
F
1
>
,
R
2
<
U
2
,
F
2
>
,
…
,
R
n
<
U
n
,
F
n
>
\rho = {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>是
R
<
U
,
F
>
R<U ,F>
R<U,F>的一个分解,若对于
R
<
U
,
F
>
R<U , F>
R<U,F>的任一个关系
r
r
r,都有
r
=
π
R
1
(
r
)
⋈
π
R
2
(
r
)
⋈
…
⋈
π
R
n
(
r
)
r = \pi_{R_{1}}(r)\Join\pi_{R_{2}}(r)\Join … \Join \pi_{R_{n}}(r)
r=πR1(r)⋈πR2(r)⋈…⋈πRn(r) , 则称
ρ
\rho
ρ是
R
<
U
,
F
>
R<U , F>
R<U,F>的一个无损连接分解。
即:对于
R
<
U
,
F
>
R<U , F>
R<U,F>的任一个关系
r
r
r,
r
r
r在
R
1
,
R
2
,
…
,
R
n
R_{1},R_{2} , … , R_{n}
R1,R2,…,Rn上的投影的自然连接等于
r
r
r。
一个关系模式分解为两个模式时无损连接性的判别:
关系模式 R < U , F > R<U , F> R<U,F>分解为关系模式 R 1 < U 1 , F 1 > , R 2 < U 2 , F 2 > R_{1}<U_{1},F_{1}>,R_{2}<U_{2},F_{2}> R1<U1,F1>,R2<U2,F2>是具有无损连接性的分解的充分必要条件是:
( U 1 ∩ U 2 → U 1 − U 2 ) ∈ F + (U_{1}\cap U_{2}\rightarrow 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}\rightarrow U_{2}-U_{1})\in F^{+} (U1∩U2→U2−U1)∈F+,即==交集决定差集成立==), F + F^{+} F+是所有函数依赖推导的集合。
[例]设 R ( U , F ) R(U,F) R(U,F)中 U = A B C , F = A → B U=ABC,F={A\rightarrow B} U=ABC,F=A→B, 试判断 R R R的下面两个分解的无损连接性:
ρ 1 = { R 1 ( A B ) , R 2 ( A C ) } , ρ 2 = { R 1 ( A B ) , R 2 ( B C ) } \rho_{1}=\{R_{1}(AB), R_{2}(AC)\},\rho _{2}=\{R_{1}(AB), R_{2}(BC)\} ρ1={R1(AB),R2(AC)},ρ2={R1(AB),R2(BC)}。
因为对于$\rho_{1} : : :R_{1}\cap R_{2}=A, R_{1}-R_{2}=B , 无 损 ; 对 于 ,无损;对于 ,无损;对于\rho_{2} : : :R_{1}\cap R_{2}=B,R_{1}-R_{2}=A,R_{2}-R_{1}=C$ ,有损。
实例:
![image-20220505205631354](https://i-blog.csdnimg.cn/blog_migrate/c8a01205689a161df81a64c46d5e883b.png)
5.4.3 保持函数依赖
保持函数依赖的模式分解的定义:
设 ρ = R 1 < U 1 , F 1 > , R 2 < U 2 , F 2 > , … , R n < U n , F n > \rho = {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>是 R < U , F > R<U ,F> R<U,F>的一个分解,如果 F + = ( F 1 ∪ F 2 ∪ … ∪ F n ) + F^{+} =(F_{1}\cup F_{2}\cup …\cup F_{n})^{+} F+=(F1∪F2∪…∪Fn)+,则称$\rho $是保持函数依赖的分解。即:你能推导出来的我的集合也能推导出来,无函数依赖被丢失。
换句话说: F F F所逻辑蕴含的函数依赖一定也由分解得到的各个关系模式中的函数依赖所逻辑蕴含。
实例:
![image-20220505205911334](https://i-blog.csdnimg.cn/blog_migrate/10cb0ae999594d4d6c0e5988939d6fb5.png)
[例1]设关系模式 R < U , F > R<U, F> R<U,F>, U = { C I T Y , S T , Z I P } U = \{CITY, ST, ZIP\} U={CITY,ST,ZIP}, F = { ( C I T Y , S T ) → Z I P [ 邮 政 编 码 ] , Z I P → C I T Y } F =\{(CITY, ST) \rightarrow ZIP[邮政编码], ZIP\rightarrow CITY\} F={(CITY,ST)→ZIP[邮政编码],ZIP→CITY},试判断下列分解 ρ 1 = { R 1 ( S T , Z I P ) , R 2 ( C I T Y , Z I P ) } \rho_{1}=\{R_{1}(ST,ZIP), R_{2}(CITY, ZIP)\} ρ1={R1(ST,ZIP),R2(CITY,ZIP)}是否保持函数依赖?
[解] ∵ π R 1 ( F ) = ∅ , π R 2 ( F ) = { Z I P → C I T Y } , π R 1 ( F ) ∪ π R 2 ( F ) = { Z I P → C I T Y } , \because \pi_{R_{1}}(F) = \varnothing,\pi_{R_{2}}(F) = \{ZIP\rightarrow CITY\},\pi_{R_{1}}(F)\cup \pi_{R_{2}}(F)= \{ZIP\rightarrow CITY\}, ∵πR1(F)=∅,πR2(F)={ZIP→CITY},πR1(F)∪πR2(F)={ZIP→CITY},丢失了函数依赖 ( C I T Y , S T ) → Z I P (CITY, ST)\rightarrow ZIP (CITY,ST)→ZIP
$ \therefore$分解是没有保持函数依赖的;
又 ∵ R 1 ∩ R 2 = { Z I P } , R 2 - R 1 = C I T Y , R 1 ∩ R 2 → R 2 - R 1 , \because R_{1}\cap R_{2} =\{ZIP\}, R_{2}-R_{1} ={CITY},R_{1}\cap R_{2}\rightarrow R_{2}-R_{1}, ∵R1∩R2={ZIP},R2-R1=CITY,R1∩R2→R2-R1,
∴ \therefore ∴分解是无损的。
[例2] R ( A B C ; A → C , B → C ) R(ABC;A\rightarrow C,B\rightarrow C) R(ABC;A→C,B→C),码为 A B AB AB。
(1)求具有无损连接性的分解。
分解为 R 1 ( A C ; A → C ) R_{1}(AC;A\rightarrow C) R1(AC;A→C), R 2 ( A B ) R_{2}(AB) R2(AB)。
因丢失了函数依赖 B → C B\rightarrow C B→C,所以不是保持函数依赖的分解。
另解: R 1 ( A , B ) , R 2 ( B , C ) 函 数 依 赖 为 : B → A , B → C F 1 = ∅ , F 2 = B → C R1(A,B),R2(B,C) 函数依赖为:B\rightarrow A,B\rightarrow C F_{1}=\varnothing,F_{2}=B\rightarrow C R1(A,B),R2(B,C)函数依赖为:B→A,B→CF1=∅,F2=B→C
(2)求保持函数依赖的分解。
分解为 R 1 ( A C ; A → C ) R_{1}(AC;A\rightarrow C) R1(AC;A→C), R 2 ( B C ; B → C ) R_{2}(BC;B\rightarrow C) R2(BC;B→C),但分解是有损的。
5.4.4 关于模式分解的若干结论
- 分解具有无损连接性和分解保持函数依赖是两个互相独立的标准。具有无损连接性的分解不一定保持函数依赖,保持函数依赖的分解不一定具有无损连接性。一个关系模式的分解可能有三种情况。
- 若要求分解具有无损连接性,那么分解后的模式一定能达到BCNF。
- 若要求分解保持函数依赖,那么分解后的模式总可以达到3NF,但不一定能达到BCNF。
- 若要求分解既具有无损连接性,又保持函数依赖,则分解后的模式可以达到3NF,但不一定能达到BCNF。
5.5 属性集闭包
5.5.1 属性集闭包的定义
设有关系模式 R ( U ) R(U) R(U), U = { A 1 , A 2 , … , A n } U=\{A_{1},A_{2},…,A_{n}\} U={A1,A2,…,An}, X X X是 U U U的子集, F F F是 U U U上的一个函数依赖集,则属性集 X X X关于函数依赖集 F F F的闭包 X F + X_{F}^{+} XF+定义为: X F + = { A i ∣ A i ∈ U , F ⊨ X → A i } X_{F}^{+}=\{A_{i}|A_{i}\in U,F\models X\rightarrow A_{i}\} XF+={Ai∣Ai∈U,F⊨X→Ai} 。即:我能决定哪些属性,就是属性集的闭包。
[例]设关系模式 R ( A , B , C ) R(A,B,C) R(A,B,C)的函数依赖集为 F = { A → B , B → C } F=\{A\rightarrow B,B\rightarrow C\} F={A→B,B→C},则 A F + = { A , B , C } , B F + = { B , C } , C F + = { C } A_{F}^{+}=\{A,B,C\},B_{F}^{+}=\{B,C\},C_{F}^{+}=\{C\} AF+={A,B,C},BF+={B,C},CF+={C}。
5.5.2 属性集的闭包计算
算法:求属性集 X ( X ⊆ U ) X(X\subseteq U) X(X⊆U)关于 U U U上的函数依赖集 F F F的闭包 X F + X_{F}^{+} XF+。
输入:属性全集 U U U, U U U上的函数依赖集 F F F,以及属性集 X ⊆ U X\subseteq U X⊆U;
输出: X X X关于 F F F的闭包 X F + X_{F}^{+} XF+。
方法:根据下列步骤计算一系列属性集合 X ( 0 ) X^{(0)} X(0), X ( 1 ) X^{(1)} X(1),…
-
(1) 令 X ( 0 ) = X , i = 0 X^{(0)}=X,i=0 X(0)=X,i=0(将自身加入)
-
(2) 求属性集
其中: V V V已找出(知道)的集合, W W W是可能已知、可能未知的属性(未知加入)
-
(3) X ( i + 1 ) = X ( i ) ∪ B X^{(i+1)}=X^{(i)}\cup B X(i+1)=X(i)∪B
-
(4)判断 X ( i + 1 ) = X ( i ) X^{(i+1)}=X^{(i)} X(i+1)=X(i)吗?
- 若 X ( i + 1 ) ≠ X ( i ) X^{(i+1)}\ne X^{(i)} X(i+1)=X(i),则用 i + 1 i+1 i+1取代 i i i,返回(2);
- 若 X ( i + 1 ) = X ( i ) X^{(i+1)}= X^{(i)} X(i+1)=X(i),则 X F + = X ( i ) X_{F}^{+}= X^{(i)} XF+=X(i),结束。
在判断计算何时结束时,可用下面四种方法:
- X ( i + 1 ) = X ( i ) X^{(i+1)}=X^{(i)} X(i+1)=X(i)。
- X ( i + 1 ) X^{(i+1)} X(i+1)已包含了全部属性。
- 在 F F F中再也找不到函数依赖的右部属性是 X ( i ) X^{(i)} X(i)未出现过的属性。
- 在 F F F中再也找不到满足条件 V ⊆ X ( i ) V\subseteq X^{(i)} V⊆X(i)的函数依赖 V → W V\rightarrow W V→W。
5.6 函数依赖集的等价与覆盖
5.6.1 定义
设 F F F和 G G G是关系 R ( U ) R(U) R(U)上的两个依赖集,若 F + = G + F^{+}=G^{+} F+=G+,则称 F F F与 G G G等价,记为 F = G F=G F=G。也可以称 F F F覆盖 G G G, G G G覆盖 F F F, F F F和 G G G相互覆盖。
一个函数依赖集F可能有若干个与其等价的函数依赖集,我们可以从中选择一个较好以便应用的函数依赖集。标准至少是:
- 所有函数依赖均独立,即该函数依赖集中不存在这样的函数依赖,它可由这个集合中的别的函数依赖推导出来。
- 表示最简单,即每个函数依赖的右部为单个属性[可用分解规则来做],左部最简单[左部不能有冗余属性]。
具体规则见下小节“最小函数依赖集”。
5.6.2 最小函数依赖集
若函数依赖集 F F F如果满足下列条件,则称 F F F为最小函数覆盖,记为 F m i n F_{min} Fmin:
- 对 F F F中任一函数依赖 X → A X\rightarrow A X→A, F - { X → A } F-\{X→A\} F-{X→A}都不与 F F F等价。[不存在冗余的函数依赖]
- F F F中每一个函数依赖的右部都是单个属性。[右部最简单]
- 对于 F F F中的任一函数依赖 X → A X\rightarrow A X→A, F - { X → A } ∪ { Z → A } F-\{X→A\}\cup \{Z\rightarrow A\} F-{X→A}∪{Z→A}都不与 F F F等价,其中 Z Z Z为 X X X的任一真子集。[左部最简单,左部不能有冗余的属性——X的真子集不能决定A,左边已经是最少的属性]
求函数依赖集F的最小覆盖的方法是:
- (1)使右部最简单:检查 F F F中的每个函数依赖 X → A X\rightarrow A X→A,若 A = { A 1 , A 2 , … , A k } A=\{A_{1},A_{2},…,A_{k}\} A={A1,A2,…,Ak},则根据分解规则,用 X → A i ( i = 1 , 2 , … , k ) X\rightarrow A_{i}(i=1,2,…,k) X→Ai(i=1,2,…,k)取代 X → A X\rightarrow A X→A
- (2)检查是否有冗余的函数依赖:检查 F F F中的每个函数依赖 X → A X\rightarrow A X→A,令 G = F - { X → A } G=F-\{X\rightarrow A\} G=F-{X→A},若有 A ∈ X G + A\in X_{G}^{+} A∈XG+,则从 F F F中去掉此函数依赖。
- (3)使左部最简单:检查 F F F中各函数依赖 X → A X\rightarrow A X→A,设 X = { B 1 , B 2 , … , B m } X=\{B_{1},B_{2},…,B_{m}\} X={B1,B2,…,Bm},检查 B i B_{i} Bi,当 A ∈ ( X − B i ) F + A\in (X-B_{i})_{F}^{+} A∈(X−Bi)F+时,即以 X - B i X-B_{i} X-Bi替换 X X X。