文章目錄
- 第一範式(1NF)無重複的列
- 第二範式(2NF)屬性完全依賴於主鍵
- 第三範式(3NF)屬性不能傳遞依賴於主屬性(屬性不依賴於其它非主鍵屬性)
- 第一範式舉例
- 第二範式舉例
- 第三範式舉例
設計關係型資料庫時,遵從不同的規範要求,設計出合理的關係型資料庫。這些規範被稱作範式。越高的範式資料庫的冗餘度就越低。
目前關聯式資料庫有六種範式:第一範式(1NF)、第二範式(2NF)、第三範式(3NF)、巴德斯科範式(BCNF)、第四範式(4NF)和第五範式(5NF,又稱完美範式)
滿足第二範式一定滿足第一範式,滿足第三範式一定滿足第二範式,依次類推。。。
關係型資料庫的最低要求是滿足第一範式。一般來講,資料庫滿足到第三範式就行了。
第一範式(1NF)無重複的列
資料庫表的每一列都是不可分割的原子資料項目,而不能是集合,數組,記錄等非原子資料項目。如果實體中的某個屬性有多個值時,必須拆分為不同的屬性
在任何一個關聯式資料庫中,第一範式(1NF)是對關係模式的設計基本要求,一般設計中都必須滿足第一範式(1NF)。不過有些關聯式模式中突破了1NF的限制,這種稱為非1NF的關聯式模式。換句話說,是否必須滿足1NF的最低要求,主要依賴於所使用的關聯式模式。
第二範式(2NF)屬性完全依賴於主鍵
第二範式(2NF)是在第一範式(1NF)的基礎上建立起來的,即滿足第二範式(2NF)必須先滿足第一範式(1NF)。
當存在多個主鍵的時候,才會發生不符合第二範式的情況。比如現在有兩個主鍵,不能存在這樣的屬性,它只依賴於其中一個主鍵,這就是不符合第二範式。
如果存在不符合第二範式的情況,那麼這個屬性和主關鍵字的這一部分應該分離出來形成一個新的實體,新實體與原實體之間是一對多的關係。
第三範式(3NF)屬性不能傳遞依賴於主屬性(屬性不依賴於其它非主鍵屬性)
第二範式(3NF)是在第一範式(2NF)的基礎上建立起來的,即滿足第二範式(3NF)必須先滿足第一範式(2NF)。
如果某一屬性依賴於其他非主鍵屬性,而其他非主鍵屬性又依賴於主鍵,那麼這個屬性就是間接依賴於主鍵,這被稱作傳遞依賴於主屬性。
下面以一個學校的學生系統為例分析說明這幾個範式的應用。首先我們確定一下要設計的內容包括那些。學號、姓名、年齡、性別、電話、系別、系辦地址、系辦電話、課程、學分、成績,等資訊。
第一範式舉例
在當前的任何關聯式資料庫管理系統(DBMS)中,傻瓜也不可能做出不符合第一範式的資料庫,因為這些DBMS不允許你把資料庫表的一列再分成二列或多列。因此,你想在現有的DBMS中設計出不符合第一範式的資料庫都是不可能的。
雖然第一範式一定是滿足的,但是為了加強理解,還是舉例說明一下
如果在某個學生的“電話”屬性中填入了“1585858588 025-58318888”,那麼就違反了第一範式。學生電話屬性違反了原子性,它還可以再分,分成手機和有線電話兩個屬性。
第二範式舉例
我們把(學號、姓名、年齡、性別、電話、系別、系辦地址、系辦電話、課程、學分、成績)這些資訊放到一個表中,其中“學生學號”和“課程”兩個屬性是主鍵。
這樣不符合第二範式。出現了屬性依賴於部分主鍵的情況(比如”姓名“只依賴於”學號“,和“課程”屬性無關)
那麼違反了第二範式有什麼問題呢?下面來分析一下:
資料冗餘:同一門課程由n個學生選修,"學分"就重複n-1次;同一個學生選修了m門課程,“姓名”和“年齡”就重複了m-1次。
更新異常:1)若調整了某門課程的學分,資料表中所有行的"學分"值都要更新,否則會出現同一門課程學分不同的情況。
2)假設要開設一門新的課程,暫時還沒有人選修。這樣,由於還沒有"學號"關鍵字,課程名稱和學分也無法記錄入資料庫。
刪除異常 :假設一批學生已經完成課程的選修,這些選修記錄就應該從資料庫表中刪除。但是,與此同時,課程名稱和學分資訊也被刪除了。很顯然,這也會導致插入異常。
解決方案 :
分成三個表:
學生:Student(學號,姓名,年齡,性別,電話,系別,系辦地址、系辦電話)
課程:Course(課程,學分)
選課關係:SelectCourse(學號,課程,成績)
第三範式舉例
繼續看上面改善過了的關係結構。由於Student表只有一個主鍵“學號”,所以存在如下決定關係:
(學號)→ (姓名,年齡,性別,電話,系別,系辦地址、系辦電話)
但是還存在下面的決定關係:
(學號) → (系別)→(系辦地點,系辦電話)
即存在非關鍵字段"系辦地點"、"系辦電話"對關鍵字段"學號"的傳遞依賴。它也會存在資料冗餘、更新異常、插入異常和刪除異常的情況(這裡不作分析,可以參照第二範式的分析)
解決方案:
繼續把學生表分成兩個表:
學生:(學號,姓名,年齡,性別,電話,系別)
系別:(系別,系辦地址,系辦電話)