模式分解
0.什么是模式分解
当模式不符合关系范式时,需要进行模式分解
[Definition]模式分解
关系模式R(U)的分解是指用R的一组子集
ρ
=
R
1
(
U
1
)
,
…
,
R
k
(
U
k
)
ρ={R_1(U_1),…,R_k(U_k)}
ρ=R1(U1),…,Rk(Uk)来代替它。
其中
U
=
U
1
∪
U
2
∪
…
∪
U
k
;
U
i
⊄
U
j
(
i
!
=
j
)
U= U_1∪ U_2∪…∪ U_k;U_i⊄ Uj_ (i!=j)
U=U1∪U2∪…∪Uk;Ui⊄Uj(i!=j)。
注:为便于后面叙述,用
R
i
R_i
Ri 代替
R
i
(
U
i
)
R_i(U_i)
Ri(Ui),
R
R
R代替
R
(
U
)
R(U)
R(U)。
模式分解需要关注:
R与ρ 在数据内容方面是否等价:分解的无损连接性;
R与ρ 在数据依赖方面是否等价:分解的保持依赖性。
[引理1] 设 R R R为一关系模式, ρ = R 1 , … , R k ρ={R_1,…,R_k} ρ=R1,…,Rk是 R R R的一个分解,r是 R R R的任一个关系, 记 r i = π R i ( r ) r_i=π_{R_i} (r) ri=πRi(r)(即R在 r i r_i ri模式上的投影),则有规则成立:
- r ⊆ m ρ ( r ) r ⊆ m_ρ(r) r⊆mρ(r):说明一个大的关系模式,分解为多个小的关系模式,如果把大的关系模式投影到小的关系模式再连接起来,连接到结果相比原先大的关系要增加信息,这些信息很有可能是错误的(如下图,r有4个关系,而 m ρ ( r ) m_ρ(r) mρ(r)有8个关系)
- 若 s = m ρ ( r ) s= m_ρ(r) s=mρ(r), 则 π R i = r i π_{R_i}= r_i πRi=ri(即: π R i ( m ρ ( r ) ) = π R i ( r ) ) π_{R_i}(m_ρ(r))= π_{R_i}(r)) πRi(mρ(r))=πRi(r)) 这说明小的关系模式连接的结果 s = m ρ ( r ) s= m_ρ(r) s=mρ(r)再反过来投影到小的关系模式上 π R ( m ρ ( r ) ) π_R(m_ρ(r)) πR(mρ(r))和原来的小的关系模式 r i = π R i ( r ) r_i=π_{R_i} (r) ri=πRi(r)相同
- m ρ ( m ρ ( r ) ) = m ρ ( r ) m_ρ(m_ρ(r))=m_ρ(r) mρ(mρ(r))=mρ(r) 如果我们再次将分解后的投影的连接再次分解投影连接的话还是和第一次操作的结果相同,不会产生更多的信息
这三条关系模式告诉我们如果把大的关系模式分解为小的关系模式,如果我们不加以注意,就会出现一些错误的信息
下面是一个模式分解的例子:
分解后好像有约束(CS→Z)丢失了
因此约束丢失也是一个问题
1.无损连接分解及其检验算法
主要就是要求
r
⊆
m
ρ
(
r
)
r ⊆ m_ρ(r)
r⊆mρ(r),就是大的关系模式经过模式分解得到的结果再进行连接,要求连接的结果和原来的关系模式相等,如果不满足就是有损连接
无损连接性检验算法
R
ρ
R_ρ
Rρ表:
每一列是原关系模式的属性
每一行是分解后的小的模式
首先再行列交叉点填写
a
j
a_j
aj或
b
i
j
b_{ij}
bij
如果
A
j
∈
R
i
A_j∈R_i
Aj∈Ri(就是分解后的模式中含有该属性),则填写
a
j
a_j
aj,否则填写
b
i
j
b_{ij}
bij
然后在根据
∀
(
X
→
Y
)
∈
F
∀(X→Y)∈F
∀(X→Y)∈F, 对
R
ρ
R_ρ
Rρ表进行修改:
给定X→Y, 寻找X属性取值相同的行, 用其值修改X对应的Y属性值(将Y的符合全部修改成一样的,有a则置为a,没有就选编号最小的b);
最后判定修改后, 如果有一行变 成 a 1 , a 2 , … , a n ( 全 为 a ) 成a_1, a_2,…, a_n(全为a) 成a1,a2,…,an(全为a), 则ρ无是损连接分解, 否则为有损连接分解。
例子哈:
PS:如果只有两个关系,还有这么一个判别方法:
如果
R
1
∩
R
2
→
R
1
−
R
2
R_1∩R_2→R_1-R_2
R1∩R2→R1−R2或者
R
1
∩
R
2
→
R
2
−
R
1
R_1∩R_2→R_2-R_1
R1∩R2→R2−R1
则是无损链接的
2.保持连接分解及其检验算法
[Definition]保持依赖分解
对于关系模式R(U, F), U是属性全集,F是函数依赖集合,
ρ
=
R
1
,
…
,
R
k
ρ={R_1,…,R_k}
ρ=R1,…,Rk是R的一个分解,如在
π
R
i
(
F
)
π_{R_i}(F)
πRi(F)中的所有依赖之并集(i=1,…,k),逻辑蕴涵F的每个依赖,则称分解ρ保持依赖集F。
其中
π
R
i
(
F
)
π_{R_i}(F)
πRi(F)是F在
R
i
R_i
Ri上的投影,即F中的任一投影
X
→
Y
X→Y
X→Y,如果X, Y均包含于Ri ,则X→Y∈
π
R
i
(
F
)
π_{R_i} (F)
πRi(F)(
R
i
R_i
Ri是分解
R
i
R_i
Ri的属性集)。
注:
(1)保持依赖的分解可能不是无损连接的。
(2)无损连接的分解可能不是保持依赖的。
保持依赖性检验算法
3.关系模式无损连接或保持依赖的分解算法
3.1 关系模式分解成BCNF
将左侧不含候选键的函数依赖单独组成一个关系, 将包含候选键的组成一关系,一定是满足BCNF(无损连接)的
本算法保证:关系模式分解成BCNF(无损连接),但不一定保持依赖。
BCNF === 无损连接
3.2 关系模式分解成3NF
将每一个函数依赖单独组成一个关系
将每一个函数依赖单独组成一个关系,然后将F中相同的
X
→
A
X→A
X→A合并
分解成第三范式一定能保存依赖,但不一定是无损连接的
3NF===保存依赖
3.3 既保持依赖,又无损连接的分解
把一个关系模式按照保持依赖的方式分解成第三范式以后,如果有某一个关系模式保存了候选键的所有属性,那么这个分解一定是既保持依赖又无损连接的;如果这个分解没有哪一个关系模式保存了全部的候选键,那么我们再增加一个模式,该模式保存了候选键,那么合在一起构成的新的分解就是既保持依赖,又无损连接的分解
(并不一定为最小可能关系模式的集合。我们可以依次去掉一个关系模式, 只要所要求的性质仍具备,直至求得上述最小集合。)
3.4 无损连接分解成4NF
这里和分解成BCNF类似,不过这里将函数依赖看作多值依赖进行处理
4.连接依赖与第5NF 连接依赖
连接依赖可以保持无损连接性
[定义]当且仅当关系模式R的每个连接依赖均按其候选键进行连接运算时(均由R的候选键所隐含),则称R是第五范式的,记为 R ∈ 5 N F R∈ 5NF R∈5NF。
第五范式消除了不按候选键连接的连接依赖(R的无损连接分解中各模式必含有一个候选键),但其语义背景抽象。
(只要有连接,必须包含候选键)
5 N F ∈ 4 N F 5NF∈4NF 5NF∈4NF。第五范式也称投影连接范式,即PJNF 。