通俗易懂理解數據庫範式

關係型數據庫範式(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,就要更好地理解數據庫設計範式。數據庫範式總結概覽:

  

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章