1. 程式人生 > >資料庫設計正規化總結

資料庫設計正規化總結

這篇文章簡單介紹一下資料庫的1NF正規化、2NF正規化、3NF正規化。

1NF

1NF正規化要求資料庫中不能有可以繼續拆分的列,使資料庫滿足1NF正規化要求的方法是拆分列。例項如下:

姓名 電話
張三 手機:18000001111,固話:010-99001100

這樣一張表不滿足1NF的要求,因為電話那一列顯然可以拆分為多個列,拆分之後如下:

姓名 手機 固定電話
張三 18000001111 010-99001100

1NF 通常很難違背,現代DBMS列是最小單位,除非故意,否則不可能設計出違背1NF的資料表

2NF

2NF通俗的說就是有主鍵的同時沒有部分依賴,部分依賴指的是一些非主屬性依賴於主鍵的一部分,而不是主鍵的全部,使資料庫滿足2NF的方法是拆分表。例項如下:

學號 課程號 課程名稱 成績
01 01 作業系統 99

這個表的主鍵是學號和課程號(學號,課程號),而課程名稱只依賴於課程號,是部分依賴於主鍵的,不滿足2NF,主鍵和依賴情況如下:
主鍵(學號,課程號)
依賴(學號,課程號)–>成績,課程號–>課程名稱

,第二個是部分依賴
需要進行拆分
1 課程表

課程號 課程名稱
01 作業系統

2 選課表

學號 課程號 成績
01 01 99

這樣以上兩個表的的主鍵和依賴如下,則不存在部分依賴:
1 課程表
課程號是主鍵,依賴為 課程號–>課程名稱
2 選課表
(課程號,學號)是主鍵,依賴為(學號,課程號)–> 成績

3NF

3NF 是在2NF的基礎上消除傳遞依賴的情況,例如以下資料表,滿足2NF,但存在傳遞依賴,不滿足3NF

學號 姓名 班號 班級名稱
120101 張三 1201 計科1班

上表不滿足3NF,下面是主鍵和依賴:
主鍵:學號
依賴:學號–>姓名,學號–>班號,學號–>班級名稱,但是其中的學號–>班級名稱是傳遞依賴,因為班級名稱依賴於班號,所以實際的依賴情況是學號–>班號–>班級名稱,產生了傳遞依賴,進行如下拆分即可去掉依賴
1 學生表

學號 姓名 班號
120101 張三 1201

2 班級表

班號 班級名稱
1201 計科1班

總結

1NF 列不可再分
判斷2NF M-N 型關係中摻雜了M或N所屬的表的一些資料(選課(學生-課程)摻雜了課程名稱)
判斷3NF 1-N 型關係中摻雜了M或N所屬的表的一些資料(學生(班級-學生)摻雜了班級名稱)

相關數學概念

正規化

是“符合某一種級別的關係模式的集合,表示一個關係內部各屬性之間的聯絡的合理化程度”。在進入正規化的講解前,需要先了解5個概念:“函式依賴”、“完全函式依賴”、“傳遞函式依賴”“碼”、“非主屬性”。

函式依賴:

可以這麼理解(但並不是特別嚴格的定義):若在一張表中,在屬性(或屬性組)X的值確定的情況下,必定能確定屬性Y的值,那麼就可以說Y函式依賴於X,寫作 X → Y。也就是說,在資料表中,不存在任意兩條記錄,它們在X屬性(或屬性組)上的值相同,而在Y屬性上的值不同。這也就是“函式依賴”名字的由來,類似於函式關係 y = f(x),在x的值確定的情況下,y的值一定是確定的。

完全函式依賴:

在一張表中,若 X → Y,且對於 X 的任何一個真子集(假如屬性組 X 包含超過一個屬性的話),X ’ → Y 不成立,那麼我們稱 Y 對於 X 完全函式依賴,記作X F→ Y
例如:

學號 F→ 姓名
(學號,課名) F→ 分數 (注:因為同一個的學號對應的分數不確定,同一個課名對應的分數也不確定)

反之為部分函式依賴,記作X P→ Y
例如:

(學號,課名) P→ 姓名 (注:因為僅由學號就可以確定姓名)

傳遞函式依賴:
假如 Z 函式依賴於 Y,且 Y 函式依賴於 X (在『Y不包含於X,且 X 不函式依賴於 Y』這個前提下),那麼就稱 Z 傳遞函式依賴於 X ,記作 X T→ Z

碼:
設 K 為某表中的一個屬性或屬性組,若除 K 之外的所有屬性都完全函式依賴於 K(這個“完全”不要漏了),那麼我們稱 K 為候選碼,簡稱為碼。在實際中通常可以理解為:假如當 K 確定的情況下,該表除 K 之外的所有屬性的值也就隨之確定,那麼 K 就是碼。一張表中可以有超過一個碼。(實際應用中為了方便,通常選擇其中的一個碼作為主碼)

非主屬性:

包含在任何一個碼中的屬性稱為主屬性,反之則為非主屬性。

碼:表中可以唯一確定一個元組的某個屬性(或者屬性組),如果這樣的碼有不止一個,那麼大家都叫 候選碼,我們從候選碼中挑一個出來做老大,它就叫主碼。

全碼:如果一個碼包含了所有的屬性,這個碼就是全碼。

主屬性:一個屬性只要在任何一個候選碼中出現過,這個屬性就是主屬性。

非主屬性:與上面相反,沒有在任何候選碼中出現過,這個屬性就是非主屬性。

外碼:一個屬性(或屬性組),它不是碼,但是它別的表的碼,它就是外碼。

候選碼: 若關係中的某一屬性或屬性組的值能唯一的標識一個元組,而其任何真子集都不能再標識,則稱該屬性組為(超級碼)候選碼。