第六章 关系数据库理论 算法合集
X F + X_{F}^{+} XF+求解算法
即求 X X X在函数依赖集 F F F条件下所能决定的属性的集合。
- X F + = X X_F^+=X XF+=X
- 逐一考察 F F F中的每一个函数依赖 v → w v \rightarrow w v→w, 如果 v ∈ X F + v \in X_F^+ v∈XF+,则 w w w并入 X F + X_F^+ XF+
- X F + = U X_F^+ = U XF+=U or X F + X_F^+ XF+不再增加,算法结束
极小函数依赖集求解算法
拆右,去左(属性冗余),去重(函数依赖冗余)
- 分解右部属性,得 F 1 F_1 F1
- 去除左侧属性冗余,即变动 X F + X_F^+ XF+中的 X X X,函数依赖集为 F F F,此步骤将 F 1 F_1 F1修改得到 F 2 F_2 F2
- 去除函数依赖冗余,函数依赖集为上一步得到的 F 2 F_2 F2
候选码求解算法
- 划分L,R,N,LR类属性,L,N类属性必包含在候选码中,R类属性必不在候选码中,LR类属性不确定,需要筛选。 X X X为L,N类属性的集合, Y Y Y为LR属性的集合
- 若 X F + = U X_F^+ = U XF+=U,算法结束。 X X X是唯一的候选码
- 逐一查看 Y Y Y中的单个属性 A A A,若 ( X A ) F + = U (XA)_F^+ = U (XA)F+=U,则 X A XA XA为候选码, Y = Y − A Y=Y-A Y=Y−A
- Y Y Y不为空,依次查看 Y Y Y中任意2个、3个、…属性 Z Z Z,若 ( X Z ) F + = U (XZ)_F^+=U (XZ)F+=U,且 X Z XZ XZ不包含已求得的候选码, X Z XZ XZ为候选码,直至取完所有属性的集合
模式分解
无损连接性的判定算法(通用)
- 建立一张 n n n列 k k k行的表,每一列对应一个属性 A j A_j Aj,每一行对应一个关系模式 R i R_i Ri。若属性 A j A_j Aj属于 U i U_i Ui,则在表中 i行j列处填上 a j a_j aj,否则填上 b i j b_{ij} bij
- 把表看作 R < U , F > R<U, F> R<U,F>的一个关系,依次检查 F F F中每一函数依赖在表中是否成立.若不成立,则做出修改使其成立。修改原则:能改成 a a a则改成 a a a,否则改成行下标最小的 b b b;(称为一趟扫描过程)【看某一函数依赖 X → Y X\rightarrow Y X→Y左侧的属性 X X X所在的列,是否有两行出现相同的 a a a。若出现,,且有一行 Y Y Y所在的列取值也为 a a a,则将另一行的 Y Y Y所在列的值也改为 a a a】
- 如果在一趟扫描中的某次更改之后出现形如 a 1 , a 2 , … , a n a_1,a_2,…,a_n a1,a2,…,an的行,算法结束,分解ρ具有无损连接性;否则,继续下一趟扫描过程,直到一趟扫描之后表无任何变化时算法结束 (此时未出现形如 a 1 , a 2 , … , a n a_1,a_2,…,a_n a1,a2,…,an的行),分解ρ不具有无损连接性
一分为二的模式分解的无损连接性判定算法
不考虑多值依赖
关系模式 R < U , F > R<U, F> R<U,F>的一个分解 ρ = R 1 < U 1 , F 1 > , R 2 < U 2 , F 2 > ρ={ R1<U1,F1>,R2<U2,F2> } ρ=R1<U1,F1>,R2<U2,F2>具有无损连接性的充分必要条件是: U 1 ∩ U 2 → U 1 - U 2 U1∩U2 → U1-U2 U1∩U2→U1-U2 或 U 1 ∩ U 2 → U 2 - U 1 U1∩U2 → U2-U1 U1∩U2→U2-U1成立。
考虑多值依赖(Multivalued Dependency,MVD)
MVD 定义:设 R ( U ) R(U) R(U)是一个属性集 U U U上的关系模式, X X X和 Y Y Y是 U U U的子集。如果对 R ( U ) R(U) R(U)的任一关系 r r r, r r r中任意在 X X X上值相同的元组 s , t s, t s,t,交换 s , t s, t s,t 在 Y Y Y上的分量而得到的元组仍在关系$ r$ 中,则称 Y Y Y多值依赖于 X X X,或 X X X多值决定 Y Y Y,记为 X → → Y X→→Y X→→Y
关系模式 R < U , F > R<U, F> R<U,F>中, F F F为 R R R中的函数依赖和多值依赖的集合。分解 ρ = R 1 < U 1 , F 1 > , R 2 < U 2 , F 2 > ρ={ R1<U1,F1>,R2<U2,F2> } ρ=R1<U1,F1>,R2<U2,F2>具有无损连接性的充分必要条件是 U 1 ∩ U 2 → → U 1 - U 2 U1∩U2 →→ U1-U2 U1∩U2→→U1-U2 成立
函数依赖集的投影求解算法
设 ρ = R 1 < U 1 , F 1 > , R 2 < U 2 , F 2 > , … , R k < U k , F k > ρ={ R1<U1, F1>,R2<U2, F2>,…,Rk<Uk, Fk>} ρ=R1<U1,F1>,R2<U2,F2>,…,Rk<Uk,Fk>是关系模式 R < U , F > R<U, F> R<U,F>的一个分解,求解 F F F在每个 U i U_i Ui上投影 F i ( i = 1 , 2 , . . . , k ) F_i (i=1, 2, ..., k) Fi(i=1,2,...,k)。
- 初始令每个 F i F_i Fi为空集;
- 依次取 U i U_i Ui中的单一属性 X X X,求 X F + X_F^+ XF+,若 A ∈ U i A\in U_i A∈Ui且 A ∈ X F + A\in X_F^+ A∈XF+且 X → A X→A X→A不能由当前求得的 F i F_i Fi推导出,则将 X → A X→A X→A加入 F i F_i Fi,如加入使得 F i F_i Fi中一部分已有依赖变得多余,则从 F i F_i Fi中删除多余的依赖;
- 依次任取 U i U_i Ui中的两个、三个、…个属性构成属性组 X X X,求 X F + X_F^+ XF+,若 A ∈ U i A \in U_i A∈Ui且 A ∈ X F + A\in X_F^+ A∈XF+且 X → A X→A X→A不能由当前求得的 F i F_i Fi推导出,则将 X → A X→A X→A加入 F i F_i Fi ,如加入使得 F i F_i Fi中一部分已有依赖变得多余,则从 F i F_i Fi中删除多余的依赖;
- 重复3,直到取尽Ui中的所有属性组 X X X,算法结束