數據庫設計中的範式總結

看到一本書,提到:在web2.0時代,大型的網站在架構中面對海量的數據,以及頻繁的查詢時如何才能很好的處理。其中提到一句“在多對多的關係充斥的時代,第三範式首先應該被拋棄”。

看到這一句,我受到了一些震撼,因此特別總結一下:

 

第一範式(1NF):數據庫表中的字段都是單一屬性的,不可再分。這個單一屬性由基本類型構成,包括整型、實數、字符型、邏輯型、日期型等。
很顯然,在當前的任何關係數據庫管理系統(DBMS)中,傻瓜也不可能做出不符合第一範式的數據庫,因爲這些DBMS不允許你把數據庫表的一列再分成二列或多列。因此,你想在現有的DBMS中設計出不符合第一範式的數據庫都是不可能的。

第二範式(2NF):數據庫表中不存在非關鍵字段對任一候選關鍵字段的部分函數依賴(部分函數依賴指的是存在組合關鍵字中的某些字段決定非關鍵字段的情況),也即所有非關鍵字段都完全依賴於任意一組候選關鍵字。

假定選課關係表爲SelectCourse(學號, 姓名, 年齡, 課程名稱, 成績, 學分),關鍵字爲組合關鍵字(學號, 課程名稱),因爲存在如下決定關係:
  (學號, 課程名稱) → (姓名, 年齡, 成績, 學分)
  這個數據庫表不滿足第二範式,因爲存在如下決定關係:
  (課程名稱) → (學分)
  (學號) → (姓名, 年齡)
  即存在組合關鍵字中的字段決定非關鍵字的情況

 

第三範式(3NF):在第二範式的基礎上,數據表中如果不存在非關鍵字段對任一候選關鍵字段的傳遞函數依賴則符合第三範式。所謂傳遞函數依賴,指的是如果存在"A → B → C"的決定關係,則C傳遞函數依賴於A。

假定學生關係表爲Student(學號, 姓名, 年齡, 所在學院, 學院地點, 學院電話),關鍵字爲單一關鍵字"學號",因爲存在如下決定關係:
  (學號) → (姓名, 年齡, 所在學院, 學院地點, 學院電話)
  這個數據庫是符合2NF的,但是不符合3NF,因爲存在如下決定關係:
  (學號) → (所在學院) → (學院地點, 學院電話)
  即存在非關鍵字段"學院地點"、"學院電話"對關鍵字段"學號"的傳遞函數依賴。

到這裏,明白了三個範式的意義。

 

平時我們在設計數據庫時,往往以三範式作爲基準,因此很習慣的將第三範式作爲一個設計良好的數據庫的標準。

但是,在實際中,我們有的時候還必須不能遵守第三範式。

我們知道,第三範式帶來的好處就是將消除了依賴傳遞,使得表設計簡潔,清晰,單表字段、佔用空間都小。

但是第三範式的弊端在於關聯性太多,如是在對於查詢時,會造成瓶頸。

由此回到前面所說的“第三範式首先應該被拋棄”....

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