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

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

在关系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)=BC-->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


所以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  N,求X的闭包


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

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

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


x0=L  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  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    所以候选键可以是ADG


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


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


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


注意A一定要划去,现在选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.csdn.cn/79MwB


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范式,因为较复杂,我会另外写一篇文章记录,敬请关注一下下💖💖💖

目录
相关文章
|
6月前
|
机器学习/深度学习 算法 测试技术
【状态压缩 并集查找 图论】2157. 字符串分组
【状态压缩 并集查找 图论】2157. 字符串分组
【状态压缩 并集查找 图论】2157. 字符串分组
【Leetcode -643.子数组最大平均值Ⅰ -645.错误的集合】
【Leetcode -643.子数组最大平均值Ⅰ -645.错误的集合】
52 0
|
6月前
|
算法 测试技术 C#
【键值皆有序map 线段树 数学 】100240. 最小化曼哈顿距离
【键值皆有序map 线段树 数学 】100240. 最小化曼哈顿距离
【集合论】序关系 ( 偏序集元素之间的关系 | 可比 | 严格小于 | 覆盖 | 哈斯图 )
【集合论】序关系 ( 偏序集元素之间的关系 | 可比 | 严格小于 | 覆盖 | 哈斯图 )
431 0
【集合论】序关系 ( 偏序集元素之间的关系 | 可比 | 严格小于 | 覆盖 | 哈斯图 )
|
存储
【每日一题Day90】LC1814统计一个数组中好对子的数目 | 哈希表
思路:如果两个数满足好对子,那么这两个数反转后的变化量相同。因此可以使用哈希表存放反转后的变化量及其次数count,该变化量存在的所有好对子个数为count∗(count−1)/2
72 0
|
存储 算法
四式解决回溯算法:组合+组合总和
给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。你可以按 任何顺序 返回答案。 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。
692 3
|
存储 算法 容器
Leetcode 76最小覆盖子串&77组合&78子集
给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。
118 0
Leetcode 76最小覆盖子串&77组合&78子集
【组合数学】生成函数 ( 正整数拆分 | 无序不重复拆分示例 )
【组合数学】生成函数 ( 正整数拆分 | 无序不重复拆分示例 )
323 0
|
机器学习/深度学习 移动开发
【组合数学】排列组合 ( 集合排列、分步处理示例 )
【组合数学】排列组合 ( 集合排列、分步处理示例 )
186 0