1. 程式人生 > >資料庫中的模式分解與無損連線性

資料庫中的模式分解與無損連線性

無損連線分解的普通判別方法——表格法

  設關係模式R=A1,…,An,R上成立的FD集F,R的一個分解p={R1,…,Rk}。無損連線分解的判斷步驟如下:

  (1)構造一張k行n列的表格,每列對應一個屬性Aj(1≤j≤n),每行對應一個模式Ri(1≤i≤k)。如果Aj在Ri中,那麼在表格的第i行第j列處填上符號aj,否則填上符號bij。

  (2)把表格看成模式R的一個關係,反覆檢查F中每個FD在表格中是否成立,若不成立,則修改表格中的元素。修改方法如下:對於F中一個FD:X→Y,如果表格中有兩行在X分量上相等,在Y分量上不相等,那麼把這兩行在Y分量上改成相等。如果Y的分量中有一個是aj,那麼另一個也改成aj;如果沒有aj,那麼用其中的一個bij替換另一個(儘量把ij改成較小的數,亦即取i值較小的那個)。

  若在修改的過程中,發現表格中有一行全是a,即a1,a2,…,an,那麼可立即斷定p相對於F是無損連線分解,此時不必再繼續修改。若經過多次修改直到表格不能修改之後,發現表格中不存在有一行全是a的情況,那麼分解就是有損的。特別要注意,這裡有個迴圈反覆修改的過程,因為一次修改可能導致表格能繼續修改。

  修改過程中要特別注意,若某個bij被改動,那麼它所在列的所有bij都需要做相應的改動。為了明確這一點,舉例說明。例如,我們根據FD“H→I”、“ K→L”來修改表格之前時的表格如表1所示(已經過多次修改,非初始表,空的單元表示省略):

  表1

        

   H 

      I    

   J    

    K   

   L     

R1

 

b12

 

 

b35

R2

a1

a2

 

a4

b25

R3

a1

b12

 

a4

b35

R4

 

b12

 

 

b35

  R2、R3所在行的H分量都為a1,根據FD“H→I”,需要修改這兩行對應的I分量,而R2所在行的I分量為a2,因此,要將R3所在行的I分量b12修改為a2,注意到,R1、R4所在行的H分量也為b12,因此,這兩行對應的I分量也必須修改為a2。R2、R3所在行的K分量都為a4,根據FD“K→L”,需要修改這兩行對應的L分量,於是將R3所在行的L分量b35修改為較小的b25,同時注意到,R1、R4所在行的L分量也為b35,因此,這兩行對應的L分量也必須修改為b25。修改後的表格如表2所示:

  表2

       

  H 

  I 

  J 

  K 

   L    

R1

 

a2

 

 

b25

R2

a1

a2

 

a4

b25

R3

a1

a2

 

a4

b25

R4

 

a2

 

 

b25

  【例題】(軟體設計師2002年上午試題38)

  設關係模式 R為 R(H,I,J,K,L),R上的一個函式依賴集為 F={H→J,J→K,I→J,JL→H},分解 (38) 是無損連線的。

  供選擇的答案:

  (38) A. p={HK,HI,IJ,JKL,HL} B. p={HIL,IKL,IJL}

  C. p={HJ,IK,HL} D. p={HI,JK,HL}

  試題分析:

  根據上述判斷方法,我們列出選項B(分解成三個關係模式R1(HIL)、R2(IKL)、R3(IJL) )的初始表如表3所示:

  表3選項B的初始表

         

   H 

   I  

    J  

    K  

   L 

HIL

a1

a2

b13

b14

a5

IKL

b21

a2

b23

a4

a5

IJL

b31

a2

a3

b34

a5

  對於函式依賴集中的H→J、J→K對錶3進行處理,由於屬性列H和屬性列J上無相同的元素,所以無法修改。但對於I→J在屬性列I上對應的1、2、3行上全為a2元素,所以,將屬性列J的第一行b13和第二行b23改為a3。修改後如表4所示:

 

表4選項B的中間表

          

     H  

   I 

   J 

    K 

    L 

HIL

a1

a2

a3

b14

a5

IKL

b21

a2

a3

a4

a5

IJL

b31

a2

a3

b34

a5

  對於函式依賴集中的JL→H在屬性列J和L上對應的1、2、3行上為a3、a5元素,所以,將屬性列H的第二行b21和第三行b31改為a1。修改後如表5所示:

  表5選項B的結果表

          

   H  

    I  

    J  

    K  

   L  

HIL

a1

a2

a3

b14

a5

IKL

a1

a2

a3

a4

a5

IJL

a1

a2

a3

b34

a5

  從表5可以看出,第二行為a1、a2、a3、a4、a5,所以分解p是無損的。

  有一種特殊情況要注意:分解後的各個關係模式兩兩均無公共屬性。由於是模式分解,那麼任一一個分解後的關係模式覆蓋的屬性集不可能是分解前的整個全部屬性U,因此初始表中不存在全是a的行。又注意到,分解後的各個關係模式兩兩均無公共屬性,表明任兩行在任一列上都沒有相同的分量,這導致整個表格無法修改,保持初始狀態。而初始狀態不存在全是a的行,因此這種特殊情況的分解是有損的。

  例如,函式依賴集合FD,將關係模式R(ABCDEF)分解成R1(AB)、R2(CDE)、R3(F),那麼這種分解肯定是有損的。考試中可能碰到這種情況,那麼一眼就可以判斷出結果,從而節省了時間。

  3.無損連線分解的快捷判別方法

  首先要申明,這種快捷方法是有前提的,前提就是分解後的關係模式只有兩個。其內容為:

  設ρ={R1,R2}是R的一個分解,F是R上的FD集,那麼分解ρ相對於F是無損分解的充分必要條件是:(R1∩R2)→(R1–R2)或(R1∩R2)→(R2–R1)。這個“或”字很重要,這裡表示(R1∩R2)→(R1–R2)、(R1∩R2)→(R2–R1)中只要有一個成立就行。這裡的求交和相減運算的物件是關係模式的屬性。

  【例題】

  關係模式R(U,F),其中U={W,X,Y,Z},F={WX→Y,W→X, X→Z,Y→W}。那麼下列分解中是無損分解的是。

  供選擇的答案:

  A.p={R1(WY),R2(XZ)} B.p={R1(WZ),R2(XY)}

  C.p={R1(WXY),R2(XZ)} D.p={R1(WX),R2(YZ)}

  試題分析:

  A選項,R1∩R2為空,肯定不滿足條件。

  B選項,R1∩R2為空,肯定不滿足條件。

  C選項,R1∩R2={X},R1-R2={WY},R2-R1={Z},根據函式依賴集,X→Z成立,所以滿足條件。

  D選項,R1∩R2為空,肯定不滿足條件。

  4.總結

  模式分解無損性判別的源泉仍然是普通的表格法。這種快捷方法只不過是根據這種表格法推斷出來的而已,是它的一個特列。但是這種快捷方法卻往往非常有用。