天天看點

資料庫設計範式2——BC範式和第四範式回顧BC範式第四範式

我用大白話來回顧一下什麼是三範式:

第一範式:每個表應該有唯一辨別每一行的主鍵。

第二範式:在複合主鍵的情況下,非主鍵部分不應該依賴于部分主鍵。

第三範式:非主鍵之間不應該有依賴關系。

這是我們設計資料庫的基本規則,但是隻有這三個規則并不能完全解決資料的增删改的異常情況,下面就來看看bc範式的例子。

bc範式(bcnf)是boyce-codd範式的縮寫,其定義是:在關系模式中每一個決定因素都包含候選鍵,也就是說,隻要屬性或屬性組a能夠決定任何一個屬性b,則a的子集中必須有候選鍵。bcnf範式排除了任何屬性(不光是非主屬性,2nf和3nf所限制的都是非主屬性)對候選鍵的傳遞依賴與部分依賴。

比如我們有一個學生導師表,其中包含字段:學生id,專業,導師,專業gpa,這其中學生id和專業是聯合主鍵。

studentid

major

advisor

majgpa

1

人工智能

edward

4.0

2

大資料

william

3.8

3.7

3

joseph

這個表的設計滿足三範式,有主鍵,不存在主鍵的部分依賴,不存在非主鍵的傳遞依賴。但是這裡存在另一個依賴關系,“專業”函數依賴于“導師”,也就是說每個導師隻做一個專業方面的導師,隻要知道了是哪個導師,我們自然就知道是哪個專業的了。

是以這個表的部分主鍵依賴于非主鍵部分,那麼我們可以進行以下的調整,拆分成2個表:

學生導師表:

導師表:

如果滿足了bc範式,那麼就不再會有任何由于函數依賴導緻的異常,但是我們還可能會遇到由于多值依賴導緻的異常。

比如我們建立課程教師和教材的模型,我們規定,每門課程有對應的一組教師,每門課程也有對應的一組教材,一門課程使用的教程和教師沒有關系。這樣我們首先肯定有三個實體表,分别表示課程,教師和教材。現在我們要建立這三個對象的關系,于是我們建立的關系表,定義如下:

課程id,教師id,教程id;這三列作為聯合主鍵。

以下是示例,為了表述友善,我們用name代替id,這樣更容易看懂:

course

teacher

book

英語

bill

人教版英語

美版英語

jay

高數

人教版高數

dave

美版高數

這個表除了主鍵,就沒有其他字段了,是以肯定滿足bc範式,但是卻存在多值依賴導緻的異常。

我們先來看看多值依賴的定義:

一個關系,至少存在三個屬性(a、b、c),才能存在這種關系。對于每一個a值,有一組确定的b值和c值,并且這組b的值獨立于這組c的值。

假如我們下學期想采用一本新的英版高數教材,但是還沒确定具體哪個老師來教,那麼我們就無法在這個表中維護course高數和book英版高數教材的的關系。

解決辦法是我們把這個多值依賴的表拆解成2個表,分别建立關系。這是我們拆分後的表:

第四範式的定義很簡單:已經是bc範式,并且不包含多值依賴關系。

除了第四範式外,我們還有更進階的第五範式和域鍵範式(dknf),第五範式處理的是無損連接配接問題,這個範式基本沒有實際意義,因為無損連接配接很少出現,而且難以察覺。而域鍵範式試圖定義一個終極範式,該範式考慮所有的依賴和限制類型,但是實用價值也是最小的,隻存在理論研究中。