无损联接分解

本文出自李骥平博客,请务必保留此出处

 

 

http://fsjoy.blog.51cto.com/318484/137130

 

 

 

 

定义:无损联接分解是将一个关系模式分解成若干个关系模式后,通过自然联接和投影等运算仍能还原到原来的关系模式,则称这种分解为无损联接分解。

 

 

  

 

 

1关系模式:成绩(学号,姓名,课程号,课程名,分数)

 

 

函数依赖:学号->姓名,课程号->课程名, (学号,课程号)->分数

 

 

若将其分解为下面三个关系模式:

 

 

 

 

 

成绩(学号,课程号,分数)

 

 

学生(学号,姓名)

 

 

课程(课程号,课程名)

 

 

问,这样的分解是无损分解么?

 

 

----

 

 

由于:学号->姓名,所以:

 

 

成绩(学号,课程号,分数,姓名

 

 

由于:课程号->课程名,所以:

 

 

成绩(学号,课程号,分数,姓名,课程名

 

 

 

 

 

所以这个例子是无损分解

 

 

 

 

 

2R=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}是否无损联接分解?

 

 

 

 

 

解:

 

 

这样的题要通过画表的方法来解,首先,原始表:

 

 

 

 

 

 

A

 

B

 

C

 

D

 

E

 

AD

 

a1

 

b12

 

b13

 

a4

 

b15

 

BC

 

b21

 

a2

 

a3

 

b24

 

b25

 

BE

 

b31

 

a2

 

b33

 

b34

 

a5

 

CDE

 

b41

 

b42

 

a3

 

a4

 

a5

 

AE

 

a1

 

b52

 

b53

 

b54

 

a5

 

1

 

 

(A B C D E是关系R的属性, AD, BC, BE, CDE, AE 是分解之后每一个关系对应的属性集)

 

 

 

 

填表的过程:

 

 

当横竖相交的时候,如果在分解关系中存在对应列的单个的属性(譬如第一列第一行ADA相交的单元格,AD含有A,就填写a1),则填写a下标 下标就是单元格对应所在的列号。否则填写b下标 下标是单元格对应所在的行列号。

 

 

填写之后的初始表就是表1所示

 

 

2.根据依赖关系修改原始表:

 

 

对于依赖关系A->C,看A列中有两行a1是相等的(第一行和第五行),所以在C列中对应的两行也应该相等,但是看到这两行都是bb13b53),所以将这个b都换成b13(上面的较小的标)

 

 

 

 

 

A

 

B

 

C

 

D

 

E

 

AD

 

a1

 

b12

 

b13

 

a4

 

b15

 

BC

 

b21

 

a2

 

a3

 

b24

 

b25

 

BE

 

b31

 

a2

 

b33

 

b34

 

a5

 

CDE

 

b41

 

b42

 

a3

 

a4

 

a5

 

AE

 

a1

 

b52

 

b53àb13

 

b54

 

a5

 

对于依赖BàC, 同样的道理,看B这一列中,第二行和第三行都是a2,那么对C这一列同样的操作,但是看到C这一列中第二行是a3,那么就将第三行改成a3,优先级比b要高。

 

 

 

A

 

B

 

C

 

D

 

E

 

AD

 

a1

 

b12

 

b13

 

a4

 

b15

 

BC

 

b21

 

a2

 

a3

 

b24

 

b25

 

BE

 

b31

 

a2

 

b33àa3

 

b34

 

a5

 

CDE

 

b41

 

b42

 

a3

 

a4

 

a5

 

AE

 

a1

 

b52

 

b13

 

b54

 

a5

 

 

 

对依赖CàDC列的15行相等,D15行也应该相等,D的第1行有a,所以b54换成a4;另外C列的234行也相等,D234行也应该相等,D的第4行有a,所以将对应的行都换成a4

 

 

 

A

 

B

 

C

 

D

 

E

 

AD

 

a1

 

b12

 

b13

 

a4

 

b15

 

BC

 

b21

 

a2

 

a3

 

b24àa4

 

b25

 

BE

 

b31

 

a2

 

a3

 

b34àa4

 

a5

 

CDE

 

b41

 

b42

 

a3

 

a4

 

a5

 

AE

 

a1

 

b52

 

b13

 

b54àa4

 

a5

 

 

 

 

 

对于DEàC, DE公共的相等的行是345行,对应C345行也应该相等,故将C列的两个的b13换成a3,所以表格经过这个函数依赖关系,就是:

 

 

 

A

 

B

 

C

 

D

 

E

 

AD

 

a1

 

b12

 

b13àa3

 

a4

 

b15

 

BC

 

b21

 

a2

 

a3

 

a4

 

b25

 

BE

 

b31

 

a2

 

a3

 

a4

 

a5

 

CDE

 

b41

 

b42

 

a3

 

a4

 

a5

 

AE

 

a1

 

b52

 

b13àa3

 

a4

 

a5

 

 

 

 

 

对于CEàA, CE的公共行是345行,所以将A345行也对应相等,因为A列的第五行含有a1,所以将34行的b31,b41都换成a1

 

 

 clip_image001

 

 

最终得到的表格就是:

 

 

 

 

 

clip_image002

 

 

 最后,我们从表格里看到对于DE行来说,都是a,所以得出结论,题中的分解是无损联接分解

 

 

 

 

 

********************

 

 

 

 

 

无损分解的一个简便的判别方法(适用于分解成2个关系的情况)

 

 

 

 

 

譬如:

 

 

有关系R=ABC, 依赖关系{A-->B}那么下面哪个是无损分解:

 

 

 

 

 

A. {R1(AB),R2(AC)}

 

 

B.{R1(AB),R3(BC)}

 

 

 

 

 

首先看选项AR1R2=AR1-R2=BR1U R2-->(R1-R2).所以它是无损分解

 

 

选项B R1R2=B, R1-R2=A, R2-R1=C,

 

 

所以它不是无损分解

 

 

 

 

 

那么这里快速判断无损分解的方法就是

 

 

对两个集合先求集合的,然后求集合的差(2个集合有两个差的结果)

 

 

如果集合的-->集合的差(得到差结果的任意一个)成立那么就是无损分解

 

 

本文出自李骥平博客,请务必保留此出处http://fsjoy.blog.51cto.com/318484/137130

 

 

本文出自 51CTO.COM技术博客

 

 

 

posted @ 2010-11-21 21:31  xyj  阅读(302)  评论(0编辑  收藏  举报