資料庫設計三大範式(三大基本範式)
以前建資料庫隻是單純的存取資料,嵌入式裝置資料量比較小,也不會去考慮資料備援的問題。後來在一次面試過程中,我陳述完項目後,面試官問我,你的資料庫結構滿足第幾範式啊?我瞬間就懵了,範式是啥?想想也是醉了。
資料庫的這三大範式是為了處理資料備援、建構比較嚴謹的資料庫結構,設計資料庫時必須遵循一定的規則。在關系型資料庫中這種規則就稱為範式。
下面就來說說三大範式:
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:非主鍵列是直接依賴于主鍵,還是直接依賴于非主鍵列。
第三範式的例子網上有很多很多例子,個人覺得可能自己了解的還不夠,覺得說服力不是很強,我想再琢磨琢磨再回來補上第三範式的例子。