關係型數據庫範式(NF)的概念:符合某種級別的關係模型的集合,表示一個關係內部各個屬性之間聯繫的合理化程度。
很難懂對不對?大體上,範式指的是,一張數據表的級別。
一範式(1NF)是基礎級別;大家都要有的。概念是:數據庫表每一項都是不可再分的項;用一句簡單的話說,就是所有的屬性都是單一的,你不能一個格里面寫倆屬性,也沒地兒寫啊不是。圖解:
姓名 | 學號 | 年齡 | 基本信息 | |
奔波兒灞 | 0101 | 17 | 團員 | 班長 |
霸波爾奔 | 0102 | 18 | 團員 | 學習委員 |
這個(姓名,學號,年齡,基本信息)就不符合基礎級別(1NF),基本信息是可以再分的,因爲數據表中,一格是不能同時寫上多個數據的。
二範式(2NF)是建立在一範式的基礎上的。概念是數據表的實例或者屬性必須被唯一的區分。同樣用簡單的話說,就是你不能把所有的信息放一塊兒吧。總得根據關鍵信息把表分開吧。不然查起來多麻煩。就像學生信息表,班長拿了一張學生信息表,裏面寫的電話QQ微信身份證班級學號,再加點和學校有關的差不多就夠了。但是學生的信息太多了,興趣愛好,性格特長,家庭成員,等等等等信息,放在同一張表是不可能的。圖解:
姓名 | 學號 | 班級 | 身份證 | 籍貫 | 出生日期 | 性別 | 家庭電話 | 家庭住址 | 興趣愛好 | 專業 | 社團 | 民族 | 宿舍 | ... ... |
孫權 | 0101 | 1班 | 0101123 | 吳 | 東漢末年 | 男 | 123 | 東吳 | 十萬北伐 | 木材手工 | 東吳 | 漢族 |
1號 |
... ... |
劉備 | 0102 | 2班 | 0102233 | 蜀 | 東漢末年 | 男 | 233 | 巴蜀 | 種菜織蓆 | 表演 | 巴蜀 | 漢族 | 2號 | ... ... |
曹操 | 0103 | 3班 | 0103155 | 魏 | 東漢末年 | 男 | 1551 | 北魏 | 銅雀臺 | 裝睡 | 北魏 | 漢族 | 3號 | ... ... |
我們可以看到這張表已經滿足一範式了。他的屬性都被分得明明白白的。
不同的信息,他們的身份證號碼不同,學號也不同。我們就可以說,身份證和學號是這張表的碼。
出生日期,籍貫,這之類的信息,主要是由身份證來區分的。而班級信息基本是靠學號區分。這就是說,如果我想查班級信息,我拿到學號就夠了,身份證號碼對於我想查的班級信息,並沒有必要。我們就稱這種表存在不完全依賴。去掉這種不完全依賴的辦法,就是以學號,身份證號碼,將上面的一大張表,拆成兩張,一張以學號作碼,一張以身份證做碼。這樣就去掉了不完全依賴,就符合第二範式了。拆開之後,應該是這樣:
身份證 | 家庭住址 | 出生日期 | 民族 |
0101123 | 東吳 | 東漢末年 | 漢族 |
0102233 | 巴蜀 | 東漢末年 | 漢族 |
0103155 | 北魏 | 東漢末年 | 漢族 |
學號 | 姓名 | 班級 | 專業 | 專業老師 | 專業成績 |
0101 | 孫權 | 1班 | 木材手工 | 周瑜 | 100分 |
0102 | 劉備 | 2班 | 表演 | 子龍 | 100分 |
0103 | 曹操 | 3班 | 裝睡 | 楊修 | 100分 |
三範式(3NF)是建立在二範式的基礎上的。概念是:一個數據表中不能包含已經在別的表中的非關鍵信息,屬性不依賴其他非主屬性。就是說,說,一張表中的所有屬性,都由它的碼直接決定,不能依靠其他的中間屬性,如果有這樣的中間屬性,那就應該拆分成新的表。我們可以這樣理解,上面的學生信息表,專業成績由專業老師給出。依據學號,是無法直接拿到專業成績的。如果我們需要滿足三範式,就必須將專業,專業老師,專業成績拆分爲一個新的表(專業信息表),原來的學生信息表的信息就能夠全部由學號直接決定,這樣我們就可以說滿足了第三範式。新的表應該長這樣:
學號 | 姓名 | 班級 | 專業 |
0101 | 孫權 | 1班 | 木材手工 |
0102 | 劉備 | 2班 | 表演 |
0103 | 曹操 | 3班 | 裝睡 |
專業 | 老師 |
木材手工 | 周瑜 |
表演 | 子龍 |
裝睡 | 楊修 |
這時候你要問了,專業成績怎麼看?專業成績表,這張表是以(學號,專業)作爲碼,成績作爲非主屬性,那麼就應該多一張表:
學號 | 專業 | 成績 |
0101 | 木材手工 | 100分 |
0102 | 表演 | 100分 |
0103 | 裝睡 | 100分 |
這樣的數據關係,才符合第三範式。
BC範式(BCNF)被稱爲是修正版的第三範式,概念是不能存在非主屬性對主鍵子集依賴。這個我要另外舉一個例子,假如有一所學校要統計物理、化學、生物等學科的競賽證書數量,學校設計了這樣的一張表
班級 | 班主任 | 競賽學科 | 證書數目 |
1班 | 劉老師 | 物理 | 10 |
1班 | 劉老師 | 化學 | 15 |
2班 | 王老師 | 生物 | 20 |
2班 | 王老師 | 物理 | 10 |
... ... | ... ... | ... ... | ... ... |
這張表的碼是(班級,班主任,競賽學科),非主屬性是證書數目。證書數目由(班級,競賽學科)決定,也可以說是由(班主任,競賽學科)決定,因爲班級和班主任是可以互相推導的。這張表符合1NF元素不可分。符合2NF,因爲證書數目由(班級,競賽學科)決定,但是(班主任,競賽學科)也能決定。對於3NF,它也是符合的,因爲只有一個非主屬性,肯定是由碼直接決定的啦。那麼BCNF的規範是什麼呢?就是不能有主屬性的互相推導。就是說,如果存在(班級->班主任)(班主任->班級)這種關係,是不符合BCNF的。如果要符合BCNF那就需要將上面的表進行拆分;成爲下面這種情況。
班級 | 競賽學科 | 證書數目 |
1班 | 物理 | 10 |
1班 | 化學 | 15 |
2班 | 生物 | 20 |
2班 | 物理 | 10 |
... ... | ... ... | ... ... |
班級 | 班主任 |
1班 | 劉老師 |
2班 | 王老師 |
... ... | ... ... |
這樣就不存在證書數目對於碼的子集依賴,符合BCNF。在實際應用中,BCNF應該是數據冗餘度比較低的了,實際上我目前在工作中的數據表都是滿足第三範式而已,有的數據關係僅僅是滿足第二範式。
要做好DBA,就要更好地理解數據庫設計範式。數據庫範式總結概覽: