求函数依赖集最小闭包

前端之家收集整理的这篇文章主要介绍了求函数依赖集最小闭包前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

1. 预备知识1.1 集合及其运算从直观上来说集合就是具有相同性质的一些事物汇集在一起的整体。从数学上来讲集合是无法精确定义的。集合并、交、差、补等运算。全集和子集的概念。1.2 关系数据库模型定义1 域是一组具有相同数据类型的值的集合。定义2 序偶的定义:={{x},{x,y}}。定义3 三元组是一个序偶,即:=<,z>;那么n元组也是一个序偶:=<,xn>。定义4 在域D1,D2,…,Dn上定义的笛卡尔积运算为:D1×D2×…×Dn={|di∈Di,i=1,2,n}。定义5 在域D1,Dn上定义的关系为:R(D1,Dn) D1×D2×…×Dn,其中n为关系的度或目。显然,关系可表示为一个二维表,表的每一行对应一个元组,每列对应一个域。由于域可以相同,为了加以区分,每列起一个名字,称为属性。若关系中的某一个或一组属性的值能唯一地标识一个元组,则称该属性组为候选码。可以从这些候选码中选定一个为主码。当关系作为关系数据库关系数据模型的数据结构时,需要给予如下的限定和扩充:⑴必须是有限关系。⑵为关系的每列附加一个属性名,取消关系元组的有序性。定义6 关系的描述称为关系模式。关系模式可以形式化的表示为:R(U,D,DOM,Σ)。其中R为关系名,U为组成关系的属性名集合,D为属性组U中属性取值范围的集合,DOM为属性到域的映射,Σ为属性间的数据依赖集。数据依赖是通过一个关系中属性间值的相等与否体现出来的数据间的相互关系。它规定了任何一个数据库的合法状态所必须满足的一种予以完整性约束条件。它是现实世界属性间相互联系的抽象,是数据内在语义的体现。数据依赖已提出多种类型,如函数依赖、多值依赖、连接依赖、分层依赖和相互依赖等。2 关系规范化理论2.1 规范化理论的发展E•F•Codd于1970年提出关系模型时,同时提出了关系规范化问题。他根据关系模式中属性间的函数依赖关系定义了关系的三级规范形式,即1NF、2NF、3NF。1974年Boyee和Codd共同定义了一个改进了的3NF,称为BCNF。1977年Fagin等人发现了数据多值依赖,从而定义了4NF,1979年Fagin等人又定义了与连接依赖有关的5NF。2.2 函数依赖对于一个关系模式R(U,Σ),其中的属性所来自的域D和属性到域的映射DOM不在本文的讨论范围之内,同时本文只讨论数据依赖Σ中的一种:函数依赖F,因此将关系模式简化为R(U,F)或者R(U)。定义7 在关系模式R(U)中,X和Y是属性集U的子集。如果对于任意的关系实例r,r中不可能存在两个元组在X上的属性相等,而在Y上的属性不相等,则称X函数决定Y或Y函数依赖于X,记作X→Y。定义8 在关系模式R(U)中,如果X→Y,并且存在X的一个真子集X`,有X`→Y,则称Y对X部分函数依赖。否则称为Y对X完全函数依赖。定义9 在关系模式R(U)中,如果X→Y,同时Y X,则称X→Y是平凡函数依赖。否则,称X→Y是非平凡函数依赖。定义10 在关系模式R(U)中,X、Y、Z是U的子集,并且Z-Y≠Φ,Z-X≠Φ,Y-X≠Φ,如果X→Y,Y→Z同时X→Z,则称Z传递依赖于X。定义11 在关系模式R(U,F)中,F是R上的一组函数依赖。对于关系模式R的任一关系R,如果r满足F,则r满足X→Y,那么称F逻辑蕴涵X→Y,或称函数依赖X→Y可由F导出。所有被F逻辑蕴涵的函数依赖的全集称为F的闭包,记作F+。2.3 Armstrong公理系统一般说来,由给出的一个函数依赖集F可以导出不止一个函数依赖,而是一组函数依赖。那么如何从给出的函数依赖集F中推导出F所蕴涵的其他函数依赖关系?这需要一组可用的推导规则。这组规则最早是在1974年由W•W•Armstrong提出来的。Armstrong公理系统 设有关系模式R(U,F),U是属性全集,F是U上的一组函数依赖,W、X、Y、Z均是U的子集,对于R(U,F)来说有如下的推理规则(为简便起见用XY表示X∪Y):A1自反律:如果Y X,则X→Y。A2增广律:如果X→Y,则XZ→YZ。A3传递律:如果X→Y,Y→Z,则X→Z。由A1、A2、A3这三条公理可以导出下面三条推论:合并规则:如果X→Y,X→Z,则X→YZ。伪传递规则:如果X→Y,WY→Z,则XW→Z。分解规则:如果X→Y,Z Y,则X→Z。Armstrong公理系统是完备的。所谓完备性是指根据Armstrong公理可以从已有的函数依赖推导出所有的函数依赖。Armstrong公理、推论和完备性的证明,请参阅参考文献[5]。2.4 函数依赖集的闭包的计算一般情况下,由函数依赖集F计算其闭包F+是相当麻烦的,因为即使F很小,F+也可能很大。计算F+的目的是为了判断函数依赖是否为F所蕴涵。然而要导出F+的全部函数依赖是很费时的事情,而且由于F+中包含大量的冗余信息,因此计算F+的全部函数依赖是不必要的。那么是否有更简单的方法来判断X→Y是否为F所蕴涵呢?引理1 X→A1A2…An成立,iff X→Ai成立(i=1,k)。证明:由分解规则直接可得。定义12 设有关系模式R(U,F),X U,X+={Ai|X→Ai能由F根据Armstrong公理导出},X+称为属性集X关于函数依赖集F的闭包。定理1 设有关系模式R(U,F),X、Y是U的子集。X→Y能由F根据Armstrong公理导出,iff Y X+。证明:显然由X+的定义可得。由定理1可知,可以通过计算X+来判断X→Y是否为F所蕴涵。下面给出一个计算X+的有效方法。算法1:设有关系模式R(U,F),X U,求X+。输入:属性集X,函数依赖F输出属性集闭包X+步骤:⑴ i=0,X(0)=X⑵ 求属性集A,A满足的条件:在给出的F中有Y→Z,Y X(i),A Z。⑶ X(i+1)=A∪X(i)⑷ 判断X(i+1)=X(i)或者X(i+1)=U吗?⑸ 如果相等,X+= X(i+1),输出X+⑹ 否则,i=i+1,goto⑵证明:要证的是用算法1得到的结果正好是X+。为此要证明两点:⑴对于V X(i),都有X(i) X+(i=0,1,…,n,…)⑵ j,使得X+ X(j)(j为某个i)。先用归纳法证明第一点:首先,i=0时,X(0)=X,X(0) X+。归纳,设i时结论为真,即X(i) X+成立,要证X(i+1) X+也成立。因为X(i+1)= X(i)∪A,其中A Z,而且Y→Z是F中的函数依赖,Y X(i) X+,所以有X→Y,从而X→Z;又因为Z→A,所以X→A。所以A X+,那么X(i+1) X+。第二点的证明思路与第一点相同,但其中需用到如下一个结论:若W V,则对于所有的i,都有W(i) V(i)。相关证明请参阅参考文献[6]。例1:已知关系模式R(U,F),其中U={A,B,C,E};F={AB→C,B→D,C→E,EC→B,AC→B}。求(AB) +。解:由算法1,设X(0)=AB;计算X(1):逐一扫描F中的各个函数依赖,找左部为A、B、AB的函数依赖。即AB→C,B→D,那么X(1)=AB∪CD=ABCD。然后判断X(0)=X(1)或者X(1)=U?都不想等。再找出左部为ABCD子集的那些函数依赖,又得C→E,AC→B,那么X(2)= X(1)∪BE=ABCDE。因为X(2)=U,所以(AB) +=ABCDE。讨论:令ai=| X(i)|,ai是一个步长大于1的严格递增的序列,其上界为|U|,因此算法1最大循环次数为|U|-|X|。2.5 函数依赖集的等价、覆盖和最小集定义13 设F和G是两个函数依赖集,如果F+=G+,则称F和G等价,F覆盖G,同时G也覆盖F。定理2 每一个函数依赖集F,都可被一个右部只有单个属性函数依赖集G所覆盖。证明请参看下面对算法2的证明。定义14 对于一个给定的函数依赖集F,当F`满足如下条件时,称为F的最小函数依赖集:⑴ F`中的每个函数依赖的右部都是单个属性。⑵ 对于F`中的任一函数依赖X→Y来说,F`-{X→Y}与F`都不等价。⑶ 对于F`中的任一函数依赖X→Y来说,F`-{X→Y}∪{Z→Y}与F`都不等价,其中Z为X的真子集。算法2:设有关系模式R(U,F),求最小函数依赖集F`输入:函数依赖F输出:最小函数依赖F`步骤:⑴ 将F中的所有以来变为右部是单属性的依赖。⑵ 依次考察F中的函数依赖。假设为X→Y,在F-{X→Y}中求X+,看X+是否包含Y,如果是则删去X→Y,否则不能删去X→Y。直到F中的最后一个。⑶ 逐个检查F中每个函数依赖左部的每个属性,消去冗余属性,判断XY→Z中属性Y是否冗余,即判断F-{XY→Z}∪{X→Z}与F是否等价。在F中求X+,如果中X+包含Z,则X→Z成立,XY→Z可以用X→Z代替。否则,Y不能消去。证明:分为三步。⑴对于F中的任一函数依赖X→Y,若Y=A1A2…An,其中Ai是单属性,由引理1可得,可以用X→=A1A2…An来取代X→Y。⑵对于F中的任一函数依赖X→A,令G=F-{X→A},若A∈X+,则F+与G+等价。则可以在F中去掉此函数依赖X→A。⑶对于F中的任一函数依赖X→A,若X=B1B2…Bm,令Z=X- Bi,(i=1,2,…,m),若A∈Z+,则F-{X→A}∪{Z→Z}与F是否等价。例2:F={ A→B,B→A,B→C,A→C,C→A},求最小函数依赖集。解得:Fmin1={ A→B,B→C,C→A},Fmin2={ A→B,B→A,A→C,C→A}。讨论:F的最小依赖集Fmin并不一定是唯一的,得到的Fmin的结果与检查F中的函数依赖的次序有关。

原文链接:https://www.f2er.com/javaschema/288201.html

猜你在找的设计模式相关文章