定義:無損聯接分解是將一個關系模式分解成若干個關系模式后,通過自然聯接和投影等運算仍能還原到原來的關系模式,則稱這種分解為無損聯接分解。
例1:關系模式:成績(學號,姓名,課程號,課程名,分數)
函數依賴:學號->姓名,課程號->課程名, (學號,課程號)->分數
若將其分解為下面三個關系模式:
成績(學號,課程號,分數)
學生(學號,姓名)
課程(課程號,課程名)
問,這樣的分解是無損分解么?
----
由於:學號->姓名,所以:
成績(
學號,課程號,分數,
姓名)
由於:課程號->課程名,所以:
成績(學號,
課程號,分數,姓名,
課程名)
所以這個例子是無損分解
例2:設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}是否無損聯接分解?
解:
這樣的題要通過畫表的方法來解,首先,原始表:
|
A
|
B
|
C
|
D
|
E
|
AD
|
a1
|
b
12
|
b
13
|
a4
|
b
15
|
BC
|
b
21
|
a2
|
a3
|
b
24
|
b
25
|
BE
|
b
31
|
a2
|
b
33
|
b
34
|
a5
|
CDE
|
b
41
|
b
42
|
a3
|
a4
|
a5
|
AE
|
a1
|
b
52
|
b
53
|
b
54
|
a5
|
表1
(A B C D E是關系R的屬性, AD, BC, BE, CDE, AE 是分解之后每一個關系對應的屬性集)
填表的過程:
當橫豎相交的時候,如果在分解關系中存在對應列的單個的屬性(譬如第一列第一行AD與A相交的單元格,AD含有A,就填寫a
1),則填寫a
下標
, 下標就是單元格對應所在的列號。否則填寫b下標, 下標是單元格對應所在的行列號。
填寫之后的初始表就是表1所示
2.根據依賴關系修改原始表:
對於依賴關系A->C,看A列中有兩行a1是相等的(第一行和第五行),所以在C列中對應的兩行也應該相等,但是看到這兩行都是b(b13,b53),所以將這個b都換成b13(上面的較小的標)
|
A
|
B
|
C
|
D
|
E
|
AD
|
a
1
|
b
12
|
b
13
|
a
4
|
b
15
|
BC
|
b
21
|
a
2
|
a
3
|
b
24
|
b
25
|
BE
|
b
31
|
a
2
|
b
33
|
b
34
|
a
5
|
CDE
|
b
41
|
b
42
|
a
3
|
a
4
|
a
5
|
AE
|
a
1
|
b
52
|
b53b
13
|
b
54
|
a
5
|
對於依賴B->C, 同樣的道理,看B這一列中,第二行和第三行都是a2,那么對C這一列同樣的操作,但是看到C這一列中第二行是a3,那么就將第三行改成a3,優先級比b要高。
|
A
|
B
|
C
|
D
|
E
|
AD
|
a
1
|
b
12
|
b
13
|
a
4
|
b
15
|
BC
|
b
21
|
a
2
|
a
3
|
b
24
|
b
25
|
BE
|
b
31
|
a
2
|
b33a
3
|
b
34
|
a
5
|
CDE
|
b
41
|
b
42
|
a
3
|
a
4
|
a
5
|
AE
|
a
1
|
b
52
|
b
13
|
b
54
|
a
5
|
對依賴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
|
A
|
B
|
C
|
D
|
E
|
AD
|
a
1
|
b
12
|
b
13
|
a
4
|
b
15
|
BC
|
b
21
|
a
2
|
a
3
|
b24a
4
|
b
25
|
BE
|
b
31
|
a
2
|
a
3
|
b34a
4
|
a
5
|
CDE
|
b
41
|
b
42
|
a
3
|
a
4
|
a
5
|
AE
|
a
1
|
b
52
|
b
13
|
b54a
4
|
a
5
|
對於DE->C, DE公共的相等的行是3,4,5行,對應C的3,4,5行也應該相等,故將C列的兩個的b13換成a3,所以表格經過這個函數依賴關系,就是:
|
A
|
B
|
C
|
D
|
E
|
AD
|
a
1
|
b
12
|
b13a
3
|
a
4
|
b
15
|
BC
|
b
21
|
a
2
|
a
3
|
a
4
|
b
25
|
BE
|
b
31
|
a
2
|
a
3
|
a
4
|
a
5
|
CDE
|
b
41
|
b
42
|
a
3
|
a
4
|
a
5
|
AE
|
a
1
|
b
52
|
b13a
3
|
a
4
|
a
5
|
對於CE->A, CE的公共行是3,4,5行,所以將A的3,4,5行也對應相等,因為A列的第五行含有a1,所以將1行的b31換成a3
最終得到的表格就是:
最后,我們從表格里看到對於DE行來說,都是a,所以得出結論,題中的分解是無損聯接分解
********************
無損分解的一個簡便的判別方法(適用於分解成2個關系的情況)
譬如:
有關系R=ABC, 依賴關系{A-->B}那么下面哪個是無損分解:
A. {R1(AB),R2(AC)}
B.{R1(AB),R3(BC)}
首先看選項A,R1∩R2=A,R1-R2=B,R1U R2-->(R1-R2).所以它是無損分解
選項B, R1∩R2=B, R1-R2=A, R2-R1=C,
所以它不是無損分解
那么這里快速判斷無損分解的方法就是
對兩個集合先求集合的∩,然后求集合的差(2個集合有兩個差的結果)
如果集合的∩-->集合的差(得到差結果的任意一個)成立那么就是無損分解
其它問題請加我的微信:x7993794, 可加入我的軟考數據庫微信群一起討論
(本文出自 “李驥平” 博客)