最小函数依赖求解

最小函数依赖解法总结

考研复试要学习数据库,数据库里面好多算法和知识点单看教科书很难理解,然后我就结合网上的博客和课本(数据库系统概论)对一些常考算法做一些总结,欢迎各位批评指正。

最小函数依赖集概念:如果函数依赖集F满足下列条件,则称F为一个极小函数依赖集。

  1. F中任意函数依赖的右部仅含有一个属性。
  2. F中不存在这样的函数依赖 XA ,使得FF{XA} 等价。意思就是XA是不可或缺的。
  3. F中不存在这样的函数依赖XA ,X有真子集Z使得F{XA}{ZA}F等价。意思就是X中没有多余的元素。

最小依赖集的求法:

  1. 逐一检查F中各函数依赖FDi:XY ,若Y=A1A2.......Ak,k2 则用 {XAj|j=1,2,.......,k} 来去带XY。通过这个算法我们要F中的函数依赖的右属性全部拆为单个属性。经过这一步算法F变为F1
  2. 逐一检查F1中各函数依赖F1Di:XA ,令G=F1{XA} ,若AXG+ ,则从F1 中去掉此函数依赖。我们检查F1 中的每个函数依赖:XAF1 中去掉此函数依赖得到函数依赖集G然后在求X关于G的属性闭包得到XG+ 如果A属于该属性闭包则删掉次函数依赖。经过这一步算法F1 变为F2 。注意在求解的过程中F是动态变化的。
  3. 逐一取出F2 中各函数依赖F2DiXA,设X=B1B2........Bm,m2, 逐一考察Bi(i=1,2,..,m) ,若A(XBi)F+2 ,则以XBi 这一步我们要检查F2中的所有左属性,将左属性化成最简。一定要注意在求解的过程中F2 是不变的。经过这一步如果F2 相对于F1 发生了变化,则转为步骤2在计算一次。

例题:

R(U,F)U={A,B,C,D,E,G},F={BD,DGC,BDE,AGB,ADGBC} 求最小依赖集。

  1. 执行第一步将F中的所有函数依赖的右属性拆成单个属性,例如:ADGBC,ADGBADGC 拆分后F={BD,DGC,BDE,AGB,ADGB,ADGC}

  2. 执行第二部算法检查每一个函数依赖。

    检查BD : G=F{BD}={DGC,BDE,AGB,ADGB,ADGC} .然后求B关于G的属性闭包BG+={B}其中不包含D不用删掉

    检查DGC : G={BD,BDE,AGB,ADGB,ADGC} , (DG)G+={D,G} 不包含C不删。

    检查BDE :G={BD,DGC,AGB,ADGB,ADGC} , (BD)G+={B,D} 不包含E不删。

    检查AGB :G={BD,DGC,BDE,ADGB,ADGC} , (AG)G+={A,G} 不包含B不删。

    检查ADGB : G={BD,DGC,BDE,AGB,ADGC} , (ADG)G+={A,D,G,B,C,E} 包含B删掉。

    检查ADGC : G={BD,DGC,BDE,AGB} , (ADG)G+={A,D,G,B,C,E} 包含C删掉。

    经过第二步算法的计算F={BD,DGC,BDE,AGB} .

    上述步骤中F是动态变化的。

  3. 执行第三步检查每一个函数依赖的左属性:

    检查DGC : 先去掉D即为GC GF+={G} 不包含C留D,在去掉G, DC DF+={D}

    检查BDE : 去掉B,DE DF+={D} 不包含E留B,去掉D, BE BF+={B,D,E} 含E,去掉D。

    检查AGB :去掉A, GB , GF+=G 不好含B,留,去掉G,AB AF+={A} 不包含B,留。

    注意第三步算法中的F都是第二步算法计算出来的F,是不变的,最后才去掉的

  4. F={BD,DGC,BE,AGB} 发生了变化,在计算一遍步骤2.

    检查BD: G={DGC,BE,AGB} .(B)G+={B,E} 不包含D,留

    检查DGC:G={BD,BE,AGB}.(DG)G+={D,G} 不包含C,留

    检查BE:G={BD,DGC,AGB} .(B)G+={B,D} 不包含E,留

    检查AGB:G={BD,DGC,BE} . (AG)G+={AG} 不包含B,留

经过以上3步算法最终可得到最小函数依赖F={BD,DGC,BE,AGB}

posted on   翔鸽  阅读(677)  评论(0编辑  收藏  举报

编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示