資料庫三正規化詳解
阿新 • • 發佈:2021-08-05
資料庫三正規化詳解
什麼是資料庫正規化
設計關係資料庫時,遵從不同的規範要求,設計出合理的關係型資料庫,這些不同的規範要求被稱為不同的正規化,各種正規化呈遞次規範,越高的正規化資料庫冗餘越小。
一正規化
資料庫表中的所有欄位值都是不可分解的原子值。[欄位原子性,不可分]
例:學生表
學生編號 | 學生姓名 | 聯絡方式 |
---|---|---|
1 | 張三 | [email protected] |
2 | 李四 | 12354534463 |
3 | 王五 | 12351255612 |
在這個學生表中聯絡方式可分為多種,不滿足一正規化中的所有欄位值是不可分解的原子值。
下面對此表進行修改使其滿足一正規化:
學生編號 | 學生姓名 | 郵箱 | 電話 |
---|---|---|---|
1 | 張三 | [email protected] | 12353466737 |
2 | 李四 | [email protected] | 12354534463 |
3 | 王五 | [email protected] | 12351255612 |
二正規化
建立在一正規化的基礎之上,要求所有非主鍵欄位完全依賴主鍵,不要產生部份依賴。[有主鍵,非主鍵欄位完全依賴主鍵]
例:學生表
這張表描述了學生和老師的關係(多對多)
學生編號 | 學生姓名 | 老師編號 | 老師姓名 |
---|---|---|---|
1 | 張三 | 01 | 張老師 |
2 | 李四 | 02 | 王老師 |
3 | 王五 | 01 | 張老師 |
此時沒有主鍵,不滿足二正規化,做出如下修改
(學生編號 | 老師編號)(pk) | 學生姓名 | 老師姓名 |
---|---|---|---|
1 | 01 | 張三 | 張老師 |
2 | 02 | 李四 | 王老師 |
3 | 01 | 王五 | 張老師 |
此時我們將學生編號與老師編號設為複合主鍵,此時學生姓名依賴學生編號,老師姓名依賴老師編號,不滿足二正規化中非主鍵欄位完全依賴主鍵。會造成資料的冗餘。此時為了讓此表滿足二正規化,可以使用三張表來表示此表的多對多關係。
即:學生表;教師表;學生教師關係表 如下
學生表
學生編號 | 學生姓名 |
---|---|
1 | 張三 |
2 | 李四 |
3 | 王五 |
教師表
老師編號 | 老師姓名 |
---|---|
01 | 張老師 |
02 | 王老師 |
關係表
id(pk) | 學生編號(fk) | 老師編號(fk) |
---|---|---|
1 | 1 | 01 |
2 | 2 | 02 |
2 | 3 | 01 |
此時表滿足二正規化
多對多怎麼設計:三張表,關係表兩個外來鍵!
三正規化
建立在第二正規化基礎之上,要求所有非主鍵欄位直接依賴主鍵,不要產生傳遞依賴。
例:學生表
學生編號(pk) | 學生姓名 | 班級編號 | 班級名稱 |
---|---|---|---|
1 | 張三 | 01 | 一班 |
2 | 李四 | 02 | 二班 |
3 | 王五 | 01 | 一班 |
以上表描述了班級和學生關係,顯然為一對多關係(一個教室中有多個學生)
分析此表滿足一正規化
因為不是複合主鍵,沒有產生部份依賴,主鍵是單一主鍵 ,滿足第二正規化。
分析第三正規化要求,不要產生傳遞依賴,但是在此表之中,一班依賴於班級編號01,班級編號01依賴於主鍵1,產生傳遞依賴,不滿足三正規化,下面對此表進行改進:
面對一對多表的設計可以將表拆分為兩個一個學生表,一個班級表如下所示:
學生表:
學生編號(pk) | 學生姓名 | 班級編號(fk) |
---|---|---|
1 | 張三 | 01 |
2 | 李四 | 02 |
3 | 王五 | 01 |
班級表:
班級編號(pk) | 班級名稱 |
---|---|
01 | 一班 |
02 | 二班 |
此時此表滿足三正規化
一對多,兩張表,多的表加外來鍵!