1. 程式人生 > >資料庫基礎(5)1NF,2NF,3NF,BCNF 四大正規化的定義和判別

資料庫基礎(5)1NF,2NF,3NF,BCNF 四大正規化的定義和判別

正規化很重要呀,我們關係資料庫的設計都要滿足正規化關係
這裡總結一下1NF,2NF,3NF和BCNF

1.第一正規化(1NF)

定義

(1NF, Normal Form) 如果一個關係模式R中的每個屬性A的域值都是原子的,即屬性值是不可再分的,則關係模式R屬於第一正規化,簡記為R ∈ 1NF。若資料庫模式R中的每個關係模式都是1NF,資料庫模式 R∈1NF。

這個非常好理解,基本上,只要題目給了,他就是一個滿足第一正規化的關係模式


2.第二正規化(2NF)

定義

第二正規化

2NF指的就是,我們的關係模式中的所有非主屬性完全依賴於每個鍵。什麼意思呢,這裡呢最重要的是理解什麼是非主屬性
,什麼是主屬性,什麼是

推薦看另外一個部落格的總結,理解一下鍵的含義: https://blog.csdn.net/fjxcsdn/article/details/76549751
看我之前寫的部落格理解完全依賴和部分依賴的含義: 資料庫基礎(3)函式依賴-平凡依賴,完全依賴,部分依賴,傳遞依賴
那非主屬性和主屬性怎麼理解呢,舉個例子:關係模式R={A,B,C,D} ,已知R的候選鍵是AD , 那麼AD中的A和D就是主屬性,而B和C就是非主屬性。包含在候選鍵裡的屬性就是主屬性!

現在理解鍵和依賴關係的含義之後,我們就可以好好看看2NF是個什麼了

舉例子1:

已知,R={A,B,C},函式依賴集為 F ={ B →C, AC →B } ,判斷關係模式是不是2NF

那麼我們首先看這個R關係模式裡面的鍵是誰

利用資料庫基礎(4)中我們學習的屬性閉包演算法求出R的候選鍵為:AC

所以第二步 就是看是否有非主屬性部分依賴於主屬性AC (我們這裡的非主屬性就是B)

很明顯並沒有B部分依賴於A或者C ,所以R是2NF

舉例子2

已知,R={A,B,C,D},函式依賴集為F ={ A →C,AD →B },判斷關係模式是不是2NF

和第一個例子一樣,我們首先看這個R中的鍵是誰

用屬性閉包演算法,求出R的候選鍵為:AD (AD+ = ABCD) ,所以C和B都是非主屬性,A和D是主屬性

所以,很明顯,我們發現 AD中的A竟然可以單獨決定C(A->C),所以C部分依賴於AC ,存在非主屬性部分依賴於主屬性,R不是2NF


3.第三正規化(3NF)

定義

3NF

第三正規化的意思就是,R中沒有非主屬性傳遞依賴於R的鍵,R才是3NF

這裡也隱含了一個條件,那就是,如果是R中的主屬性傳遞依賴於R的鍵,那麼R也是滿足3NF的

注意區分主屬性傳遞依賴和非主屬性傳遞依賴喔

舉例子1

已知R(A,B,C), 其函式依賴集為 F ={ B →C, AC →B };該關係模式是否第3正規化

我們來判斷判斷,首先第一步,找鍵!我們發現AC是候選鍵(AC+=ABC,通過屬性閉包演算法求的候選鍵)

同時由於AC->B , B->C ,所以C傳遞依賴於AC ,那麼R是不是3NF呢?

R 當然是3NF啦,因為R的候選鍵是AC,所以C是主屬性,因此 這裡是主屬性C傳遞依賴於鍵AC,R是3NF

注意!只有當非主屬性傳遞依賴於R的時候,R才不是3NF

舉例子2

R(A,B,C,D), 其函式依賴集為 F ={AB →C, C →D };該關係模式是否第3正規化

首先第一步,還是找鍵! 發現AB是候選鍵, 但是由於AB -> C , C -> D ,所以D傳遞依賴於AB

那麼R是3NF嗎?

R當然不是3NF啦,因為D是非主屬性,所以這裡是非主屬性D傳遞依賴於主屬性AB,因此就不滿足3NF的定義啦


4.Boyce-Codd正規化(BCNF)

定義

BCNF

BCNF最高階了,它指的是R中沒有任何屬性傳遞依賴於R中的任何一個鍵。所以聯想到上面我們3NF中的舉例1,它雖然滿足3NF,但是由於有主屬性傳遞依賴於鍵,它就不是BCNF。

看例題,判斷是幾正規化

例題

很明顯,兩個都是BCNF,因為都沒有任何屬性存在傳遞依賴

最後說一下,滿足BCNF的關係模式,肯定也滿足3NF;同理,滿足3NF的關係模式,肯定也滿足2NF