數據庫三範式的簡單理解
阿新 • • 發佈:2018-04-11
地址 數據表 有時 tom 級別 需要 如果 學英語 style 數據庫範式
範式的級別
設計關系數據庫時,遵從不同的規範要求,設計出合理的關系型數據庫,這些不同的規範要求被稱為不同的範式,各種範式呈遞次規範,越高的範式數據庫冗余越小。
目前關系數據庫有六種範式:第一範式(1NF)、第二範式(2NF)、第三範式(3NF)、巴斯-科德範式(BCNF)、第四範式(4NF)和第五範式(5NF,又稱完美範式)。
範式越高,冗余最低,一般到三範式,再往上,表越多,可能導致查詢效率下降。所以有時為了提高運行效率,可以讓數據冗余(反三範式,一般某個數據經常被訪問時,比如數據表裏存放了語文數學英語成績,但是如果在某個時間經常要得到它的總分,每次都要進行計算會降低性能,可以加上總分這個冗余字段)。
後面的範式是在滿足前面範式的基礎上,比如滿足第二範式的一定滿足第一範式。
第一範式(1NF):確保每一列的原子性
如果每一列都是不可再分的最小數據單元,則滿足第一範式。
上面的表地址字段其實可以繼續分:
但是具體地址到底要不要拆分 還要看具體情形,比如看看將來會不會按國家或者省市進行分類匯總或者排序,如果需要,最好就拆,如果不需要而僅僅起字符串的作用,可以不拆,操作起來更方便。
第二範式:非鍵字段必須依賴於鍵字段
如果一個關系滿足1NF,並且除了主鍵以外的其它列,都依賴與該主鍵,則滿足二範式(2NF),第二範式要求每個表只描述一件事。
例如:
而實際上,產品編號與訂單編號並沒有明確的關系,訂購日期與訂單編號有關系,因為一旦訂單編號確定下來了,訂購日期也確定了,價格與訂單編號也沒有直接關系,而與產品有關,所以上面的表實際上可以拆分:
訂單表:
產品表:
第三範式:在1NF基礎上,除了主鍵以外的其它列都不傳遞依賴於主鍵列,或者說: 任何非主屬性不依賴於其它非主屬性
(在2NF基礎上消除傳遞依賴)
例如:
上面的滿足第一和第二範式,但是不滿足第三範式,原因如下:
通過顧客編號可以確定顧客姓名,通過顧客姓名可以確定顧客編號,即在這個訂單表裏,這兩個字段存在傳遞依賴,只需要一個就夠了。
又如:
上面的表,學號和姓名存在傳遞依賴,因為(學號,姓名)->成績,學號->成績,姓名->成績。所以學號和姓名有一個冗余了,只需要保留一個。
id | 地址 |
1 | 中國廣東 |
2 | 中國雲南 |
id | 國家 | 省份 |
1 | 中國 | 廣東 |
2 | 中國 | 雲南 |
字段 | 例子 |
訂單編號 | 001 |
產品編號 | a011 |
訂購日期 | 2017-4-8 |
價格 | ¥30 |
訂單編號 | 001 |
日期 | 2017-4-8 |
產品編號 | a011 |
價格 | ¥30 |
字段 | 例子 |
訂單編號 | 001 |
訂購日期 | 2017-4-8 |
顧客編號 | a01 |
顧客姓名 | howard |
主鍵 | 學號 | 姓名 | 成績 |
1 | 111 | howard | 90 |
2 | 222 | tom | 90 |
數據庫三範式的簡單理解