目錄
1 什麼是數據庫泛型?
數據庫泛型就是數據庫應該遵循的規則。數據庫泛型也稱作數據庫範式。數據庫範式是數據庫設計需要滿足的一些規範。滿足這些規範可以使數據庫變得簡潔、結構清晰,並且在操作數據庫時不會發生異常操作。
目前,關係型數據庫最常用的四種範式分別是第一範式、第二範式、第三範式和BCN範式。
應用數據庫範式可以帶來許多好處,但是最重要的好處歸結爲三點:
1)減少數據冗餘(這是最主要的好處,其他好處都是由此而附帶的)
2)消除異常(插入異常,更新異常,刪除異常)
3)讓數據組織的更加和諧…
但是數據庫範式絕對不是越高越好,範式越高,意味着表越多,多表聯合查詢的機率就越大,SQL的效率就變低。
2 第一範式:無重複的列
第一範式即數據庫表中每一列都是不可分割的基本數據項,同一列中不能有多個值,即實體中的某個屬性不能有多個值或者不能有重複的值。
在第一範式中,每一行只包含了一個示例的信息,簡而言之就是無重複的列。
如上圖,是一個數據庫表的列信息,第一範式的要求即是:姓名、年齡和學號這三個屬性沒有重複的,且每個屬性都是一個單一的值,不能包含其他值,例如:在第一範式中,我們不能將姓名和年齡合起來作爲一個屬性。這就是數據庫的第一範式。
如果一個數據庫連第一範式都不滿足的話,那麼它將不能被成爲關係型數據庫。
第一範式保證確保了數據庫是關係型數據庫。
在滿足第一範式的情況下,我們將數據庫進行進一步的細化,就可以使數據庫滿足第二範式。
接下來看第二範式的介紹。
3 第二範式:屬性完全依賴於主鍵(針對聯合主鍵)
第第一範式的基礎上,纔有了第二範式。即如果一個數據庫滿足第二範式,那麼它肯定滿足第一範式。
第二範式要求數據庫表中的每個實例都能被唯一的區分。爲實現區分,通常在數據庫中要爲每個實例存儲一個唯一的標識符。這個唯一屬性列通常被稱爲主鍵或者主碼。
舉類:
例如一個學生表中有學號、院系號和院系名這三個字段。在大部分的學校管理中學號是可以決定院系名的,而院系號也是可以決定院系名的。因此這個表是不滿足第二範式的。現在將該表進行細化,細化之後生成兩個表,第一個表有學號和院系名,第二個表有院系號和院系名。這樣就滿足了第二個範式。
第二範式消除了局部依賴。
4 第三範式:屬性不依賴於其他非主屬性
第三範式是在第二範式的基礎上建立起來的。
要求一個數據庫表中不包含已在其他表中已包含的非主關鍵字信息。
例如:學生生關係表爲Student(學號, 姓名, 年齡, 所在學院, 學院地點, 學院電話),學號是主鍵,但是學院電話只依賴於所在學院,並不依賴於主鍵學號,因此該設計不符合第三範式,應該把學院專門設計成一張表,學生表和學院表,兩個是一對多的關係。
第三範式消除了傳遞依賴。
注意:
通常情況下,如果一個數據庫能夠滿足第三範式的要求,那麼這個數據庫就是一個很好的數據庫了。當一個數據庫達到第三範式的要求,數據庫中基本上沒有冗餘的信息了。但有時候爲了滿足查詢的速度要求,可以有意識的讓某些表有些冗餘。這時爲了提高數據庫的性能。
因此在設計數據庫的時候,不一定拘泥於第三範式或者是BCN範式。只要數據庫的設計讓整個系統的性能得到提高,那麼數據庫就是一個設計良好的數據庫。
5 BCN範式:每個表中只有一個候選鍵
簡單來說,BCN範式是在第三範式的基礎上的一種特殊情況,即每個表中只有一個候選鍵(在一個數據庫中每行的值都不同,則可稱爲候選鍵)
示例見詳細舉例。
BCN範式消除了主鍵對候選鍵的依賴。
6 第四範式:消除表中的多值依賴
簡單來說,第四範式就是要消除表中的多值依賴,也就是說可以減少維護數據一致性的工作。
示例見詳細舉例。
第四範式是BCN範式的推廣。
7 詳細舉例
首先我們先看一個第一範式的數據庫,如下:
第一範式要求不能有重複的列,由於員工信息中有AddressID,並且部門也有AddressID,因此將員工的住址信息抽出來單獨作做一張表,來滿足第一範式。
第二範式要求屬性完全依賴於主鍵,但是在上述員工信息表noNF中,departmentName和departmentDescription並不完全依賴於主鍵。因此將部門的相關信息提取出來:
第三範式要求屬性不依賴於其他非主屬性,即要求一個數據庫表中不包含已在其他表中已包含的非主關鍵字信息。但是jobDescription已經包含在了表job中,因此將其剔除出來。
在noNF中,email不可能有重複的,這樣的話在noNF中,候選主鍵爲email。因此爲了滿足BCN範式,要將email單獨建一張表。
noNF表中的skill技能這個字段,有的人是“java,mysql”,有的人描述的是“Java,MySQL”,這樣數據就不一致了,解決辦法就是將多值屬性放入一個新表,所以滿足第四範式的關係圖如下:
從上面對於數據庫範式進行分解的過程中不難看出,應用的範式越高,表越多。表多會帶來很多問題:
1 查詢時需要連接多個表,增加了SQL查詢的複雜度
2 查詢時需要連接多個表,降低了數據庫查詢性能
因此,並不是應用的範式越高越好,要看實際情況而定。第三範式已經很大程度上減少了數據冗餘,並且基本預防了數據插入異常,更新異常,和刪除異常了。