數據庫系統筆記 | 關係設計三大範式

第一範式(1NF)

定義:數據庫表的每一列都是不可分割的原子數據項,而不能是集合,數組,記錄等非原子數據項。如果實體中的某個屬性有多個值時,必須拆分爲不同的屬性。

說明:E-R模型允許實體集和聯繫集具有某些程度的子結構,比如多值屬性(一個教師有多個電話號碼)、組合屬性(包含多個子屬性,比如地址包含城市和街道等)。我們在將E-R模型轉換成表時,對於這些子結構的一般處理規則是:多值屬性用多個元組來存儲;組合屬性中的每個子屬性作爲單獨的屬性,也就是表中的單獨列。這個一般處理規則其實也是在滿足第一範式的約束。

舉例:設計如下Instructor1這張表來存儲大學教師信息,每位教師包括教師ID、名字、身份證ID,身份證過期時間、家庭地址、配偶名字、配偶單位這些信息,教師ID是這張表的主鍵。

Instructor1

  ID Name      Card      Card_Date           Adress Partner_Name Partner_Comp
1023 Jack    231322**12     08.23.2033 Beijing Wenhua road         Lina    Baidu

問題:上面這張表並不滿足第一範式,因爲Adress這個屬性其實包含了城市和街道兩個子屬性,應該拆分成獨立的屬性。將其改進後滿足第一範式:

Instructor2

ID Name      Card   Card_Date           City      Street Partner_Name Partner_Comp
1023 Jack  231322**12     08.23.2033      Beijing Wenhua road         Lina    Baidu

第二範式(2NF)

定義滿足第一範式前提,第二範式(2NF)要求實體的所有非主鍵屬性完全依賴於每一個候選主鍵。所以只有當存在多個主鍵的時候,纔會發生不符合第二範式的情況。比如有兩個候選主鍵時,不能存在這樣的屬性,它只依賴於其中一個主鍵,這就是不符合第二範式。

舉例:Instructor2雖然滿足第一範式,但是並不滿足第二範式,因爲教師ID和身份證ID都是候選主鍵,但是身份證過期時間這個屬性只依賴於身份證ID這個屬性,爲滿足第二範式應該將教師身份證信息應該用單獨的表來保存。

Instructor3

ID Name Card           City      Street Partner_Name Partner_Comp
1023 Jack 231322*12      Beijing Wenhua road         Lina    Baidu

Card1

     Card     Card_Date
 231322**12     08.23.2033

第三範式(3NF)

定義滿足第二範式前提,屬性不能傳遞依賴於主鍵屬性。如果某一屬性依賴於其他非主鍵屬性,而其他非主鍵屬性又依賴於主鍵,那麼這個屬性就是間接依賴於主鍵,這被稱作傳遞依賴於主鍵屬性,即不滿足第三範式。

舉例:Instructor3雖然滿足第二範式,但是因爲配偶單位(Partner_Comp)這個屬性依賴於配偶名字(Partner_name)屬性,配偶名字屬性又依賴於主鍵屬性教師ID,即配偶單位屬性傳遞依賴於主鍵教師ID,所以不滿足第三範式。改進後的版本滿足第三範式:

Instructor4

ID Name Card           City      Street
1023 Jack 231322*12      Beijing Wenhua road

Partner1

ID Partner_Name Partner_Comp
1023         Lina    Baidu

Card1

     Card     Card_Date
 231322**12     08.23.2033

數據庫關係(表)設計一般需要滿足第三範式。另一方面,這三大範式只是一般設計數據庫的基本理念,可以建立冗餘較小、結構合理的數據庫。如果有特殊情況,當然要特殊對待,數據庫設計最重要的是看需求跟性能,需求>性能>表結構。所以不能一味的去追求範式建立數據庫。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章