数据库设计的算法

1. 最小依赖集

定义     如果函数依赖集 FFF 满足下列条件,则称 FFF 为一个极小函数依赖集,亦称为最小依赖集最小覆盖

  1. FFF 中任一函数依赖的右部仅含有一个属性。
  2. FFF 中不存在这样的函数依赖 X→AX\rightarrow AXA,使得 FFFF−{X→A}F-\{X\rightarrow A\}F{XA} 等价。F中不能有多余的函数依赖
  3. FFF 中不存在这样的函数依赖 X→AX\rightarrow AXAXXX 有真子集 ZZZ 使得 F−{X→A}⋃{Z→A}F-\{X\rightarrow A\}\bigcup\{Z\rightarrow A\}F{XA}{ZA}FFF 等价。X中不能有冗余属性

定理     每一个函数依赖集 FFF 均等价于一个极小函数依赖集 FmF_{m}Fm 。此 FmF_{m}Fm 称为 FFF 的最小依赖集。Fm不唯一

求最小依赖集
  1. FFF 中的所有函数依赖的右边化为单一属性(每个属性都分开)
  2. 去掉 FFF 中的所有函数依赖左边的冗余属性(若有多个属性,分别求每个属性的闭包,若闭包里包含右边的属性,则剩余属性就是多余的)
  3. 去掉 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(XR) 是L类属性,则X必为R的任一候选码的成员。
(2)若 X(X∈R)X(X\in R)X(XR) 是L类属性,且 X+X^{+}X+ 包含了R的全部属性,则X必为R的唯一候选码。
(3)若 X(X∈R)X(X\in R)X(XR) 是R类属性,则X不在任何候选码中。
(4)若 X(X∈R)X(X\in R)X(XR) 是N类属性,则X必为R的任一候选码的成员。
(5)若 X(X∈R)X(X\in R)X(XR) 是R的N类和L类属性组成的属性集,且 X+X^+X+ 包含了R的全部属性,则X是R的唯一候选码。
(6)若 X(X∈R)X(X\in R)X(XR) 是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.模式分解

三种模式分解等价的定义:

  1. 分解具有无损连接性
  2. 分解要保持函数依赖
  3. 分解既要保持函数依赖,又要无损连接性
验证是否为无损连接

设有关系模式R(A,B,C,D),R分解成ρ={AB,BC,CD}\rho =\{AB,BC,CD\}ρ={ABBCCD},如果在R上成立的函数依赖集 F={B→A,C→D}F=\{B \rightarrow A, C\rightarrow D\}F={BA,CD},那么p相对于F是否为无损连接分解?

关系模式R中的元素作列名,ρ\rhoρ作行名。
若第iii行的行名包含第jjj列的列名,则 (i,j)(i,j)(i,j)aja_jaj,否则为bijb_{ij}bij

ABCD
ABa1a_1a1a2a_2a2b13b_{13}b13b14b_{14}b14
BCb12b_{12}b12a2a_2a2a3a_3a3b24b_{24}b24
CDb31b_{31}b31b32b_{32}b32a3a_3a3a4a_{4}a4

根据函数依赖集,观察每一对函数依赖,如B→AB\rightarrow ABA,找到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的最小函数依赖集Fmin⁡F_{\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)如果Fmin⁡F_{\min}Fmin中有一函数依赖X→AX\rightarrow AXA,且XA=RXA=RXA=R,则输出ρ={R}\rho=\{ R\}ρ={R},转(4)
(2)如果R中某些属性与Fmin⁡F_{\min}Fmin中所有依赖的左部与右部都无关,则将它们构成关系模式,从R中将它们所在的候选码分出去,单独构成一个模式
(3)对于 Fmin⁡F_{\min}Fmin中的每一个函数依赖X→AX\rightarrow AXA,都单独构成一个关系子模式XAXAXA,若Fmin⁡F_{\min}Fmin中有X→A1,X→A2,⋯ ,X→AnX\rightarrow A_1,X\rightarrow A_2,\cdots,X\rightarrow A_nXA1,XA2,,XAn,则可以用模式XA1A2⋯AnXA_1A_2\cdots A_nXA1A2An取代n个模式XA1,XA2,⋯ ,XAnXA_1,XA_2,\cdots ,XA_nXA1,XA2,,XAn
(4)停止分解,输出ρ\rhoρ

即具有无损连接性又具有保持函数依赖性的模式分解

把一个关系模式分解为3NF,使它既具有无损连接性又具有保持函数依赖性。
输入:关系模式R和R的最小函数依赖集Fmin⁡F_{\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ρ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值