1. 程式人生 > 實用技巧 >資料庫設計之正規化

資料庫設計之正規化

資料庫設計總共分為6個階段,如下圖所示,而資料庫的邏輯結構設計需要用到正規化,下面就一起來了解下什麼是正規化。

正規化解決的問題:

1、資料冗餘

2、插入異常

3、刪除異常

4、更新異常

資料庫表如果設計不當,一來可能會佔用過多的空間,影響查詢的效率,二來也會為後面的程式設計帶來不必要的麻煩,三來還會影響資料庫的完整性。因此,有必要對資料庫表進行正規化的優化。

下面介紹正規化的定義,以及定義的部分解釋。

  • 第一正規化(1NF):符合1NF的關係中的每個屬性都不可再分。
  • 第二正規化(2NF):消除了非主屬性對於碼的部分函式依賴。

“函式依賴”:在屬性(或屬性組)X確定的情況下,必定能確定屬性Y的值,即Y依賴於X,記作X -> Y。舉個栗子,函式f(X) = Y,X通過函式f()對映到Y,Y函式依賴於X。或者如下圖,知道城市就能知道省份,所以省份函式依賴於城市。

“完全函式依賴”:若X -> Y,且對於X的任何一個真子集X’,X’ -> Y 不成立,則Y對於X完全函式依賴。

“部分函式依賴”:若X -> Y,但Y並不完全依賴於X,則稱Y部分依賴於X。舉個栗子,完全函式依賴:{學號,課程號}-->成績,學號和課程號可以決定成績,但是單獨的學號或者單獨的課程號不能決定成績;部分函式依賴:{學號,課號}-->姓名,只有學號能決定姓名。

“碼”:設K為某表中的一個屬性或屬性組,若除K之外的所有屬性都完全函式依賴於K,那麼稱K為候選碼,簡稱碼。

“主屬性”:包含在任何一個碼中的屬性稱為主屬性。

  • 第三正規化(3NF):消除了非主屬性對於碼的傳遞函式依賴。

至少要有三個屬性才可能存在傳遞的函式依賴關係

  • BCNF(Boycee Codd Normal Form)正規化:所有非主屬性對每一個候選鍵都是完全函式依賴;所有的主屬性對每一個不包含它的候選鍵,也是完全函式依賴;沒有任何屬性完全依賴於非候選鍵的任何一組屬性。

候選鍵(candidate key):是某個關係變數的一組屬性所組成的集合,它需要同時滿足下面兩個條件:
1、這個屬性集合始終能夠確保在關係中能唯一標識元組。
2、在這個屬性集合中找不出合適的真子集能夠滿足條件。
滿足第一個條件的屬性集合稱為超鍵,因此我們也可以把候選鍵定義為"最小超鍵",即不含有多餘屬性的超鍵。

總結:

1NF: 欄位是最小的的單元不可再分
2NF:滿足1NF,表中的欄位必須完全依賴於全部主鍵而非部分主鍵 (一般我們都會做到)
3NF:滿足2NF,非主鍵外的所有欄位必須互不依賴
4NF:滿足3NF,消除表中的多值依賴


後續:
主鍵:唯一表示表中的某一行的屬性或屬性組,一個表只能有一個主鍵,但是可以有多個候選索引
主碼:當有多個候選碼時,可以選定一個作為主碼,選定的候選碼稱為主鍵,主碼可以有多個
碼:唯一標識實體的屬性,它是整個實體集的性質。包括超碼,候選碼,主碼。
超碼:如果K是一個超碼,那麼K的任意超集也是超碼,即如果K是超碼,那麼包含K的集合也是超碼。
候選碼:最小超碼,包含K的集合都不能是候選碼