计算最小函数依赖集示例
- 格式: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)。
计算最小函数依赖集示例
一、求最小依赖集的算法
①根据推理规则的分解性,右部最小化
②消除左边的冗余属性
③消除冗余的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}。