前言
在学习数据库时,我们总会遇到求解一个分解是否满足函数依赖是否保持,在求解投影时常常利用传递函数依赖来求解,但是经常会有遗漏,本文总结了一种求解投影的算法供大家参考。
提示:以下是本篇文章正文内容,下面案例可供参考,如有问题可在评论区反馈
设有关系模式
R
=
(
A
,
B
,
C
,
D
,
E
,
F
)
R=(A ,B ,C ,D ,E ,F )
R=(A,B,C,D,E,F)
R的函数依赖集
F
=
{
A
→
B
C
F
,
C
D
→
E
,
B
→
D
,
B
E
→
F
,
E
F
→
A
}
F=\{A→BCF ,CD→E ,B→D ,BE→F ,EF→A\}
F={A→BCF,CD→E,B→D,BE→F,EF→A}
判断分解
ρ
=
{
R
1
(
A
,
B
,
C
,
D
)
,
R
2
(
A
,
E
,
F
)
}
ρ=\{R_1(A,B,C,D),R_2(A,E,F)\}
ρ={R1(A,B,C,D),R2(A,E,F)}是否具有函数依赖性
一、第一步求F在每个分解上的投影
F
1
=
∏
u
1
(
F
)
=
{
A
→
B
C
D
,
B
→
D
,
B
C
→
A
}
F_1=∏u_1(F)=\{A→BCD,B→D,BC→A\}
F1=∏u1(F)={A→BCD,B→D,BC→A}
F
2
=
∏
u
2
(
F
)
=
{
A
→
E
F
,
E
F
→
A
}
F_2=∏u_2(F)=\{A→EF,EF→A\}
F2=∏u2(F)={A→EF,EF→A}
这个投影是如何求解的呢?
下面给出求解投影的算法
1.求F1
R 1 ( A , B , C , D ) R_1(A,B,C,D) R1(A,B,C,D)
-
第一步:求 R 1 R_1 R1中每个属性在 F F F上的闭包
( A ) + = A B C D E F , ( B ) + = B D , ( C ) + = C , ( D ) + = D (A)^+=ABCDEF,(B)^+=BD,(C)^+=C,(D)^+= D (A)+=ABCDEF,(B)+=BD,(C)+=C,(D)+=D
将满足条件的依赖加入 F 1 F_1 F1,则有 { A → B C D , B → D } \{A→BCD,B→D\} {A→BCD,B→D}
[注]:满足条件的依赖指右边推出的属性在 R 1 R_1 R1中。
若有属性的闭包包含 R 1 R_1 R1中所有的属性则不参与下一步,因为 A B C D ⊂ ( A ) + ABCD⊂(A)^+ ABCD⊂(A)+所以 A A A不参加下一步。 -
第二步:从不满足闭包包含 R 1 R_1 R1所有属性的属性集 { B , C , D } \{B,C,D\} {B,C,D}中选择两个求闭包
( B C ) + = B C A D E F , ( B D ) + = B D , ( C D ) + = C D E (BC)^+=BCADEF,(BD)^+=BD,(CD)^+=CDE (BC)+=BCADEF,(BD)+=BD,(CD)+=CDE
将满足条件的依赖加入 F 1 F_1 F1,则有 { B C → A } \{BC→A\} {BC→A}
[注]:由于 B → D B→D B→D所以 B C → D BC→D BC→D就不需要了。
若有属性集的闭包包含 R 1 R_1 R1中所有属性则不参与下一步,因为 A B C D ⊂ ( B C ) + ABCD⊂(BC)^+ ABCD⊂(BC)+所以 B C BC BC不参加下一步 -
第三步:从不满足闭包包含 R 1 R_1 R1所有属性的属性集 { D } \{D\} {D},选择三个属性求闭包,这时属性不足三个,算法终止,输出 F 1 = { A → B C D , B → D , B C → A } F_1=\{A→BCD,B→D, BC→A\} F1={A→BCD,B→D,BC→A}
2.求F2
R 2 ( A , E , F ) R_2(A,E,F) R2(A,E,F)
-
第一步:求 R 2 R_2 R2中每个属性在 F F F上的闭包
( A ) + = A B C D E F , ( E ) + = E , ( F ) + = F (A)^+=ABCDEF,(E)^+=E,(F)^+=F (A)+=ABCDEF,(E)+=E,(F)+=F
将满足条件的依赖加入 F 2 F_2 F2,则有 { A → E F } \{A→EF\} {A→EF}
若有属性的闭包包含 R 2 R_2 R2中所有的属性则不参与下一步,因为 A E F ⊂ ( A ) + AEF⊂(A)^+ AEF⊂(A)+所以 A A A不参加下一步 -
第二步:从不满足闭包包含 R 2 R_2 R2所有属性的属性集 { E , F } \{E,F\} {E,F}中选择两个求闭包
( E F ) + = A E F (EF)^+=AEF (EF)+=AEF
将满足条件的依赖加入 F 2 F_2 F2,则有 { E F → A } \{EF→A\} {EF→A}
若有属性的闭包包含 R 2 R_2 R2中所有的属性则不参与下一步,因为 A E F ⊂ ( E F ) + AEF⊂(EF)^+ AEF⊂(EF)+所以 E F EF EF不参加下一步 -
第三步:从不满足闭包包含 R 2 R_2 R2所有属性的属性集{}中选择三个求闭包,这时属性不足三个,算法终止。
输出 F 2 = { A → E F , E F → A } F_2=\{A→EF,EF→A\} F2={A→EF,EF→A}
二、看F+是否等价于G+
G
=
F
1
∪
F
2
=
{
A
→
B
C
D
E
F
,
B
→
D
,
B
C
→
A
D
,
E
F
→
A
}
G= F_1∪F_2 =\{A→BCDEF ,B→D ,BC→AD ,EF→A\}
G=F1∪F2={A→BCDEF,B→D,BC→AD,EF→A}
由于
G
G
G中的每个依赖关系都是
F
F
F投影出来的,所以
G
+
G^+
G+⊂
F
+
F^+
F+
所以要看
G
+
=
F
+
G^+=F^+
G+=F+ 只要考察
F
+
⊂
G
+
F^+⊂G^+
F+⊂G+
考察
F
F
F中每个属性
1、
A
→
B
∈
G
+
A→B∈G^+
A→B∈G+
2、
A
→
C
∈
G
+
A→C∈G^+
A→C∈G+
3、
A
→
F
∈
G
+
A→F∈G^+
A→F∈G+
4、
C
D
→
E
,
C
D
CD→E,CD
CD→E,CD在
G
G
G上的闭包
(
C
D
)
+
=
C
D
,
E
(CD)^+=CD,E
(CD)+=CD,E不属于
(
C
D
)
+
(CD)^+
(CD)+
∴
C
D
→
E
CD→E
CD→E 不属于
G
+
G^+
G+
∴
G
+
≠
F
+
G^+≠F^+
G+=F+
∴该分解不具有函数依赖保持性