1. 最小依赖集
定义 如果函数依赖集 FFF 满足下列条件,则称 FFF 为一个极小函数依赖集,亦称为最小依赖集或最小覆盖
- FFF 中任一函数依赖的右部仅含有一个属性。
- FFF 中不存在这样的函数依赖 X→AX\rightarrow AX→A,使得 FFF 与 F−{X→A}F-\{X\rightarrow A\}F−{X→A} 等价。
F中不能有多余的函数依赖
- FFF 中不存在这样的函数依赖 X→AX\rightarrow AX→A,XXX 有真子集 ZZZ 使得 F−{X→A}⋃{Z→A}F-\{X\rightarrow A\}\bigcup\{Z\rightarrow A\}F−{X→A}⋃{Z→A} 与 FFF 等价。
X中不能有冗余属性
定理 每一个函数依赖集 FFF 均等价于一个极小函数依赖集 FmF_{m}Fm 。此 FmF_{m}Fm 称为 FFF 的最小依赖集。Fm不唯一
求最小依赖集
- 将 FFF 中的所有函数依赖的右边化为单一属性(每个属性都分开)
- 去掉 FFF 中的所有函数依赖左边的冗余属性(若有多个属性,分别求每个属性的闭包,若闭包里包含右边的属性,则剩余属性就是多余的)
- 去掉 FFF 中所有冗余的函数依赖(挨个讨论去掉某个函数依赖的可能性)
2.候选码
求解候选码
对于给定的关系模式 R{A1,⋯ ,An}R\{A_{1},\cdots,A_{n} \}R{A1,⋯,An} 和函数依赖集 FFF ,可将其属性分为以下四类:
- L类:只在函数依赖的左侧出现
- R类:只在函数依赖的右侧出现
- N类:没有在函数依赖出现过
- LR类:在函数依赖的左右侧都出现
(1)若 X(X∈R)X(X\in R)X(X∈R) 是L类属性,则X必为R的任一候选码的成员。
(2)若 X(X∈R)X(X\in R)X(X∈R) 是L类属性,且 X+X^{+}X+ 包含了R的全部属性,则X必为R的唯一候选码。
(3)若 X(X∈R)X(X\in R)X(X∈R) 是R类属性,则X不在任何候选码中。
(4)若 X(X∈R)X(X\in R)X(X∈R) 是N类属性,则X必为R的任一候选码的成员。
(5)若 X(X∈R)X(X\in R)X(X∈R) 是R的N类和L类属性组成的属性集,且 X+X^+X+ 包含了R的全部属性,则X是R的唯一候选码。
(6)若 X(X∈R)X(X\in R)X(X∈R) 是LR类属性,则X可能为R的任一候选码的成员,也可能不为R的任一候选码的成员。
多属性函数依赖集候选码的求解算法
设有关系模式R,F是R上的函数依赖集,求R的所有候选码
(1)属性分类(L、R、N和LR),X代表L类和N类属性,Y代表LR类属性
(2)若 X+X^+X+ 包含了R的全部属性,转(5);否则,转(3)
(3)在Y中取一个属性A,求(XA)+(XA)^+(XA)+ ,若它包含了R的全部属性,则转(4);否则,调换一属性反复进行这一过程,直到试完所有Y中的属性。
(4)如果已找出所有候选码,则转(5);否则在Y中依次取两个属性、三个属性、……,求它们的属性集的闭包,直到其闭包包含R的全部属性。
(5)停止,输出结果。
3.模式分解
三种模式分解等价的定义:
- 分解具有无损连接性
- 分解要保持函数依赖
- 分解既要保持函数依赖,又要无损连接性
验证是否为无损连接
设有关系模式R(A,B,C,D),R分解成ρ={AB,BC,CD}\rho =\{AB,BC,CD\}ρ={AB,BC,CD},如果在R上成立的函数依赖集 F={B→A,C→D}F=\{B \rightarrow A, C\rightarrow D\}F={B→A,C→D},那么p相对于F是否为无损连接分解?
关系模式R中的元素作列名,ρ\rhoρ作行名。
若第iii行的行名包含第jjj列的列名,则 (i,j)(i,j)(i,j)为aja_jaj,否则为bijb_{ij}bij
A | B | C | D | |
---|---|---|---|---|
AB | a1a_1a1 | a2a_2a2 | b13b_{13}b13 | b14b_{14}b14 |
BC | b12b_{12}b12 | a2a_2a2 | a3a_3a3 | b24b_{24}b24 |
CD | b31b_{31}b31 | b32b_{32}b32 | a3a_3a3 | a4a_{4}a4 |
根据函数依赖集,观察每一对函数依赖,如B→AB\rightarrow AB→A,找到A列、B列,在B列中找到那些相等元素的行号,看对应A列中的值是否相等。若不相等,含有bijb_{ij}bij,则可以改为aja_jaj,如b12b_{12}b12可以改为a1a_1a1。
扫描所有的函数依赖,终止时表中若有一行为a1,a2,⋯ ,ana_1,a_2,\cdots,a_na1,a2,⋯,an,则ρ\rhoρ为无损连接。
具有保持函数依赖性的模式分解
把一个关系模式分解为3NF,使它具有保持函数依赖性。
输入:关系模式R和R的最小函数依赖集FminF_{\min}Fmin
输出:R的一个保持函数依赖的分解ρ={R1,R2,⋯ ,Rk}\rho =\{R_1,R_2,\cdots ,R_k \}ρ={R1,R2,⋯,Rk},每个RiR_iRi相对于∏Ri(Fmin)\prod_{R_i}(F_{\min})∏Ri(Fmin) 是3NF模式。
(1)如果FminF_{\min}Fmin中有一函数依赖X→AX\rightarrow AX→A,且XA=RXA=RXA=R,则输出ρ={R}\rho=\{ R\}ρ={R},转(4)
(2)如果R中某些属性与FminF_{\min}Fmin中所有依赖的左部与右部都无关,则将它们构成关系模式,从R中将它们所在的候选码分出去,单独构成一个模式
(3)对于 FminF_{\min}Fmin中的每一个函数依赖X→AX\rightarrow AX→A,都单独构成一个关系子模式XAXAXA,若FminF_{\min}Fmin中有X→A1,X→A2,⋯ ,X→AnX\rightarrow A_1,X\rightarrow A_2,\cdots,X\rightarrow A_nX→A1,X→A2,⋯,X→An,则可以用模式XA1A2⋯AnXA_1A_2\cdots A_nXA1A2⋯An取代n个模式XA1,XA2,⋯ ,XAnXA_1,XA_2,\cdots ,XA_nXA1,XA2,⋯,XAn
(4)停止分解,输出ρ\rhoρ
即具有无损连接性又具有保持函数依赖性的模式分解
把一个关系模式分解为3NF,使它既具有无损连接性又具有保持函数依赖性。
输入:关系模式R和R的最小函数依赖集FminF_{\min}Fmin
输出:R的一个分解ρ={R1,R2,⋯ ,Rk}\rho=\{R_1,R_2,\cdots , R_k \}ρ={R1,R2,⋯,Rk},RiR_iRi为3NF,ρ\rhoρ具有无损连接性和保持函数依赖性
(1)根据3NF规范化算法求出保持函数依赖的分解:ρ={R1,R2,⋯ ,Rk}\rho=\{R_1,R_2,\cdots , R_k \}ρ={R1,R2,⋯,Rk}
(2)判定ρ\rhoρ是否具有无损连接性,若是,转(4)。
(3)令ρ=ρ⋃{X}={R1,R2,⋯ ,Rk,X}\rho=\rho\bigcup \{X\}=\{R_1,R_2,\cdots , R_k ,X\}ρ=ρ⋃{X}={R1,R2,⋯,Rk,X},其中X是R的候选码。
(4)输出ρ\rhoρ