範式所描述的是:表設計時,達到的某種級別的標準。就像家裏裝修買建材,最環保的是E0級,其次是E1級,還有E2級等等設計
這樣的標準有:1NF,2NF,3NF,BCNF,4NF,5NF。table
要求:表中每一列是不能再分割的。搜索
設計一個表存儲用戶信息:統計
用戶ID | 用戶信息 |
1 | 小明21歲 |
2 | 小紅31歲 |
這種設計不符合1NF,由於用戶信息那一列還能夠繼續分割,應該將名稱和年齡拆分出來成兩列。總結
再看一個邊緣化的例子:數據
用戶ID | 名稱 | 年齡 | 地址 |
1 | 小明 | 21歲 | 廣東省珠海市斗門區XX路 |
2 | 小紅 | 31歲 | 廣東省珠海市香洲區AA路 |
一看,這個地址列其實還能夠繼續拆分出多列,如省、市、區、路4列等。若是不進行拆分的話,那這個表設計就不符合1NF了嗎?不是的。tab
結論:每一列要不要繼續拆分,是跟系統的業務有關的,若是業務有要求(如以上我要對某個省進行搜索,對某個區的人員數據進行統計等),而設計表時卻沒有拆分,則這樣的設計不符合1NF。因此是否符合1NF,不能光看錶的設計,還要依據業務須要來判斷。分割
要求:消除非主屬性對主屬性(主鍵、能惟一標識某一行)的部分依賴。範式
這句話包含的信息量比較大,換一個角度來理解這句話:ab
結論:只要不出現部分依賴便可,而其餘屬性是否依賴於主屬性,這點沒有要求。
要求:非主屬性都要徹底依賴於主屬性。
以上「徹底依賴」這個詞,可見已經包含了2NF,徹底依賴則意味着不會出現部分依賴。
一個不知足3NF的學生信息表:
學生ID | 學生名稱 | 院系主任名稱 |
「院系主任名稱」這一列是不依賴於「學生ID」,而只依賴於某個院系,這是和學生沒有關係的。正確作法應該再拆出來一個院系表,裏面創建院系與院系主任名稱的關係。
回顧2NF,能發現以上例子,就是知足了2NF(沒有出現部分依賴),卻不知足3NF。
以上三個範式的要求,要看是否知足,其實都是須要與業務進行關聯的。只不過對於大部分表的設計,一看就能知道業務是怎麼樣,因此就直接跳過業務解釋,則純粹的來討論表的設計,以此來判斷是否知足範式。就以上面3NF中的例子來講,只要你說你的業務與常規業務不同,而且能解釋得通,你係統裏面的院系主任名稱是依賴於學生ID的,那你這個表的設計就是知足3NF的。以及2NF中提到的主屬性,表中的列是不是主屬性,其實都是取決於業務,還有屬性之間是不是存在依賴關係,也仍是取決於業務。