天天看點

資料庫設計三大範式資料庫設計三大範式(三大基本範式)

資料庫設計三大範式(三大基本範式)

以前建資料庫隻是單純的存取資料,嵌入式裝置資料量比較小,也不會去考慮資料備援的問題。後來在一次面試過程中,我陳述完項目後,面試官問我,你的資料庫結構滿足第幾範式啊?我瞬間就懵了,範式是啥?想想也是醉了。

 資料庫的這三大範式是為了處理資料備援、建構比較嚴謹的資料庫結構,設計資料庫時必須遵循一定的規則。在關系型資料庫中這種規則就稱為範式。

下面就來說說三大範式:

1.第一範式1NF(域的原子性)

第一範式是對域的原子性的一個要求,在資料庫設計中,一般都應該滿足第一範式。如果資料庫表中的所有字段值都是不可分解的原子值,就說明該資料庫表滿足了第一範式,不過有些關系模型中突破了第一範式的限制,這種稱為非第一範式的關系模型。換句話說,是否必須滿足第一範式的最低需求,主要依賴所使用的關系模型。

例如:我們建一張學生資訊表。

                                                                              表一

學  号 姓名 性别 年齡 學  院 班  級 位址
100101 張三 18 文史 1年1班 山東省濟南市曆城區花園路2号
100202 李四 19 農學院 1年3班 福建省福州市晉安區愛鄉園3号
100303 王五 21 醫學院 4年1班 山西省太原市小店區興武小區3棟
100404 趙六 20 英語 3年2班 江蘇省徐州市泉山區解放路21号

表二

學  号 姓名 性别 年齡 學  院 班  級 省份 市(縣區) 詳細位址
100101 張三 18 文史 1年1班 山東 濟南市 曆城區花園路2号
100202 李四 19 農學院 1年3班 福建 福州市 晉安區愛鄉園3号
100303 王五 21 醫學院 4年1班 山西 太原市 小店區興武小區3棟
100404 趙六 20 英語 3年2班 江蘇 徐州市 泉山區解放路21号

 大家可以對比一下表一和二,表二在表一的基礎上,将'位址"字段拆分為"省份"、"市(縣區)"、"詳細位址"。如果《學生資訊表》的按地區查詢操作比較頻繁,那麼表二在很大程度上提高了使用者對學生學籍所在“地區”的操作效率,不用再從“位址”字段中提取“地區”資訊,是以表二的設計滿足了域原子性設計,也就是滿足了第一範式。  

2.第二範式2NF(表中除主鍵外的字段都完全依賴主鍵)

第二範式是在第一範式基礎上建立的。第二範式有兩個重點:(1)表中必須有主鍵;(2)其他非主屬性必須完全依賴主鍵,不能隻依賴主鍵的一部分(主要針對聯合主鍵而言)。

例如:學生體育選修課考試成績表

學  号 課程編号 課程 代課老師 成績
100101 101 籃球 張 一 88
100202 102 羽毛球 李 二 87
100303 101 瑜伽 楊 三 79
100404 105 足球 胡 四 70

表中,每個學生選修一門課,“學号”和“課程編号”為聯合主鍵,“成績”都依賴于主鍵,而“課程”和“代課老師”則部分依賴于“課程編号”。是以,為了符合第二範式,我們将修改表結構,如下:

表三 學生選修課成績表

學  号 課程編号 成績
100101 101 88
100202 102 87
100303 101 79
100404 105 70

 表四 選修課資訊表

課程編号 課程 代課老師
101 籃球 張 一
102 羽毛球 李 二
101 瑜伽 楊 三
105 足球 胡 四

  将表中課程資訊單獨分離出來,符合了第二範式原則。表三中的非主屬性都依賴于主鍵,即,“成績”字段完全依賴于“學号”和“課程編号”組成的聯合主鍵,符合第二範式原則。這樣設計,在很大程度上減小了資料庫的備援。

3.第三範式3NF(表中除主鍵外的字段都完全直接依賴,不能是傳遞依賴)      

不能是傳遞依賴,即不能存在:非主鍵列 A 依賴于非主鍵列 B,非主鍵列 B 依賴于主鍵的情況。

 第二範式(2NF)和第三範式(3NF)的概念很容易混淆,區分它們的關鍵點在于,2NF:非主鍵列是否完全依賴于主鍵,還是依賴于主鍵的一部分;3NF:非主鍵列是直接依賴于主鍵,還是直接依賴于非主鍵列。

 第三範式的例子網上有很多很多例子,個人覺得可能自己了解的還不夠,覺得說服力不是很強,我想再琢磨琢磨再回來補上第三範式的例子。