无损连接,函数依赖性判定

复习数据库概论发现这个有点不懂,在百度之后,又看了下书,发觉这个方法是最简单的,最有效,最直接的。关于无损连接其实很简单,也还有另外一种方法详情参考http://www.xuebuyuan.com/959981.html

定义:无损联接分解是将一个关系模式分解成若干个关系模式后,通过自然联接和投影等运算仍能还原到原来的关系模式,则称这种分解为无损联接分解。
无损分解的判定算法
输入:一个关系模式R(A1,A2,A3,…,An),R上的一个函数依赖集合F以及一个分解p{{R1,F1},{R2,F2},…,{Rk,Fk]}
输出:确定p是否是一个连接不失真分解
方法:
(1)建立建立用来检验连接是否失真的kxn表
无损连接,函数依赖性判定_第1张图片
第i行对应于Ri,第j列对应于属性Aj
(2)填表:若Aj属于Ri,则将第i行第j列填为aj,否则填入bij。
(3)修改表:逐一考察F中的函数依赖X->Y,X可能包含一个或者多个属性,如果这(个)些属性对应于表中的列的值相同,则值相等的行所对应的Y属性所有的列的值也相等。(比方说X->Y,X是A1A2所对应的属性,Y是属性A4。由第一步,如果表中第一行和第二行的值相等,那么表中A4对应的第一行和第二行的值也要修改成一样的。)如果其中有aj,则将bij改成aj;如果没有aj,就将他们都改成bij,一般来说i是值相等的行中最小的行号。
(4)反复(指在前一次修改地基础上,反复进行,直到表中的数据不再改变)进行(3),若发现某一行变成a1,a2,…,aj,则可以得出分解p{{R1,F1},{R2,F2},…,{Rk,Fk]}具有连接不失真性。

例子://这个例子出自 “李骥平” 博客http://fsjoy.blog.51cto.com/318484/137130:
设R=ABCDE, R1=AD,R2=BC,R3=BE,R4=CDE, R5=AE, 设函数依赖: A->C, B->C, C->D, DE->C, CE->A. 判断R分解成 ρ={R1, R2, R3, R4, R5}是否无损联接分解? 解: 这样的题要通过画表的方法来解,首先,原始表:
无损连接,函数依赖性判定_第2张图片
表1 (A B C D E是关系R的属性, AD, BC, BE, CDE, AE 是分解之后每一个关系对应的属性集) 填表的过程: 当横竖相交的时候,如果在分解关系中存在对应列的单个的属性(譬如第一列第一行AD与A相交的单元格,AD含有A,就填写a1),则填写a下标 , 下标就是单元格对应所在的列号。否则填写b下标, 下标是单元格对应所在的行列号。 填写之后的初始表就是表1所示 2.根据依赖关系修改原始表: 对于依赖关系A->C,看A列中有两行a1是相等的(第一行和第五行),所以在C列中对应的两行也应该相等,但是看到这两行都是b(b13,b53),所以将这个b都换成b13(上面的较小的标)
无损连接,函数依赖性判定_第3张图片
对于依赖BàC,
同样的道理,看B这一列中,第二行和第三行都是a2,那么对C这一列同样的操作,但是看到C这一列中第二行是a3,那么就将第三行改成a3,优先级比b要高。
无损连接,函数依赖性判定_第4张图片
对依赖CàD,C列的1,5行相等,D的1,5行也应该相等,D的第1行有a,所以b54换成a4;另外C列的2,3,4行也相等,D的2,3,4行也应该相等,D的第4行有a,所以将对应的行都换成a4
无损连接,函数依赖性判定_第5张图片
对于DEàC, DE公共的相等的行是3,4,5行,对应C的3,4,5行也应该相等,故将C列的两个的b13换成a3,所以表格经过这个函数依赖关系,就是:
无损连接,函数依赖性判定_第6张图片
对于CEàA, CE的公共行是3,4,5行,所以将A的3,4,5行也对应相等,因为A列的第五行含有a1,所以将3,4行的b31,b41都换成a1 \ 最终得到的表格就是: \ 最后,我们从表格里看到对于DE行来说,都是a,所以得出结论,题中的分解是无损联接分解 **********
程序:
//数据库编程实验 //分解的无损连接判断 //输入:关系模式R(A1,A2,A3,…,An) //R上的函数依赖集F以及R的一个分解 p={{R1,F1},{R2,F2},…,{Rk,Fk}} //输出:用来检验连接是否失真的nxk表,以及是否连接无损的判断 `

其他不懂的还可以看一下这个:http://m.2cto.com/database/201604/504200.html

关于函数依赖性判断

对F上的每一个α→β使用下面的过程
result:=α;
while(result发生变化)do for each分解后的Ri t=(result∩Ri)+∩Ri
result=result∪t
这里的属性闭包是在函数依赖集F下计算出来的。如果result中包含了β
的所有属性则函数依赖α→β。分解是保持依赖的当且仅当上述过程中F的
所有依赖都被保持。

你可能感兴趣的:(oracle)