① 用分解的法则,使F中的任何一个函数依赖的右部仅含有一个属性;
② 去掉多余的函数依赖:从第一个函数依赖X→Y开始将其从F中去掉,然后在剩下的函数依赖中求X的闭包X+,看X+是否包含Y,若是,则去掉X→Y;否则不能去掉,依次做下去。直到找不到冗余的函数依赖;
③ 去掉各依赖左部多余的属性。一个一个地检查经过第②步去掉了多余依赖后的函数依赖左部非单个属性的依赖。例如XY→A,若要判Y为多余的,则以X→A代替XY→A是否等价?若A属于(X)+,则Y是多余属性,可以去掉。
对于求最小函数依赖,首先必须将右属性单一化,方便接下来的换算。接下来对于左属性的冗余判断和多余的函数依赖判断没有先后顺序,不过作为个人来说更习惯先将多余的函数依赖去掉,之后的判断多余的左属性更快。
已知R(U,F)U={a,b,c,d,e,f,g,h,i,j},F={abd->e,ab->g,b->f,c->j,cj->i,g->h }
求R(U,F)的最小函数依赖集
1.左属性单一化
F={abd->e,ab->g,b->f,c->j,cj->i,g->h};
2.去掉多余的依赖
①假设abd->e冗余,则在
F1={ab->g,b->f,c->j,cj->i,g->h} (abd)的闭包为abdgf,其中不包括e
所以abd->e不冗余
假设ab->g冗余,则在
F2={abd->e,b->f,c->j,cj->i,g->h} (ab)的闭包为abf,其中不包括g
所以ab->g不冗余
、、、、、、
同理如上,将每个依赖判断一下就能得到
F={abd->e,ab->g,b->f,c->j,cj->i,g->h}
注意:如果存在冗余的函数依赖,则将相关的函数依赖进行删除,在下面的关系判断中不能上一步出现的冗余函数依赖。
3、判断左属性的冗余
假如abd->e中的a冗余,则(bd)的闭包为bdf ,不包含e。同理的abd中不冗余。
cj->i中的c冗余,则(j)的闭包为j,不包含i;如果j冗余,则(c)的闭包为cji,包含i。所以j为冗余,改为c->i。
综上所得:F={abd->e,ab->g,b->f,c->j,c->i,g->h}