模式分解
存在问题
模式分解
- 关系模式R(U)的分解是指用R的一组子集 ρ \rho ρ={R1(U1),…,Rk(Uk)}来代替它。其中U= U1 ⋃ \bigcup ⋃U2 ⋃ \bigcup ⋃… ⋃ \bigcup ⋃Uk;Ui ⊈ \nsubseteqq Uj(i ≠ \neq =j)。
- 注:为便于后面叙述,我们用Ri代替Ri(Ui), R代替R(U)。
对于关系模式R的任一关系r, 它向 ρ \rho ρ的投影连接记为 m ρ m_\rho mρ(r)
-
m ρ m_\rho mρ(r) = ∏ R 1 \prod_{R1} ∏R1(r) ⋈ \Join ⋈… ⋈ \Join ⋈ ∏ R k \prod_{Rk} ∏Rk(r))= ⋈ ( i = 1 , . . . , k ) \Join_{(i=1,...,k)} ⋈(i=1,...,k) ∏ R i \prod_{Ri} ∏Ri(
-
这里: ∏ R i \prod_{Ri} ∏Ri(r)={t[Ri] | t ∈ \in ∈r, i=1,…,k }
模式分解需要关注:
- R与 ρ \rho ρ在数据内容方面是否等价:分解的无损连接性;
- R与 ρ \rho ρ在数据依赖方面是否等价:分解的保持依赖性。
[引理]:设R为一关系模式, ρ \rho ρ={R1,…,Rk}是R的一个分解,r是R的任一个关系,ri= ∏ R i \prod_{Ri} ∏Ri(r),则有规则成立:
- (rule 1):r
⫅
\subseteqq
⫅
m
ρ
m_\rho
mρ(r)
- 即:所有未分解前的关系,要包含在分解后重新连接得到的关系里
- (rule 2):若s =
m
ρ
m_\rho
mρ(r), 则
∏
R
i
\prod_{Ri}
∏Ri(s) = ri(即:
∏
R
i
\prod_{Ri}
∏Ri(
m
ρ
m_\rho
mρ(r)) =
∏
R
i
\prod_{Ri}
∏Ri(r))
- 即:所有分解的关系,在连接后还能再分解会去
- (rule 3):
m
ρ
m_\rho
mρ(
m
ρ
m_\rho
mρ(r)) =
m
ρ
m_\rho
mρ(r)
- 即:对连接后的关系再拿去让分解后的关系连接,仍然和原关系一样
无损连接分解
无损连接分解
- 对于关系模式R(U, F), U是属性全集,F是函数依赖集合, ρ \rho ρ={R1,…,Rk}是R的一个分解,如果对于R的任何满足函数依赖集F的关系r, 有r= m ρ m_\rho mρ(r),则称 ρ \rho ρ是R相对于F的一个无损连接分解,其中: m ρ m_\rho mρ(r) = ∏ R 1 \prod_{R1} ∏R1(r) ⋈ \Join ⋈… ⋈ \Join ⋈ ∏ R k \prod_{Rk} ∏Rk(r) = ⋈ ( i = 1 , . . . , k ) \Join_{(i=1,...,k)} ⋈(i=1,...,k) ∏ R i \prod_{Ri} ∏Ri(r)
无损连接性检验算法
-
Input:关系模式R=A1A2…An, 函数依赖集F, 分解 ρ \rho ρ={R1,…,Rk}
-
Output: ρ \rho ρ是否是无损连接的判断
-
Method:
- (1) 构造一k行n列的表,可称为 R ρ R_{\rho} Rρ表。其中第j列对应于Aj, 第i行对应于Ri, 若Aj ∈ \in ∈Ri, 则 R ρ R_{\rho} Rρ表中第i行第j列位置填写符号aj, 否则填写bij。
- (2) 根据
∀
\forall
∀(X
→
\rightarrow
→Y)
∈
\in
∈F, 对
R
ρ
R_{\rho}
Rρ表进行修改:
- 给定X → \rightarrow →Y,在表中寻找对应于X中所有属性分量之列上符号全相同的行。
- 若能找到,则在这些行的对应于Y中属性的那些列上置相同符号:
- 若其中有一个行的相应列上为aj,则使其它行同一列上置aj;
- 若相应列上均为bij(或blj),则使其它行同一列上置某一个bij(或blj,任一个都可,只要相同);
- (3) 在上述修改的表中,如果发现有一行变成a1, a2,…, an(全a), 则 ρ \rho ρ是无损连接分解,否则 ρ \rho ρ是有损连接分解。
-
示例:已知 R={ ABCDE }、F = { A → \rightarrow →C, B → \rightarrow →C, C → \rightarrow →D, DE → \rightarrow →C, CE → \rightarrow →A }、 ρ \rho ρ={R1(AD), R2(AB), R3(BE), R4(CDE), R5(AE)},问: ρ \rho ρ是否具有无损连接性?
[定理] 设F是关系模式R上的一个函数依赖集合。 ρ \rho ρ={R1,R2}是R的一个分解,则:当且仅当R1 ⋂ \bigcap ⋂R2 → \rightarrow →R1 − - −R2 或者 R1 ⋂ \bigcap ⋂R2 → \rightarrow →R2 − - −R1属于F+时, ρ \rho ρ是关于F无损连接的。
- 证明:由前述算法证明
保持依赖分解
保持依赖分解
- 对于关系模式R(U, F), U是属性全集,F是函数依赖集合, ρ \rho ρ={R1,…,Rk}是R的一个分解,如在 ∏ R i \prod_{Ri} ∏Ri(F)中的所有依赖之并集(i=1,…,k)逻辑蕴涵F的每个依赖,则称分解 ρ \rho ρ保持依赖集F。其中 ∏ R i \prod_{Ri} ∏Ri(F)是F在Ri上的投影,即F中的任一投影X → \rightarrow →Y,如果X, Y均包含于Ri,则X → \rightarrow →Y ∈ \in ∈ ∏ R i \prod_{Ri} ∏Ri(F)。Ri指Ri的属性集。
- 注:
- (1) 保持依赖的分解可能不是无损连接的。
- (2) 无损连接的分解可能不是保持依赖的。
- 示例:
- R(CSZ), F={ CS → \rightarrow →Z, Z → \rightarrow →C }, C是城市,S是街区, Z是邮政编码, ρ \rho ρ={R1(SZ), R2(CZ)}为一无损连接分解,但却不保持依赖;
- R(ABCD), F={A → \rightarrow →B, C → \rightarrow →D}, ρ \rho ρ={R1(AB), R2(CD)}为一保持依赖分解,但不是无损连接分解。
保持依赖性检验算法
-
Input:关系模式R=A1A2…An, R上的函数依赖集F, 分解 ρ \rho ρ={R1,…,Rk}
-
Output: ρ \rho ρ是否是保持依赖的判断
-
Method:令G = ⋃ ( i = 1 t o k ) \bigcup_{(i=1 to k)} ⋃(i=1tok) ∏ R i \prod_{Ri} ∏Ri, 只需检查G是否覆盖F即可。具体算法如下:
-
首先对每个X → \rightarrow →Y ∈ \in ∈F计算G中的 X G + X^+_G XG+:(如果X不包含于Ri则不需计算了)
Z = X
WHILE Z的变化发生 DO
FOR i =1 to k DO
Z = Z ⋃ \bigcup ⋃( ( Z ⋂ R i ) + {(Z \bigcap Ri)}^+ (Z⋂Ri)+ ⋂ \bigcap ⋂ Ri)
-
判断G是否逻辑蕴涵X → \rightarrow →Y:前面计算的结果Z便是X+, 如果Z包含Y, 则G逻辑蕴涵X → \rightarrow →Y,否则便不逻辑蕴涵。
-
判断 ρ \rho ρ是否保持依赖:如果G逻辑蕴涵F中的每一个函数依赖,则说 ρ \rho ρ是保持依赖的分解,否则便不是保持依赖的分解。
-
示例
- Input:R(A, B, C, D, E)、F = { A → \rightarrow →C, B → \rightarrow →C, C → \rightarrow →D, DE → \rightarrow →C, CE → \rightarrow →A } 、 ρ \rho ρ={R1(AC), R2(BC), R3(CDE) }
- Output: ρ \rho ρ 是否是保持依赖的判断
- Method:依据题意
∏
R
1
\prod_{R1}
∏R1(F)={ A
→
\rightarrow
→C },
∏
R
2
\prod_{R2}
∏R2(F)={ B
→
\rightarrow
→C } ,
∏
R
3
\prod_{R3}
∏R3(F)={ C
→
\rightarrow
→D , DE
→
\rightarrow
→C },G = { A
→
\rightarrow
→C , B
→
\rightarrow
→C , C
→
\rightarrow
→D , DE
→
\rightarrow
→C } ,显然不保持依赖。
- 对函数依赖A → \rightarrow →C ∈ \in ∈F计算G中的 X G + X^+_G XG+:Z = {A } ⋃ \bigcup ⋃{ C } ⋃ \bigcup ⋃{ } ⋃ \bigcup ⋃{ }={A,C}, C包含于Z中,所以A → \rightarrow →C被G逻辑蕴涵
- 对函数依赖DE → \rightarrow →C ∈ \in ∈F计算G中的 X G + X^+_G XG+:Z = {D,E} ⋃ \bigcup ⋃{ } ⋃ \bigcup ⋃{ } ⋃ \bigcup ⋃{ C, D }={C,D, E}, C包含于Z中,所以A → \rightarrow →C被G逻辑蕴涵
- 对函数依赖CE → \rightarrow →A ∈ \in ∈F计算G中的 X G + X^+_G XG+:Z = {C, E } ⋃ \bigcup ⋃{ } ⋃ \bigcup ⋃{ } ⋃ \bigcup ⋃{D } = {C, E, D}, A不包含于Z中,所以不被G逻辑蕴涵
分解成3NF或BCNF
无损连接分解成BCNF的算法
- Input:关系模式R(U, F)
- Output:R的一个无损连接分解 ρ \rho ρ, ρ \rho ρ中的每个关系模式都是F在该模式上投影的BCNF。
- Method:
- (1) 令 ρ \rho ρ={ R }。
- (2) 对每个模式s ∈ \in ∈ ρ \rho ρ, 若s ∉ \notin ∈/BCNF, 则s上必有X → \rightarrow →A成立且X不是s的超键且A ∉ \notin ∈/X,此时用模式s1, s2替代 ρ \rho ρ中的模式s,其中s1由A和X构成,s2由s中除A以外的所有属性构成(可以发现,s1 ∈ \in ∈BCNF)。
- (3) 重复步骤(2), 直至 ρ \rho ρ中全部关系模式达到BCNF。
- 注:本算法不能保证一关系模式分解成BCNF而又保持依赖。
- 证明:无损分解最后给出的定理。
- 示例:R(A, B, C, D, E, F, G)函数依赖集合{ A
→
\rightarrow
→B, A
→
\rightarrow
→C, C
→
\rightarrow
→D, C
→
\rightarrow
→E, E
→
\rightarrow
→FG }
- 候选键:A; 有不依赖于候选键的其他函数依赖,R不满足BCNF。
- 分解规则:
- 将左侧不含候选键的函数依赖单独组成一个关系, 将包含候选键的组成一关系 ρ \rho ρ={ R1(A, B, C), R2(CDEFG) }
- 分解 R2 ,候选键为 C,把不含 C 的关系作为 R3 : R2(CDE)、R3(EFG)
- 可以看出:R1 ∈ \in ∈BCNF; R2 ∈ \in ∈BCNF; R3 ∈ \in ∈BCNF;
保持依赖分解成3NF的算法。
-
Input:关系模式R(U, F), F是函数依赖集最小覆盖。
-
Output:R的一个保持依赖分解 ρ \rho ρ, ρ \rho ρ中的每个关系模式都是F在该模式上投影的3NF。
-
Method:
- (1) 把R中不出现在F中的属性去掉并单独组成一模式。
- (2) 对 ∀ \forall ∀X → \rightarrow →A ∈ \in ∈F, 则以XA组成一模式; 若有X → \rightarrow →A1, X → \rightarrow →A2,…, X → \rightarrow →Am都属于F, 则以XA1A2…Am组成一模式(即将n个模式合并为一个模式)。
- (3)取 ρ \rho ρ为上述模式之集合,则 ρ \rho ρ即为所求之分解。
-
示例:R(A, B, C, D, E, F, G)函数依赖集合{ A → \rightarrow →B, A → \rightarrow →C, C → \rightarrow →D, C → \rightarrow →E, E → \rightarrow →FG }
- 候选键:A; 有传递依赖,R不满足3NF。
- 分解规则:将每一个函数依赖单独组成一个关系 ρ \rho ρ={ R1(A, B), R2(A, C), R3(C, D) , R4(C, E) , R5(E, F, G) }
- 可以看出:每一个模式都属于3NF, 且 ρ \rho ρ是保持依赖的
- 也可以合并一些关系: ρ \rho ρ={ R12(A, B, C), R34(C, D, E) , R5(E, F, G) }
既保持依赖又无损连接
- 设 σ \sigma σ是按前述算法构造的R的一个第三范式分解,X是R的候选键,则: τ \tau τ= σ \sigma σ ⋃ \bigcup ⋃{ X }将是R的一个分解,且该分解中的所有关系模式是第三范式的, τ \tau τ有保持依赖和无损连接性。
- 即按照保持依赖方法分解后,把候选键相同的合并即可
- 示例:R(A, B, C, D, E, F, G),函数依赖:A
→
\rightarrow
→B, A
→
\rightarrow
→C, C
→
\rightarrow
→D, C
→
\rightarrow
→E, E
→
\rightarrow
→FG
- 保持依赖的分解成3NF然后合并: ρ \rho ρ={ R12(A, B, C), R34(C, D, E) , R5(E, F, G) }