计算最小函数依赖集示例
- 格式:docx
- 大小:35.00 KB
- 文档页数:5
三步法求最小函数依赖集乐乐等待花开总结一、首先要清楚最小函数依赖集的是什么?1.定义定义::如果函数依赖集F 满足(1)F 中任一函数依赖的右部仅含一个属性中任一函数依赖的右部仅含一个属性;;(2)F 中不存在这样的函数依赖X →A ,使得F 与F -{X →A}等价;(3)F 中不存在这样的函数依赖X →A ,X 有真子集Z 使得F 与F -{X →A}∪{Z →A}等价。
2.定义分析:(1)每个函数依赖右边都仅含一个属性每个函数依赖右边都仅含一个属性,,例如对于函数依例如对于函数依赖赖A →B,B,C C 应该分解应该分解为为A →B,A →C ;(2)判断每一个依赖是否多余,若F 与F -{X →A}等价,则X →A 为多余依赖;(3)判断A 的子集里边有没有多余属性,若F 与F -{X →A}U{Z →A}等价,则子集Z 多余多余。
二、要知道什么是闭包1.闭包定义闭包定义::设F 为属性集U 上的一组函数依赖上的一组函数依赖,,X ,Y 都包含于U ,X F +={A|={A|XX →A 可以F 根据Armstrong 公理导出},则X F +称为X 关于属性依赖集F 的闭包。
2.举例说明:求属性集X (X 包含于U )关于U 上的函数依赖集F 的闭包X F +,已知关系模式R<U,F>其中U={A,B,C,D,E};F={AB →C,B C,B→→D,C D,C→→E,EC E,EC→→B,AC B,AC→→B },求(AB)F +。
解析:分步进行①设X (0)=AB ;②X (1)={左边为AB 及其子集的函数依赖集的右边属性},则X (1)=AB ∪C ∪D=ABCD,又因又因为为ABCD 不等于全集U ,所以继续执行下一步,否则此时的X (1)就是AB 在F 上的闭包上的闭包;;③同②中求法,得到X (2)=ABCD ∪E=ABCDE=U ,所以不用继续往下求了,此时X (2)就是AB 在F 上的闭包。
求最小函数依赖集例题最小函数依赖集是指在关系模式中,能够唯一确定所有属性的最小集合。
为了求最小函数依赖集,我们需要先了解函数依赖的概念。
函数依赖是指在关系模式R中,给定一个关系模式的属性集合X,如果对于X的任意两个元组t1和t2来说,如果t1和t2在属性集合X 的取值相同,那么它们在关系模式的其他属性集合Y上的取值也相同。
这种情况下,我们称Y函数依赖于X,用X -> Y表示。
举个例子来说,假设我们有一个关系模式R(A, B, C),其中A是关系模式的候选键。
如果我们观察到属性集合A的取值能够唯一确定属性集合B的取值,那么我们可以说B函数依赖于A,用A -> B表示。
同样地,如果属性集合A的取值能够唯一确定属性集合C的取值,我们可以说C函数依赖于A,用A -> C表示。
现在我们来解决一个求最小函数依赖集的例题。
假设我们有一个关系模式R(A, B, C, D, E),其中A是候选键。
根据已给的函数依赖集如下:1. A -> B2. A -> C3. BC -> D4. D -> E我们的目标是找出最小函数依赖集。
首先,我们来看一下函数依赖集1和2。
由于A是候选键,并且A能够唯一确定B和C的取值,所以函数依赖集1和2是必要的。
接下来,我们看一下函数依赖集3。
根据函数依赖集3,BC能够唯一确定D的取值。
然而,我们注意到函数依赖集3可以通过分解成两个函数依赖集来表示:B -> D和C -> D。
因此,函数依赖集3不是必要的。
最后,我们来看一下函数依赖集4。
根据函数依赖集4,D能够唯一确定E的取值。
我们可以发现函数依赖集4是必要的。
综上所述,最小函数依赖集为:1. A -> B2. A -> C3. B -> D4. C -> D5. D -> E这样,我们就得到了最小函数依赖集。
在数据库设计中,最小函数依赖集对于避免数据冗余和保持数据一致性非常重要。
python数据库最小函数依赖集在数据库设计中,函数依赖是一种重要的概念,用于描述属性之间的关系。
最小函数依赖集是指在数据库关系中,能够唯一确定其他属性的最小属性集合。
在本文中,我们将探讨Python数据库最小函数依赖集的相关知识。
在数据库中,关系模式通常由属性组成,这些属性之间存在一定的函数依赖关系。
函数依赖可以分为完全函数依赖、部分函数依赖和传递函数依赖等不同类型。
而最小函数依赖集则是指在一个关系中,能够唯一确定其他属性的最小属性集合。
在Python中,我们可以使用第三方库来进行数据库设计和操作,比如使用SQLAlchemy库可以方便地进行数据库表的创建和操作。
在设计数据库表时,我们需要考虑属性之间的函数依赖关系,以确保数据的完整性和一致性。
为了找到数据库表中的最小函数依赖集,我们可以通过分析属性之间的关系来确定。
首先,我们需要找出所有的函数依赖关系,然后逐步排除冗余的属性,直到找到最小的函数依赖集为止。
举个例子来说,假设有一个学生信息表,包含学生ID、姓名、年龄和性别等属性。
在这个表中,如果我们知道学生ID就可以唯一确定学生的姓名,那么学生ID->姓名就是一个函数依赖关系。
而如果知道学生ID和姓名就可以确定学生的年龄,那么学生ID、姓名->年龄就是另一个函数依赖关系。
通过分析这些函数依赖关系,我们可以找到最小函数依赖集,即学生ID->姓名、学生ID、姓名->年龄。
在Python中,我们可以编写程序来自动化地找到数据库表中的最小函数依赖集。
通过读取数据库表的结构,分析属性之间的关系,然后排除冗余的属性,最终得到最小函数依赖集。
这样可以提高数据库设计的效率,减少人工错误的可能性。
总的来说,最小函数依赖集在数据库设计中起着重要的作用,能够帮助我们准确地描述属性之间的关系,确保数据的完整性和一致性。
在Python中,我们可以通过分析属性之间的函数依赖关系,找到最小函数依赖集,从而优化数据库设计和操作。
最小函数依赖最小函数依赖(MinimumFunctionalDependencies,MFDs)是数据库理论中最重要的概念之一,它主要用于描述一个表里不同属性间的依赖关系。
换句话说,最小函数依赖能够描述一个表里的属性是如何联系起来的。
最小函数依赖的定义引入了一个表里的任何属性X,其他属性Y的值依赖于X的值,即X->Y。
而且这里的依赖是根据最小原则来定义的,即Y只能有一个属性X。
最小函数依赖的概念在关系数据库设计中起着非常重要的作用,它不仅能帮助我们正确地设计关系型数据库,还能帮助我们确定哪些属性是主键,也能帮助我们更好地理解属性之间的一对多(one-to-many)和多对多(many-to-many)的关系。
首先,最小函数依赖能够帮助我们设计合理的关系型数据库。
通过描述属性之间的依赖关系,我们不但可以把握准确的数据结构,还可以避免出现重复数据,从而大大提高数据库的可维护性。
其次,最小函数依赖也能帮助我们确定主键。
通过MFD的定义,我们可以明确一个表中的属性X能唯一确定其他属性Y,这样X就能作为主键,而Y可以看作其联系属性。
最后,最小函数依赖也能够帮助我们更好地理解属性之间的一对多(one-to-many)和多对多(many-to-many)的关系。
通过MFD的定义,我们可以将复杂的关系简单化,有效地解决类似“一对多”和“多对一”等关系中属性之间的对应问题。
总之,最小函数依赖是数据库理论中最重要的概念之一,它在关系数据库设计中的作用十分重要,能够帮助我们正确地设计关系型数据库,还可以帮助我们确定哪些属性是主键,更好地理解属性之间的一对多(one-to-many)和多对多(many-to-many)的关系。
最小函数依赖的概念和作用不仅仅是非常重要的,它也为数据库设计提供了理论基础,在实际应用中也非常有用。
计算最小函数依赖集示例举例:已知关系模式R<U,F>,U={A,B,C,D,E,G},F={AB→C,D→EG,C→A,BE→C,BC→D,CG→BD,ACD→B,CE→AG},求F的最小函数依赖集。
解:利用算法求解,使得其满足三个条件①利用分解规则,将所有的函数依赖变成右边都是单个属性的函数依赖,得F为:F={AB→C,D→E,D→G,C→A,BE→C,BC→D,CG→B,CG→D,ACD→B,CE→A,CE→G}②去掉F中多余的函数依赖。
A.设AB→C为冗余的函数依赖,则去掉AB→C,得:F1={D→E,D→G,C→A,BE→C,BC→D,CG→B,CG→D,ACD→B,CE→A,CE→G}计算(AB)F1+:设X(0)=AB计算X(1):扫描F1中各个函数依赖,找到左部为AB或AB子集的函数依赖,因为找不到这样的函数依赖。
故有X(1)=X(0)=AB,算法终止。
(AB)F1+= AB不包含C,故AB→C不是冗余的函数依赖,不能从F1中去掉。
B.设CG→B为冗余的函数依赖,则去掉CG→B,得:F2={AB→C,D→E,D→G,C→A,BE→C,BC→D,CG→D,ACD→B,CE→A,CE→G}计算(CG)F2+:设X(0)=CG计算X(1):扫描F2中的各个函数依赖,找到左部为CG或CG子集的函数依赖,得到一个C→A函数依赖。
故有X(1)=X(0)∪A=CGA=ACG。
计算X(2):扫描F2中的各个函数依赖,找到左部为ACG或ACG子集的函数依赖,得到一个CG→D函数依赖。
故有X(2)=X(1)∪D=ACDG。
计算X(3):扫描F2中的各个函数依赖,找到左部为ACDG或ACDG子集的函数依赖,得到两个ACD→B和D→E函数依赖。
故有X(3)=X(2)∪BE=ABCDEG,因为X(3)=U,算法终止。
(CG)F2+=ABCDEG包含B,故CG→B是冗余的函数依赖,从F2中去掉。
C.设CG→D为冗余的函数依赖,则去掉CG→D,得:F3={AB→C,D→E,D→G,C→A,BE→C,BC→D,ACD→B,CE→A,CE→G}计算(CG)F3+:设X(0)=CG计算X(1):扫描F3中的各个函数依赖,找到左部为CG或CG子集的函数依赖,得到一个C→A函数依赖。
函数依赖集这里,我想从函数依赖性质谈起。
从函数依赖的定义我们可以知道,一个函数在A上有依赖关系的话,那么它在B上也必定有依赖关系,就像两个多面体的棱互相依靠一样。
如果把这种函数依赖的现象叫做函数依赖性质的话,我认为是恰当不过的了。
但我要纠正一下,函数依赖性质并不是说函数具有依赖性质就叫函数依赖性质,函数依赖性质也不能保证函数在其他集合上也存在依赖性质,只能说明函数在A和B上都有依赖关系。
考虑一个由三元组构成的集合,其中每一个元素分别是三个函数的定义域,则该集合是否满足函数依赖呢?我们来看看下面的集合:①=0;② =1;③=2;④=3。
那么,以上四个集合中的函数是否满足函数依赖呢?我们来看看下面的集合:①=1;②=2;③=4;④=5。
那么,以上四个集合中的函数是否满足函数依赖呢?答案肯定是否定的。
因为函数依赖性质并不是说函数在其他集合上也存在依赖性质,而仅仅是说函数在这两个集合上都有依赖性质。
上面两个集合中的函数虽然在第三个集合中满足函数依赖性质,但是却在第二个集合中不满足函数依赖性质。
我认为,函数依赖性质应该指出在这些集合中某个集合中的函数,必须满足这个集合中的函数才能满足函数依赖性质。
也就是说,函数依赖性质是指出在A和B中都有函数依赖关系的时候,一定在A中和B中都存在这个函数依赖关系,并不需要再去说明这个函数在A和B上都有依赖性质。
(1)(3)(一)。
在A中的满足函数依赖性质的数有4个:x=x^3;y=y^3;z=z^3;则它们分别在A的四个象限中。
例:两个函数a、 b,若a可导则b也可导,如果a和b分别可导且分别连续,那么一定也可导,这种函数称为无穷依赖;如果a和b同时可导,则称a和b为无穷连续,如果a和b可导且不连续,那么称a和b为无穷间断。
其实函数依赖的重点不在于有无依赖性,而在于函数在依赖的集合中是否存在。
对于这样的集合,可以用排除法。
可以用函数a-1=1代入集合:(2)(1)。
得到函数y=1^3, x=0;可以用函数b-1=-2代入集合:(3)(1)。
数据库函数依赖例题数据库函数依赖是数据库系统中一个非常重要的概念,它可以帮助设计更有效率的数据库系统。
按照函数依赖理论,一个关系可以被定义为一组属性和一组函数依赖,函数依赖被定义为当函数f(X)= f(Y)时,X 与 Y 之间存在函数依赖。
本文档将用一个例题来讨论函数依赖,并讨论它在数据库设计中的重要性以及如何用来提高数据库的有效性。
二、例题一个数据库系统中有一张表,表名为“学生”,它有两个属性:学号(K)和姓名(N),每个学生都有一个唯一的学号,姓名不能相同。
假定这里有两个函数:f1(K)= N f2(N)= K,即学号与姓名之间有一种函数依赖,即学号可以确定一个学生的姓名,而姓名也可以确定一个学生的学号。
三、函数依赖的意义函数依赖的意义很重要,它是用来定义数据库系统的结构以及表之间的关系的一个非常有用的概念。
函数依赖可以帮助用户限制数据库管理系统中的信息流。
正确的函数依赖关系可以有效地减少冗余的数据,还可以帮助更容易地识别数据库之间的内在关系,更快地完成查询等功能。
四、函数依赖的重要性函数依赖有助于更好地设计数据库,可以减少数据库中的冗余数据,确保数据的一致性。
函数依赖还可以使数据库更加规范,减少记录和表之间的关系,帮助数据库管理者实现最佳化,并且帮助用户实现最佳数据库设计。
五、实现函数依赖的方法函数依赖的实现方法有很多,比如解决视图和查询优化的方法以及属性拆分的方法,采用属性拆分的方法可以更有效地实现函数依赖,将一个属性拆分成多个属性,这样就可以增加函数依赖,并有效地减少数据冗余。
另外,还可以使用视图和查询优化的方法,可以有效地改善现有的查询,减少冗余数据的产生。
六、结论数据库函数依赖是一个非常重要的概念,函数依赖能够有效地管理数据库,减少数据冗余。
它能够让数据库更加规范,帮助提高数据库的有效性。
通过使用属性拆分的方法和视图和查询优化的方法,可以有效地实现数据库函数依赖,最终达到比较理想的效果。
函数依赖(理论及举例)教你如何理解函数依赖一、函数依赖的概念函数依赖:函数依赖就是讨论一个数据表(关系)中属性值之间所存在的函数关系。
函数是一种数学中的概念,被引入到数据库中对数据的联系进行分析。
在一个关系中,属性相当于数学上的变量,属性的域相当于变量的取值范围,属性在一个元组上的取值相当于属性变量的当前值。
例如:在下面的这个职工关系中,职工号、姓名、性别、年龄、职务等属性都相当于变量;职工号属性的域,即四位十进制数字,就是取值范围,性别属性的域:{男、女},就是性别属性的取值范围。
此关系中包含有6个元组,如第2个元组为{3051、刘平、男、48、副处},其中的每个属性值都是对应属性在该元组上的当前值。
单值函数和多值函数:元组中一个属性或一些属性值对另一个属性值的影响相当于自变量值对函数值的影响。
当给定一个自变量值能求出唯一的一个函数值时,称此为单值函数或单映射函数,否则为多值函数。
在单值函数中由自变量的一个值确定函数的一个值,但不同的自变量值允许具有相同的函数值。
如f(x)=2x, f(n)=(-1)^n, f(x)=x^3+1等都是单值函数,由自变量x或n的值能够唯一确定f(x)或f(n)的值。
属性的单值函数决定(依赖):在一个关系中,若一个或一组属性的值对另一个或一组属性值起到决定性的作用,则称为单值函数决定(依赖)。
如上表中职工号的值就能够函数决定其余每个属性的值,也就是说,当职工号给定后,其他每个属性的值就跟着唯一地确定了。
如假定职工号为3074,则他的姓名必定是王海,性别必定为男,年龄必定为32岁,职务必定为正科。
这就叫做职工号能够分别单值函数决定姓名、性别和年龄属性,反过来,可以说姓名、性别和年龄等属性单值函数依赖于职工号属性。
二、函数依赖的定义定义:设一个关系为R(U),X和Y为属性集U上的子集,若对于X上的每个值都有Y上的一个唯一值与之对应,则称X和Y具有函数依赖关系,并称X 函数决定Y,或称Y函数依赖于X,记作X→Y,称X为决定因素。
最小函数依赖集Fm的求法:1.根据分解规则,将函数依赖的右端分解成单个属性2.对于F中的每个函数X→A,设G=F-{X→A},如果A∈X G+,则将X→A从中删除,否则保留。
3.对于F中每一个左端包含多个属性的X→A,选择X的每个子集Z,如果A∈Z F+,则用Z→A代替X→A。
例如:F={BE→G,BD→G,CDE→AB,CD→A,CE→G,BC→A,B→D,C→D}求Fm。
解:1)右端分解成单个属性F={BE→G,BD→G,CDE→A, CDE→B,CD→A,CE→G,BC→A,B→D,C →D}2)设G=F-{X→A},如果A∈X G+,则将X→A删除,否则保留(1)G=F-{ BE→G }={BD→G,CDE→A, CDE→B,CD→A,CE→G,BC →A,B→D,C→D},则(BE)G+=BEDG,包含G,则删除。
(2)G=F-{BD→G, }={ CDE→A, CDE→B,CD→A,CE→G,BC→A,B →D,C→D},则(BD)G+=BD,不包含G,则保留。
(3)G=F-{CDE→A}={ BD→G, CDE→B,CD→A,CE→G,BC→A,B →D,C→D},则(CDE)G+= CDEBGA,包含A,则删除。
(4)G=F-{CDE→B}={ BD→G, CD→A,CE→G,BC→A,B→D,C→D},则(CDE)G+= CDEAG,不包含B,则保留。
(4)G=F-{CD→A,}={ BD→G, CDE→B,CE→G,BC→A,B→D,C→D},则(CD)G+= CD,不包含A,则保留。
(5)G=F-{ CE→G,}={ BD→G, CDE→B,CD→A, BC→A,B→D,C →D},则(CE)G+= CEDBAG,包含G,则删除。
(5)G=F-{ BC→A,}={ BD→G, CDE→B,CD→A, B→D,C→D},则(BC)G+= BCDGA,包含A,则删除。
(6)G=F-{ B→D,}={ BD→G, CDE→B,CD→A, C→D},则(B)G+= B,不包含D,则保留。
关系模式R(U,F)中,U=ABCDEG,F={B->D,DG->C,BD->E,AG->B,ADG->BC} 求F的最小函数依赖集方法如下:1.根据分解规则,将函数依赖的右端分解成单个属性该题目的话要将:BC分解成单个属性。
F={ADG->B,ADG->C,······}2.对于F中的每个函数X->A,设G=F-{X->A},如果A属于X的闭包,则将X->A从中删除,否则保留。
该题目:1)G=F-{B->D},则B的闭包={B},包不含D,则保留2)G=F-{DG->C},则DG的闭包={DG},不包含C,则保留3)G=F-{BD->E},则BD的闭包={BD},不包含E,则保留4)G=F-{AG->B},则AG的闭包={AG},不包含B,则保留5)G=F-{ADG->B},则ADG的闭包={ADGBCE},包含B,则删除6)G=F-{ADG->C},则ADG的闭包={ADGBCE},包含C,则删除F={B->D,DG->C,BD->E,AG->B}R(U, F),U=ABCDEF, F={AD→E, AC→E, BC→F, BCD→AF, BD→A, AB→F, A→C}求最小函数依赖集答案是:分解右部为属性组的函数依赖,得F={AD→E,AC→E,BC→F,BCD→A,BCD→F,BD→A,AB→F,A→C}对于AD→E,∵(AD)的闭包=ADCE, 又∵E不属于ACDE∴AD→E 冗余对于AC→E,∵(AC)的闭包=AC,又∵E不属于AC,∴AC→E不冗余对于BC→F,∵(BC)的闭包=BC,又∵F不属于BC,∴BC→F 不冗余对于BCD→A,∵(BCD)的闭包=ABCDEF,又∵A不属于ABCDEF ∴BCD→A 冗余对于BCD→F,∵(BCD)的闭包=ABCDEF,又∵F不属于ABCDEF ∴BCD→F 冗余对于BD→A,∵(BD)的闭包=BD,又∵A不属于BD,∴BD→A 不冗余对于AB→F,∵(AB)的闭包=ABCDEF,又∵F属于ABCDEF ∵AB→F 冗余对于A→C,∵A的闭包=A,又∵C不属于A,∴A→C 不冗余∴F的最小函数依赖集为{AC→E,BC→F,BD→A,A→C}。
基本函数依赖集基本函数依赖集是关系模式基本性质之一,它描述了一个关系模式中一组属性的“函数依赖关系”,并允许通过移除非关键属性减少数据冗余和提高数据查询效率。
关系模式中的每个属性都由其名称和数据类型定义,如果我们有一个关系模式(或表)R(A1, A2, …, An),其中Ai是属性名称,那么我们可以表达出该关系模式中属性之间的函数依赖关系。
例如,我们可以表示函数依赖集为{A1->A2, A2->A3, A1->A4}。
在这个例子中,关系模式R的属性A2依赖于属性A1,属性A3依赖于属性A2,属性A4依赖于属性A1。
这些依赖关系对于理解关系模式中属性之间的相互作用至关重要,并且为设计良好的数据库提供了基础。
基本函数依赖集指的是,如果一个关系模式R的多个属性Ai和Aj具有函数依赖关系Ai->Aj,则称Ai是一个“决定性属性”,Aj是“被决定性属性”。
基本函数依赖集是最小函数依赖集,其中包含了关系模式中所有的决定性属性,并且这些属性是“不可分解”的。
例如,对于关系模式R(A1, A2, …, An),如果存在基本函数依赖集为{A1->A2, A2->A3, A1->A4},那么:1. 属性A1是一个决定性属性,因为它能够唯一确定属性A2和属性A4的值。
1. 它包含关系模式中所有的决定性属性。
2. 每一个非决定性属性都能够由一个或多个决定性属性唯一确定,并且这些决定性属性不能再分解。
基本函数依赖集被广泛应用于数据库的设计和优化中。
在关系模式中,很多属性之间都存在函数依赖关系,当我们对这些函数依赖关系进行分析时,可以找到一些能够唯一确定其他属性的属性,通过这些属性的选择,可以减少数据冗余和提高查询效率,从而优化数据库设计。
保持函数依赖算法的例子以下是 6 条关于保持函数依赖算法的例子:1. 你知道在安排课程表的时候吗?这就好像给不同颜色的珠子按顺序串起来,每门课都有它特定的位置和依赖关系,就像数学和物理,学了数学很多知识才能更好地理解物理,这就是一种保持函数依赖。
比如说,要是先安排物理课,没有数学基础那怎么能行呢?那可就乱套啦!2. 想象一下装修房子,你得先搞定水电布局,才能去弄墙面和地板呀!这和保持函数依赖算法多像呀!就好比水电布局就是那个基础,墙面和地板就是依赖它的部分。
如果乱了顺序,那不是糟糕透顶啦?就像你先铺地板再弄水电,那得费多大劲去改造啊!3. 网购的时候,你得先选好商品,然后填写地址,最后支付,这一系列流程就是保持函数依赖呀!选好商品不就是那个关键的源头嘛,地址是后续依赖它的,支付又是依赖前面那些环节的。
如果顺序乱了,哎呀,那还不得出大乱子啊!难道不是吗?4. 好比做一顿丰盛的大餐,你得先准备食材吧,然后再烹饪,最后才能装盘上桌。
这食材就像是保持函数依赖里的基础,烹饪是依赖它的步骤,装盘又是在烹饪之后。
要是先装盘再准备食材,这能叫做饭吗?这不是太荒唐了嘛!5. 去旅行规划行程的时候也是一样呀!你得先确定目的地,再去考虑交通方式和住宿安排。
目的地就是那个起头的,后面的都是依赖它的。
难道有人会先想好住哪里再决定去哪里旅行吗?那不是搞笑嘛!这可不就是保持函数依赖算法的生动体现嘛!6. 要是在公司安排工作任务,也得遵循保持函数依赖呀!先有大目标,然后分解为具体的步骤,每个步骤之间都有相互的依赖关系。
比如要完成一个项目,得先做调研,再做设计,最后才是实施。
如果跳过调研直接实施,那结果会怎样?肯定一塌糊涂呀!我觉得保持函数依赖算法真的特别重要,它让事情变得有序、合理,不然真的会乱成一团麻!。
极小函数依赖
极小函数依赖是指在关系模式中,存在一个或多个属性集合 X,满足以下两个条件:
1. X 是候选键(即唯一标识关系中元组的属性集合)或超键(即包含候选键的属性集合)的真子集。
2. 对于 X 的任何一个真子集 Y,都有 Y 不是候选键或超键。
这个定义可以被表述为:如果一个属性集合 X 满足以上两个
条件,那么 X 对于关系模式 R 中的任意一个函数依赖来说都
是极小的。
从这个定义可以看出,一个关系模式可以有多个极小函数依赖,这些函数依赖描述了不同的属性间约束关系。
极小函数依赖是数据库设计中的一个重要概念,它可以用来优化数据库的性能和减少数据冗余。
计算最小函数依赖集示例
一、求最小依赖集的算法
①根据推理规则的分解性,右部最小化
②消除左边的冗余属性
③消除冗余的FD(依赖)
重点:操作步骤的顺序不能颠倒,颠倒了可能消除不了FD中左边冗余的属性,或冗余的依赖。
二、具体操作详解(以下两种意思相同,表述略有区别罢了)
(1)右部最小化:右切,使每个函数依赖的右部仅有一个属性
(2)规则最小化:除本求包(对每个函数依赖的左部做除本求包,求包的结果如果不包含本函数依赖的右部,本函数依赖保留;求包的结果如果包含了本函数依赖的右部,删除本函数依赖)(3)左部最小化
注意,解题一定要先(3)后(2)
三、例题,反例等
反例,假如将②③步骤颠倒
例:求**F={ABD→AC,C→BE,AD→BF,B→E}**的最小函数依赖集FmF_mFm
注意:当在函数依赖已经改变的地方开始一个新步骤时,重写函数依赖集很重要,这样可以在下一步中方便引用。
第一步对F中的函数依赖运用分解原则来创建一个等价函数依
赖集H,该集合中每一个函数依赖的右部是单个属性:
H={①ABD→A,②ABD→C,③C→B,④C→E,⑤AD→B,
⑥AD→F,⑦B→E}
第二步考察每一个函数依赖是否是必须的,去除非必要的函数依赖
(1)ABD→A是平凡的函数依赖(就是A是ABD的子集,所以他是平凡的依赖),所以显然是非必要的函数依赖,因此去除。
保留在H中的函数依赖是H={②ABD→C,③C→B,④C→E,⑤AD→B,⑥AD→F,⑦B→E}
(2)考察ABD→C,去掉此函数依赖将会得到新的函数依赖集J ={③C→B,④C→E,⑤AD→B,⑥AD→F,⑦B→E}。
如果ABD→C 是非必要的,则(ABD)J+(ABD)_J^+(ABD)J+=ABDFE,不包含C,因此ABD→C是必要的函数依赖,不能去掉。
H={②ABD→C,③C→B,④C→E,⑤AD→B,⑥AD→F,
⑦B→E}
(3)考察C→B,J={②ABD→C,④C→E,⑤AD→B,
⑥AD→F,⑦B→E},则**CJ+C_J^+CJ+=CE**,不包含B,因此C→B 是必要的函数依赖,保留在H中。
(4)考察C→E,J={②ABD→C,③C→B,⑤AD→B,
⑥AD→F,⑦B→E},则CJ+C_J^+CJ+=CBE,包含E,因此是不必要的,去除后得到的函数依赖集为H={②ABD→C,③C→B,
⑤AD→B,⑥AD→F,⑦B→E}
(5)同理考察函数依赖⑤、⑥和⑦,最后得到的函数依赖集为H={②ABD→C,③C→B,⑤AD→B,⑥AD→F,⑦B→E}。
为了第三步方便引用,我们进行重新编号:
H={①ABD→C,②C→B,③AD→B,④AD→F,⑤B→E}。
第三步考察每一个左部为多个属性的函数依赖,看左部的每个属性是否是必须的,能否用更小的属性集替代原有的属性集。
首先从函数依赖①ABD→C开始。
(1)去除A?
如果A可以去除,那么可得到新的函数依赖集J={①BD→C,②C→B,③AD→B,④AD→F,⑤B→E}。
去掉A后BD在J上的闭包将比在H下函数决定更多的属性,如果(BD)J+(BD)_J^+(BD)J+
=(BD)H+(BD)_H^+(BD)H+或者C∈(BD)H+(BD)_H^+(BD)H+,则说明去掉A得到的函数依赖集和原有的函数依赖集是等价的,可以用
BD→C替换ABD→C。
(BD)H+(BD)_H^+(BD)H+=BDE,不包含C,所以A不能去掉。
(2)去掉B?
J={①AD→C,②C→B,③AD→B,④AD→F,⑤B→E}。
(AD)H+(AD)_H^+(AD)H+=ADBC,包含了B,因此B→C是冗余的函数依赖,所以去除
(3)去掉D?J={①A→C,②C→B,③AD→B,④AD→F,
⑤B→E}。
因为H的函数依赖集在第三步发生了改变,因此我们需要回到
第二步。
如果顺序颠倒,则在消除左部冗余使F发生变化后,需要重新进行消除函数依赖的操作
此时H={①AD→C,②C→B,③AD→B,④AD→F,⑤B→E}。
在进行第二步即重新进行消除函数依赖操作
其中考察到③,有(AD)H+(AD)_H^+(AD)H+=ADCB,包含B,因此AD→B是不必要的函数依赖,所以去除
最后
得到的函数依赖集为H={AD→C,C→B,AD→F,B→E}
例题:已知关系模式R(U,F),U={A,B,C,D,E,F,G},F={BCD→A,BC→E,A→F,F→G,C→D,A→G},求F的最小函数依赖集。
原参考省略了左部最小化的步骤,现我将其补上,仅供参考
③左部最小化
经过右部最小化和消除冗余依赖后F={BCD→A,BC→E,A→F,F→G,C→D}
针对BCD→A
去B?则(CD)F+(CD)_F^+(CD)F+=CD,无A,保留
去C?则(BD)F+=BD(BD)_F^+=BD(BD)F+=BD,无A,保留
去D?则(BC)F+=BCDAEFG(BC)_F^+=BCDAEFG(BC)F+=BCDAEFG,有A,则D冗余,可以去掉。
所以F={BC→A,BC→E,A→F,F→G,C→D}
针对BC→E
去B则CF+C_F^+CF+=CD,保留
去C则BF+B_F^+BF+=B,保留
所以F={BC→A,BC→E,A→F,F→G,C→D}
但是
由于操作顺序颠倒,还需要进行冗余依赖的判断,判断后发现现在依赖保持不变。
所以F={BC→A,BC→E,A→F,F→G,C→D}。