数据库中函数依赖
- 属性集合的闭包
假设{A1,A2,...,An}是属性集合,S是FD的集合。则S集合下的属性集合{A1,A2,...,An}的闭包是满足下面条件的属性集合B,即使得每一个满足S中所有FD的关系,也同样满足A1 A2 ... An->B。也就是说A1 A2 .... An->B能由S中的FD推断出来。属性集合{A1,A2,...,An}的闭包记为{A1,A2,...,An}+。
计算闭包的过程:从一个给定的属性集合出发,重复地扩展这个集合,只要某个FD左边的属性全部包含在这个集合中,就把此FD右边的属性也包含进去。反复使用这个方法,直到不再产生新的属性为止。最后的结果集合就是给定属性集合的闭包。
简单来说,闭包就是由一个属性集合出发,直接或间接的得到别的属性并加入到闭包中,重复地扩展这个集合,例如:f={a->b,b->c,a->d,e->f};那么可以得出b、d依赖于a,c依赖于b,从而有a可以决定b、c、d,所以a的闭包就是{a,b,c,d}。
属性集合的闭包算法:
输入:属性集合{A1,A2,...,An},FD的集合S。
输出:闭包{A1,A2,...,An}+。
方法:
1.如果必要,分解S中的FD,使每个FD的右边只有一个属性。
2.设X是属性集合,也就是闭包。首先将X初始化{A1,A2,...,An}。
3.反复寻找这样的FD:B1 B2,,,Bm->C,使得B1 B2 ... Bm在X中,而C不在X中;若找到则把C加入X,并重复这个过程。因为集合X只能增长,而任何一个关系模式中的属性都是有限的,所以最终没有任何元素能再加入X时,本步骤结束。
4.当不能再添加任何属性时,集合X就是{A1,A2,...,An}+。
- 函数依赖集的投影
假设有一个含有FD集合S的关系R通过计算R1=πL(R)得到L对其部分属性的投影。那么R1中有那些FD成立?
解决这个问题,可以通过计算函数依赖集S的投影获得。S的投影是所有满足一下吗条件的FD集合:
a)从S推断而来。b)只包含R1的属性。
由于可能存在大量的FD,而且其中有很多可能是冗余的(即其中一些FD由另一些FD推出),因此可以对它们进行简化。
函数依赖投影算法如下:
输入:关系R和通过投影R1=πL(R)计算得到的关系R1,以及在R中成立的FD的集合S。
输出:在R1中成立的FD集合。
方法:
1.令T为最终输出的FD集合,初始化T为空集。
2.对R1的属性集合的每一个子集X,计算X+。该计算依据FD集合S,可能会涉及一些在R模式中却不在R1模式中的属性。对于所有在X+中且属于R1的属性A,将所有非平凡的FD X->A添加到T中。
3.现在,T是在R1中成立的FD基本集,但可能不是最小化基本集。通过如下方法对T进行修改来构造最小化基本集。
a)如果T中的某个FD F能从T中其它FD推断出来,则从T中删除F。
b)设Y->B是T中的一个FD,Y至少有两个属性,从Y中删除一个属性并记为Z。如果Z->B能够从T中的FD(包含Y->B)推断,则使用z->B替换Y->B。
c)以各种可能的方式重复上面两个步骤,直到T不再发生变化。
通俗理解:首先计算属性集的闭包,例如{A}+为{A,B,C},如果关系R的投影R1为{A,B},则需要包含A->B,而不包含A->C。(如果存在某个属性集能够包含所有属性,那么可以不求此属性集的闭包)。类似的接着计算其余所有属性的闭包。再求最小化基本集:如果投影后某个函数依赖能够通过投影后的其他函数依赖推出,则删除;(例如:{A->C,A->B,B->C},删除A->C,因为此函数依赖能够通过其他函数依赖推导)。如果某个函数依赖A->B,删除A中某个属性后仍然在投影的函数依赖中成立,则删除。(投影后的函数依赖为{AC->B,A->B},则把{AC->B}删除,因为如果删除C即A->B 能够从投影的函数依赖中推出)。
欢迎转载,转载时请在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具