標籤:
為了建立資料冗餘小,沒有資料異常(更新、刪除、插入)的資料庫。設計資料庫時必須遵循一定的規則。在關係型資料庫中這種規則就稱為範式。範式是符合某一種設計要求的總結。要想設計一個結構合理的關係型資料庫,必須滿足一定的範式。
設計資料庫的時候遵循下面三個範式基本就能滿足業務需要。
第一範式(1NF):資料庫表中的所有欄位都是單一屬性,不可再分。
解釋:第一範式要求資料庫中的表都是二維表。一般情況下,關係型資料庫是只能設計出二維表的。
例如,下面這張就是違反第一範式的表。因為它的“使用者資訊”欄位可以再拆分。
使用者資訊表
| 使用者ID |
帳號 |
密碼 |
使用者資訊 |
| 1 |
zhangsan |
****** |
姓名 |
手機 |
| 張三 |
13588888888 |
將“使用者資訊”欄位拆分後的表。
使用者資訊表
| 使用者ID |
帳號 |
密碼 |
姓名 |
手機 |
| 1 |
zhangsan |
****** |
張三 |
13588888888 |
第二範式(2NF):資料庫的表中不存在非關鍵字段對任一候選關鍵字段的部分函數依賴。
解釋:部分函數依賴是指存在著組合關鍵字段的某一個關鍵字段決定非關鍵字段的情況。只要確保表中的每個欄位都和關鍵字段相關就符合第二範式。
例如,下面這張就是違反第二範式的表。
社團加入資訊表
| 學生 |
社團 |
加入時間 |
社團簡介 |
性別 |
| 張三 |
動漫社 |
2015.9.30 |
動漫迷的聚集地 |
男 |
| 周玉 |
動漫社 |
2015.9.29 |
動漫迷的聚集地 |
女 |
學生與社團的關係是,一個學生可以加入多個社團,一個社團也可以擁有多個學生,即的,多對多關係。
“學生”欄位與“社團”欄位組合在一起,才能決定“加入時間”欄位。所以這是一張組合關鍵字段(“學生”,“社團”)的表。
但是“學生”決定了“性別”,“社團”決定了“社團簡介”,所以存在組合關鍵字段的某個關鍵字段決定非關鍵字段的情況。
違反第二範式的表存在的問題:
1、插入異常
如果沒有任何人加入動漫社,那麼是不是意味著,動漫社的簡介是不存在的。
2、刪除異常
如果把動漫社的同學都刪除掉,是不是意味著,動漫社的簡介是不存在的。
3、更新異常
如果要更新動漫社的簡介,是不是要更新多條記錄。
4、資料冗餘
很明顯,動漫社的簡介存在多條簡介資訊。
下面是按第二範式拆分後的表。
學生表
社團表
學生與社團關係表
| 學生 |
社團 |
加入時間 |
| 張三 |
動漫社 |
2015.9.30 |
| 周玉 |
動漫社 |
2015.9.29 |
第三範式(3NF): 資料庫的表中不存在非關鍵字段對任意候選關鍵字段的傳遞函數依賴。
解釋:傳遞函數依賴是指候選關鍵字段間接決定非關鍵字段。
例如,下面這張就是違反第三範式的表。
商品資訊表
| 商品名稱 |
分類 |
分類描述 |
| 狼皮大衣 |
外套 |
一種可以裝x的衣服。 |
“商品名稱”決定了“分類”,然而“分類”又決定了“分類描述”。所以,存在非關鍵字段“分類描述”對候選關鍵字段“商品名稱”的傳遞函數依賴。
即:“商品名稱” ---> “分類” ---> “分類描述”
“分類描述”間接與“商品名稱”相關。
商品資訊表
| 商品名稱 |
分類 |
分類描述 |
| 狼皮大衣 |
外套 |
一種可以裝x的衣服。 |
下面是按第三範式拆分後的表。
分類資訊表
商品資訊表
資料庫(關係型)設計三大範式