模式的分解
定义:关系模式R<U,F>的一个分解是指p={R1<U1,F1>, R2<U2,F2>,...,Rn<Un,Fn>}
其中U=U1∪U2∪...∪Un 并且没有Ui包含于Uj
定义:函数依赖集合{X→Y | X→Y ∈F+ 且 XY 包含于U}的一个覆盖Fi叫做F在属性Ui上的投影。
模式分解的3个定义
1)分解具有“无损连接性”
2)分解要“保持函数依赖”
3)分解既要具有“无损连接性”也要“保持函数依赖”
分解的无损连接性和保持函数依赖性
定义一个记号p是R<U,F>的一个分解,r是R<U,F>的一个关系,定义mp(r)=全连接πRi(r),即mp(r)是r在p中各种关系模式上的投影的连接。
则有:
(1) r包含于mp(r)
(2)若s=mp(r)则πRi(s)=ri
(3)mp(mp(r))=mp(r)
定义:p是R的一个分解,若对R<U,F>的任何一个关系r均有r=mp(r)成立,则称分解p具有无损连接性。
算法:判断一个分解的无损连接性。
(1)建立一张n列k行的表,每一列对应一个属性,每一行对应分解中的一个关系模式。若属性Aj属于Ui,则在j列i行交叉处填上aj,否则填bij。
(2)对每一个FDi做下列操作:找到Xi所对应的列中具有相同符号的那些行。考察这些行中li列中的元素,若其中有ali则全部改为ali,否则全部改为bmli
若某次更改之后,有一行称为a1,a2,...,an。则算法终止。p具有无损连接性。否则p不具有无损连接性。
模式分解的算法
合成法(转换为3NF的保持函数依赖的分解)
(1)对于 R<U,F>中的函数依赖集F进行“极小化处理”
(2)找出不在F中出现的属性,把这样的属性构成一个关系模式。把这些属性从U中去掉,剩余的属性仍记为U
(3)若有X→A∈F且XA=U,则p={R},算法终止
(4)否则,对F按具有相同左部的原则分组(假定为k组),每一组的函数依赖F‘i所设计的全部属性形成一个属性集Ui。若Ui包含于Uj(Ui≠Uj),就去掉Ui。
进一步地,转换为3NF既有无损连接性又有函数依赖的分解。
(1)X是R<U,F>的码,R<U,F>已经根据合成法分解为p,另t=p∪R*<X,Fx>
(2)若有某个Ui,X包含于Ui,将R*<X,Fx>从t中去掉。
(3)t就是所求的分解。
分解法(转换为BCNF的无损连接分解)
(1)令p={R<U,F>}
(2)检查p中个关系模式是否均属于BCNF。若是,则算法终止。
(3)必有X→A∈Fi+(A∉X)且X非Ri的码,因此XA是Ui的真子集。对Ri进行分解Q={S1,S2},Us1=XA,Us2=Ui-{A},以Q代替R(Ui,Fi),返回第二步。
这是一个自顶向下的算法,它自然地形成一棵对R(U,F)的二叉分解树。
小结
- 若要求分解具有无损连接性,那么模式分解一定能够达到4NF
- 若要求分解保持函数依赖,那么模式分解一定能够达到3NF,但不一定能够达到BCNF
- 若要求分解既具有无损连接性,又保持函数依赖,则模式分解一定能够达到3NF,但不一定能够达到BCNF