1. 程式人生 > >【資料庫】解剖式學習無損分解

【資料庫】解剖式學習無損分解

前言:

無損分解是資料庫中一個比較重要的知識點,這個還是比較值得總結的!其中有些東西我們還是容易模糊的,如果對於無損分解有疑惑,可以認真的看下面的內容!

1、為什麼會有分解

因為分解能消除資料冗餘和操作異常現象,就是說如果我們的模式中有冗餘問題,那麼我們就分解它!

2、什麼是無損分解

無損分解指的是對關係模式分解時,原關係模型下任一合法的關係值在分解之後應能通過自然聯接運算恢復起來, 反之,則稱為有損分解。這個聽著有點抽象,我們接下來用例題來解決它!

3、例子解釋有損分解和無損分解

(1)關係模式R(ABC)如下

在這裡插入圖片描述

現將關係模式分解成R1=AB和R2=AC如下:

在這裡插入圖片描述
此時 R1 和R2經過投影和連線後可以恢復到R,所以這個分解是無損的!

(2)有損分解
關係模式R(ABC)如下
在這裡插入圖片描述

現在將它分解成R1和R2
在這裡插入圖片描述

現在的R1和R2通過投影連線後,所形成的關係模式如下!
在這裡插入圖片描述
這時候的關係模式比原來多了兩行,儘管多了兩行,那麼這也是有損分解,因為它和原來的資訊不一樣了,相當於增加了噪聲!

4、無損分解 的測試方法

這個比較關鍵!非常重要! (下面的例子和定理一塊看)
(1)演算法定理
ρ={R1<U1,F1>,R2<U2,F2>,…,Rk<Uk,Fk>}是關係模式R<U,F>的一個分解,U={A1,A2,…,An},F={FD1,FD2,…,FDp},並設F是一個最小依賴集,記FDi為Xi→Alj,其步驟如下:

① 建立一張n列k行的表,每一列對應一個屬性,每一行對應分解中的一個關係模式。若屬性Aj Ui,則在j列i行上真上aj,否則填上bij;

② 對於每一個FDi做如下操作:找到Xi所對應的列中具有相同符號的那些行。考察這些行中li列的元素,若其中有aj,則全部改為aj,否則全部改為bmli,m是這些行的行號最小值。

如果在某次更改後,有一行成為:a1,a2,…,an,則演算法終止。且分解ρ具有無損連線性,否則不具有無損連線性。

對F中p個FD逐一進行一次這樣的處理,稱為對F的一次掃描。

③ 比較掃描前後,表有無變化,如有變化,則返回第② 步,否則演算法終止。如果發生迴圈,那麼前次掃描至少應使該表減少一個符號,表中符號有限,因此,迴圈必然終止。

例題
在這裡插入圖片描述
求解:
此題的k為6,n為6,所以初始表構建如下:
在這裡插入圖片描述

(2)對於A→C,對上表進行處理,將b13、別53改成同一符號b13(儘量把下標改成較小的數)
在這裡插入圖片描述

(3)對於B→C,將b33改為a3,此時b13也都一樣,所以b15改成a5

在這裡插入圖片描述

(4)對於C→D,將b24與b34都改為a4
在這裡插入圖片描述

對於DE→C,將b13改成a3 ,對於CE→A,將b31與b41均改為a1,結果如下:

在這裡插入圖片描述
此時BE的一行中全都為a,此時說明為無損分解,否則就是損失分解!