数据库——关系数据库的规范化:求解最小函数依赖集【多例题详细分步讲解,通俗易懂,看完必会!】

目录

一、什么是函数最小依赖集?

二、求解步骤

三、例题

例题1:左右属性都为单属性

例题2:出现左属性为单属性,右属性有多属性的情况

例题3:出现左属性右属性有双属性的情况

例题4:左右属性出现多属性情况


一、什么是函数最小依赖集?

所给出的函数依赖集F满足以下三点要求:

  1. F里的子集右属性为单属性
  2. F里的每个子集左属性没有多余的元素
  3. F不包含多余的函数依赖

二、求解步骤

第一步:保证函数依赖集右边属性是单属性。若不是单属性时,通过分配律去拆除右属性;

第二步:去掉函数依赖集左边多余的属性。假设F中有XY →A,则在F中求X+,判断是否A⊆X+。若A⊆X+,则Y是多余的,可删去。

第三步:去掉多余的函数依赖。设删去子集情况,求左边元素的闭包里面是否包含着右边元素,若有则表示冗余可 删、更新函数集;若无则保留,下一个。

三、例题

例题1:左右属性都为单属性

设有如下的函数依赖集F,判断是否为最小函数依赖集.

F={A →B,C →E,A →D,B →D,B →C}

[第一步:判断F集合里的子集右边是否非单属性,无,略过“拆”]

[第二步:判断子集左边是否有多余属性,无,略过此步]

[第三步:依次删去子集,判所删子集左属性闭包是否包含右属性]

  • 若删去A →B,此时F={C →E,A →D,B →D,B →C},A+={AD},不包含右属性B,保留A →B
  • 若删去C →E,此时F={A →B,A →D,B →D,B →C},C+={C},不包含右属性E,保留C →E
  • 若删去A →D,此时F={A →B,C →E,B →D,B →C},A+={ABCDE},包含右属性D,删A →D

F={A →B,C →E,B →D,B →C}

  • 若删去B →D,此时F={A →B,C →E,A →D,B →C},B+={BCE},不包含右属性D,保留B →D
  • 若删去B →C,此时F={A →B,C →E,A →D},B+={B},不包含右属性C,保留B →C

所以F2不是最小函数依赖集,Fmin={A →B,C →E,B →D,B →C}

例题2:出现左属性为单属性,右属性有多属性的情况

设有如下的函数依赖集F,求最小函数依赖集.

F={B→D,D→B,A →BD,C→BD }

[第一步:判断F集合里的子集右边是否为单属性,不全是,拆]

可转化为F={B→D,D→B,A →B,A →D,C→B , C→D}

[第二步:判断子集左边是否有多余属性,无,略过此步]

[第三步:依次删去子集,判所删左属性闭包是否包含右属性]

  • 若删去B→D,B+={B},无D属性,保留B→D
  • 若删去D→B,D+={D},无B属性,保留D→B
  • 若删去A →B,A+={ADB},包含B属性,删去A →B

F={B→D,D→B,A →D,C→B , C→D}

  • 若删去A →D,A+={A},无B属性,保留A →D
  • 若删去C→B,C+={CDB},包含B属性,删去C→B

F={B→D,D→B,A →D, C→D}

  • 若删去 C→D,C+={C},无D属性,删去 C→D

因此Fmin={B→D,D→B,A →D, C→D}

例题3:出现左属性右属性有双属性的情况

设有如下的函数依赖集F,求最小函数依赖集.

F={C →AB,A →B,B →C,A →C,BC →A}

[第一步:判断F集合里的子集右边是否为单属性,不全是,拆]

可转化为F={C →A,C →B,A →B,B →C,A →C,BC →A}


[第二步:判断子集左边是否有多余属性,有,则判断左边属性是否存在冗余的元素]

(1)对于BC →A,判断B是否是多余的,设删去B,F中依旧保留BC →A:

  • 此时F={C →A,C →B,A →B,B →C,A →C,BC →A},B+={BCA}
  • 包含A,则B是多余的,删去B得到C →A

(2)对于BC →A,判断C是否是多余的,设删去C,F中依旧保留BC →A:

  • 此时F={C →A,C →B,A →B,B →C,A →C,BC →A},C+={CAB}
  • 包含A,则C是多余的,删去C得到B →A

所以BC →A,可以变成B →A和C →A

同时C →A重复,去重,此时F={C →A,C →B,A →B,B →C,A →C,B →A}


[第三步:依次删去子集,判所删左属性闭包是否包含右属性]

  • 若删去C→A,C+={CBA},包含A属性,删去

此时F={C →B,A →B,B →C,A →C,B →A}

  • 若删去C→B,C+={C},不包含B属性,保留
  • 若删去A →B,A+={ACB},包含B属性,删去

此时F={C →B,B →C,A →C,B →A}

  • 若删去B →C,B+={BAC},包含C属性,删去

此时F={C →B,A →C,B →A}

  • 若删去A →C,A+={AB},不包含C属性,保留
  • 若删去B →A,B+={B},不包含A属性,保留

所以Fmin={C →B,A →C,B →A}

例题4:左右属性出现多属性情况

设有如下的函数依赖集F,求最小函数依赖集.

F={A→BCD,BC →DE,B→D,D→A}

[当两边属性都不是单属性时,首先第一步还是先将右边的属性拆成单属性:]

可转化为F={A→B,A→C,A→D,BC →D,BC →E,B→D,D→A}


[第二步消除左边多余的属性:]

(1)对于BC →D,判断B是否是多余的,设删去B,F中依旧保留BC →D:

  • 此时F={A→B,A→C,A→D,BC →D,BC →E,B→D,D→A},C+={C}
  • 不包含D,则B不是多余的,保留BC →D

(2)对于BC →D,判断C是否是多余的,设删去C,F中依旧保留BC →D:

  • 此时F={A→B,A→C,A→D,BC →D,BC →E,B→D,D→A},B+={BDACE}
  • 包含D,则C是多余的,删去C得到B →D

而且B→D在F中重复出现,去重,因此F={A→B,A→C,A→D,B →D,BC →E,D→A}

(3)对于BC →E,判断B是否是多余的,设删去B,F中依旧保留BC→E:

  • 此时F={A→B,A→C,A→D,B →D,BC→E,D→A},C+={C}
  • 不包含E,则B不是多余的,保留BC→E

(4)对于BC →E,判断C是否是多余的,设删去C,F中依旧保留BC→E:

  • 此时F={A→B,A→C,A→D,B →D,BC→E,D→A},B+={BDACE}
  • 包含E,则C是多余的,删去C得到B→E

此时F={A→B,A→C,A→D,B →D,B→E,D→A}


[第三步依次删去子集,判所删左属性闭包是否包含右属性]

  • 若删去A→B,A+={ACD},不包含B,保留
  • 若删去A→C,A+={ABDE},不包含C,保留
  • 若删去A→D,A+={ABCDE},包含D,删去

F={A→B,A→C,B →D,B→E,D→A}

  • 若删去B →D,B+={BE},不包含D,保留
  • 若删去B→E,B+={BDAC},不包含E,保留
  • 若删去D→A,D+={D},不包含A,保留

所以Fmin={A→B,A→C,B →D,B→E,D→A}

  • 17
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值