求最小函数依赖集:求候选键(例题讲解)超详细,易理解

在关系R<U,F>中,U=ABCDEG

F={BG->C,BD->E,DG->C,ADG->BC,AG->B,B->D}

先进行第一大步:

先看右边

如果有BG->C,G-->C,因为单G就可以推出C了就不需要BG--->C了,可以把BG--->C这个冗余的去掉,根据F中的关系,没有此项,就可以跳过此步。

再看中间

第一个:BG--->C以外的推导式能否推出BG--->C

G=F-(BG-->C)=BD-->E,DG-->C,ADG-->C,AG-->B,B-->D

注:若BG为x0,则x1表示能从BG推出来的字母...

x0=BG(G+)     x1=BG+D=BGD     x2=BGD+EC=BCDEG   x3=BCDEG   推不出新字母了,停止

我们发现BCDEG中包含C,所以BG---->C冗余

第二个:BD-->E同理

G=F-(BD-->E)=DG-->C,ADG-->C,AG--->B,B--->D

x0=BD(G+)    x1=BD+D=BD    停止

BD中不包含E,不能将此推导式删除 

第三个:DG-->C

F=BD→E,DG→C,ADG→C,AG→B,B→D
G=F-(DG→C)=BD→E,ADG-->C,AG→B,B→D
x0=DG(G+)     x1=DG+NULL=x0  停止

DG中不包含C,不能将此推导式删除

以此类推得到以下推导式不能删除:
F=BD→E,DG→C,AG→B,B→D

所以F={BD→E,DG→C,AG→B,B→D}

现在进行第二大步:

再进行逐个细化:

BD--->E

先划掉B,则x0=D    x1=D

再划掉D,则x0=B,x1=BD,x2=BDE,发现包含E,所以删除B-->E(单独的D就能推出E,不需要B了)

所以F={D--->E,DG--->C,AG--->B,B--->D}

DG-->C同理

先划去D,x0=G,x1=G

再划掉G  x0=D,x1=D

以此类推得到F={D--->E,DG--->C,AG--->B,B--->D}

R1(DE),R2(DGC),R3(AGB),R4(BD)

重复以上第一大步和第二大步,直到无法删除任意一个字母

根据F找候选码:(重点)

1.如果这个属性只在左端出现了,那么必定是候选码(即候选码至少要包含A,G)

2.如果这个属性只在右端出现了,那么必定不是候选码

3.如果属性在两端出现了,那么是后备(如果主属性A,G足以推出全局,那么候选键就是A,G,如果不能,那么就在后备中找,一个一个试,看能否推出全集)

4.还有两端都不在的字母 

具体做法如下:

设定只在左端为L,只在右端为R,既在左端又在右端为LR,两端都不在N

令X=L \bigcup N,求X的闭包

1.如果包含了R的所有属性,那么X为R的唯一候选键。

2.如果没有包含,那么从后备,即两端都有的字母中加入候选键一个一个试

接上面的例子:F={D--->E,DG--->C,AG-->B,B--->D}

x0=L \bigcup N=AG    x1=AG+B=AGB    x2=AGB+D=ABGD   x3=ABGD+EC=ABCDEG=U

AG(F+)=U:AG在F上的闭包=全集U,所以AG是候选码

再来几个例题:

例1:

设关系模式R(ABCD)

F={AB-->C,C-->A,C--->D}

L=B,R=D,LR=A,C,N=空集

x0=L \bigcup N=B       x1=B,不等于U

从后备(两端都有的字母)选:

先选择A

x0=AB      x1=ABCD,等于U

再选择C

x0=BC     x1=ABCD,等于U

所以候选键是AB,AC

例2:

F={A-->BC,C-->AD}

L=空集,R={B,D}  LR={A,C}

x0=A    x1=ABCD  ,等于U

x0=C    x1=ABCD,等于U

所以候选键是A,C

例3:

关系模式R{A,B,C,D,E,F,G},函数依赖F={A--->BC,BC--->A,BCD--->EF,E--->C},求R的候选键

L={D}    R={F}   LR={A,B,C,E}    N={G}

x0=DG       x1=DG,不等于U

先从LR中选择一个字母:

A      x0=ADG   x1=ADGBCEF=U    所以候选键可以是A D G

B      x0=BDG   x1=BDG,不等于U

C      x0=CDG  x1=CDG,不等于U

E       x0=EDG  x1=EDGC,不等于U

注意A一定要划去(因为只要两个字母中有1个A,那么就冗余了,ADG就能推出U),现在选2个

BC    x0=BCDG     x1=BCDGAE=U     所以BCDG是候选键

BE     x0=BEDG    x1=BEDGCAF=U    所以BEDG是候选键

CE      x0=CEDG    x1=CEDG,不等于U

所以候选键是ADG,BCDG,BEDG

补充:这里一定要区分主属性和候选码:

1.候选码的定义:如果关系中的某一属性组的值能唯一地标识一个元组,则称该属性组为候选码;

2.主码的定义:如果一个关系有多个候选码,则选定其中一个为主码;

3.主属性定义:候选码中的属性称为主属性;

4.非主属性定义:不包含在任何候选码中的属性称为非主属性;

补充:

1.将这个属性集的依赖关系规范为三范式:F={D--->E,DG--->C,AG-->B,B--->D}

由上面解析可得AG是候选码

对于范式我这里不细讲,如果不清楚可以看:http://t.csdnimg.cn/ESaCg

U1=AGB(F=AG--->B)

U2=BDE(F=BD-->E,B-->D)

U3=CDG(F=DG---C)

分解成这样,才能既没有部分依赖也没有传递依赖。

2.将属性集规范为第二范式:

F={AB->CD,A->D},按照上述方法得到候选码是AB,那么D就存在部分依赖

那么将R分解为

R1=(AD)  R2=(ABC)

F1={A->D}    F2={A->BC},这样R1和R2符合第二范式

对于如何分解到BCNF范式,因为较复杂,我会另外写一篇文章记录,敬请关注一下下💖💖💖

http://t.csdnimg.cn/jK71R

  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值