3 保持函数依赖的模式分解 一、转换成 3NF 的保持函数依赖的分解 算法: ρ ={R 1,R 2,
,Rk}是关系模式R 的一个分解,U={A 1,A 2,
,A n},F={FD 1,FD 2,
,FDp},并设F 是一个最小依赖集,记FDi 为Xi→Alj,其步骤如下: ① 对 R的函数依赖集F 进行极小化处理(处理后的结果仍记为F); ② 找出不在 F 中出现的属性,将这样的属性构成一个关系模式
把这些属性从 U 中去掉,剩余的属性仍记为U; ③ 若有 X→AF,且 XA=U,则ρ ={R},算法终止; ④ 否则,对 F 按具有相同左部的原则分组(假定分为k 组),每一组函数依赖Fi 所涉及的全部属性形成一个属性集Ui
若 Ui Uj(i≠j),就去掉 Ui
由于经过了步骤②,故 kiiUU1,于是构成的一个保持函数依赖的分解
并且,每个Ri(Ui,Fi)均属于 3NF 且保持函数依赖
例 1:关系模式R,其中 U={C,T,H,I,S,G},F={CS→G,C→T,TH→I,HI→C,HS→I},将其分解成 3NF 并保持函数依赖
解:根据算法进行求解 (一)计算 F 的最小函数依赖集 ① 利用分解规则,将所有的函数依赖变成右边都是单个属性的函数依赖
由于 F 的所有函数依赖的右边都是单个属性,故不用分解
② 去掉 F 中多余的函数依赖 A.设CS→G 为冗余的函数依赖,则去掉 CS→G,得: F1={C→T,TH→I,HI→C,HS→I} 计算(CS)F1+: 设X(0)=CS 计算X(1):扫描F1 中各个函数依赖,找到左部为CS 或CS 子集的函数依赖,找到一个C→T 函数依赖
故有 X(1)=X(0)∪T=CST
计算X(2):扫描F1 中的各个函数依赖,找到左部为CST 或CST 子集的函数依赖,没有找到任何函数依