1. 程式人生 > 其它 >資料庫三正規化詳解

資料庫三正規化詳解

資料庫三正規化詳解

什麼是資料庫正規化

​ 設計關係資料庫時,遵從不同的規範要求,設計出合理的關係型資料庫,這些不同的規範要求被稱為不同的正規化,各種正規化呈遞次規範,越高的正規化資料庫冗餘越小。

一正規化

​ 資料庫表中的所有欄位值都是不可分解的原子值。[欄位原子性,不可分]

例:學生表

學生編號 學生姓名 聯絡方式
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 二班

​ 此時此表滿足三正規化

一對多,兩張表,多的表加外來鍵!