數據庫三範式的理解

範式所描述的是:表設計時,達到的某種級別的標準。就像家裏裝修買建材,最環保的是E0級,其次是E1級,還有E2級等等設計

這樣的標準有:1NF,2NF,3NF,BCNF,4NF,5NF。table

1NF

要求:表中每一列是不能再分割的。搜索

設計一個表存儲用戶信息:統計

用戶ID 用戶信息
1 小明21歲
2 小紅31歲

這種設計不符合1NF,由於用戶信息那一列還能夠繼續分割,應該將名稱和年齡拆分出來成兩列。總結

再看一個邊緣化的例子:數據

用戶ID 名稱 年齡 地址
1 小明 21歲 廣東省珠海市斗門區XX路
2 小紅 31歲 廣東省珠海市香洲區AA路

一看,這個地址列其實還能夠繼續拆分出多列,如省、市、區、路4列等。若是不進行拆分的話,那這個表設計就不符合1NF了嗎?不是的。tab

結論:每一列要不要繼續拆分,是跟系統的業務有關的,若是業務有要求(如以上我要對某個省進行搜索,對某個區的人員數據進行統計等),而設計表時卻沒有拆分,則這樣的設計不符合1NF。因此是否符合1NF,不能光看錶的設計,還要依據業務須要來判斷。分割

2NF

要求:消除非主屬性對主屬性(主鍵、能惟一標識某一行)的部分依賴。範式

這句話包含的信息量比較大,換一個角度來理解這句話:ab

  • 若是主屬性只有一個,則一定知足2NF,而不要求其餘屬性是否依賴於這個主屬性。
  • 若是主屬性有多個,而其餘屬性要麼依賴於這多個主屬性,要麼不依賴於任意一個主屬性,這樣也知足2NF。

結論:只要不出現部分依賴便可,而其餘屬性是否依賴於主屬性,這點沒有要求。

3NF

要求:非主屬性徹底依賴於主屬性。

以上「徹底依賴」這個詞,可見已經包含了2NF,徹底依賴則意味着不會出現部分依賴。

一個不知足3NF的學生信息表:

學生ID 學生名稱 院系主任名稱

「院系主任名稱」這一列是不依賴於「學生ID」,而只依賴於某個院系,這是和學生沒有關係的。正確作法應該再拆出來一個院系表,裏面創建院系與院系主任名稱的關係。

回顧2NF,能發現以上例子,就是知足了2NF(沒有出現部分依賴),卻不知足3NF。

最後總結

以上三個範式的要求,要看是否知足,其實都是須要與業務進行關聯的。只不過對於大部分表的設計,一看就能知道業務是怎麼樣,因此就直接跳過業務解釋,則純粹的來討論表的設計,以此來判斷是否知足範式。就以上面3NF中的例子來講,只要你說你的業務與常規業務不同,而且能解釋得通,你係統裏面的院系主任名稱是依賴於學生ID的,那你這個表的設計就是知足3NF的。以及2NF中提到的主屬性,表中的列是不是主屬性,其實都是取決於業務,還有屬性之間是不是存在依賴關係,也仍是取決於業務。

相關文章
相關標籤/搜索