在設計與操做維護數據庫時,最關鍵的問題就是要確保數據可以正確地分佈到數據庫的表中。使用正確的數據結構,不只有助於對數據庫進行相應的存取操做,還能夠極大地簡化應用程序中的其餘內容(查詢、窗體、報表、代碼等),按照「數據庫規範化」對錶進行設計,其目的就是減小數據庫中的數據冗餘,以增長數據的一致性。數據庫
泛化時在識別數據庫中的一個數據元素、關係以及定義所需的表和各表中的項目這些初始工做以後的一個細化的過程。常見的範式有1NF、2NF、3NF、BCNF以及4NF。下面對這幾種常見的範式進行簡要分析。數據結構
一、1NF(第一範式)函數
第一範式是指數據庫表中的每一列都是不可分割的基本數據項,同一列中不能有多個值,即實體中的某個屬性不能有多個值或者不能有重複的屬性。設計
若是出現重複的屬性,就可能須要定義一個新的實體,新的實體由重複的屬性構成,新實體與原實體之間爲一對多關係。第一範式的模式要求屬性值不可再分裂成更小部分,即屬性項不能是屬性組合或是由一組屬性構成。blog
簡而言之,第一範式就是無重複的列。例如,由「職工號」「姓名」「電話號碼」組成的表(一我的可能有一部辦公電話和一部移動電話),這時將其規範化爲1NF能夠將電話號碼分爲「辦公電話」和「移動電話」兩個屬性,即職工(職工號,姓名,辦公電話,移動電話)。class
二、2NF(第二範式)基礎
第二範式(2NF)是在第一範式(1NF)的基礎上創建起來的,即知足第二範式(2NF)必須先知足第一範式(1NF)。第二範式(2NF)要求數據庫表中的每一個實例或行必須能夠被惟一地區分。爲實現區分一般須要爲表加上一個列,以存儲各個實例的惟一標識。程序
若是關係模型R爲第一範式,而且R中的每個非主屬性徹底函數依賴於R的某個候選鍵,則稱R爲第二範式模式(若是A是關係模式R的候選鍵的一個屬性,則稱A是R的主屬性,不然稱A是R的非主屬性)。im
例如,在選課關係表(學號,課程號,成績,學分),關鍵字爲組合關鍵字(學號,課程號),但因爲非主屬性學分僅依賴於課程號,對關鍵字(學號,課程號)只是部分依賴,而不是徹底依賴,所以此種方式會致使數據冗餘以及更新異常等問題,解決辦法是將其分爲兩個關係模式:學生表(學號,課程號,分數)和課程表(課程號,學分),新關係經過學生表中的外關鍵字課程號聯繫,在須要時進行鏈接。數據
三、3NF(第三範式)
若是關係模型R是第二範式,且每一個非主屬性都不傳遞依賴於R的候選鍵,則稱R是第三範式的模式。
以學生表(學號,姓名,課程號,成績)爲例,其中學生姓名無重名,因此該表有兩個候選碼(學號,課程號)和(姓名,課程號),故存在函數依賴:學號——>姓名,(學號,課程號)——>成績,惟一的非主屬性成績對碼不存在部分依賴,也不存在傳遞依賴,因此屬性屬於第三範式。
四、BCNF(BC範式)
它構建在第三範式的基礎上,若是關係模型R是第一範式,且每一個屬性都不傳遞依賴於R的候選鍵,那麼稱R爲BCNF的模式。
假設倉庫管理關係表(倉庫號,存儲物品號,管理員號,數量),知足一個管理員只在一個倉庫工做;一個倉庫能夠存儲多種物品,則存在以下關係:
(倉庫號,存儲物品號)——>(管理員號,數量)
(管理員號,存儲物品號)——>(倉庫號,數量)
因此,(倉庫號,存儲物品號)和(管理員號,存儲物品號)都是倉庫管理關係表的候選碼,表中惟一非關鍵字段爲數量,它是符合第三範式的。可是,因爲存在以下決定關係:
(倉庫號)——>(管理員號)
(管理員號)——>(倉庫號)
即存在關鍵字段決定關鍵字段的狀況,所以其不符合BCNF。把倉庫管理關係表分解爲兩個關係表倉庫管理表(倉庫號,管理員號)和倉庫表(倉庫號,存儲物品號,數量),這樣這個數據庫表是符合BCNF的,並消除了刪除異常、插入異常和更新異常。
五、4NF(第四範式)
設R是一個關係模型,D是R上的多值依賴集合。若是D中存在凡多值依賴X->Y時,X必是R的超鍵,那麼稱R是第四範式的模式。
例如,職工表(職工編號,職工孩子姓名,職工選修課程),在這個表中,同一個職工可能會有多個職工孩子姓名,一樣,同一個職工也可能會有多個職工選修課程,即這裏存在着多值事實,不符合第四範式。若是要符合第四範式,只須要將上表分爲兩個表,使它們只有一個多值事實,例如職工表一(職工編號,職工孩子姓名),職工表二(職工編號,職工選修課程),兩個表都只有一個多值事實,因此符合第四範式。
拓展:各範式的關係圖以下所示: