關於數據庫設計的三範式與反三範式

範式(數據庫設計範式,數據庫的設計範式)是符合某一種級別的關係模式的集合。構造數據庫必須遵循必定的規則。在關係數據庫中,這種規則就是範式。關係數據庫中的關係必須知足必定的要求,即知足不一樣的範式。數據庫

1、第一範式 一個字段只記錄一件事

在任何一個關係數據庫中,第一範式(1NF)是對關係模式的基本要求,不知足第一範式(1NF)的數據庫就不是關係數據庫。數據庫設計

所謂第一範式(1NF)是指數據庫[表]的每一列都是不可分割的基本數據項,同一列中不能有多個值,即[實體]中的某個屬性不能有多個值或者不能有重複的屬性。設計

例如一個字段NAME保存了「李白,字太白」,這樣就不符合第一範式,由於存儲了多個值,可改成兩個字段,分別保存李白和太白。code

2、第二範式 知足第一範式的前提下,一個表只記錄一件事

在知足第一範式的基礎上,不容許部分依賴。效率

所謂部分依賴,指的是當主鍵由兩個以上的字段組成的時候。其餘非主屬性不能僅僅依賴主鍵的一部分。好比學號課程分數姓名這四個字段。咱們把(學號課程)組合起來做爲主鍵,能夠發現,分數是依賴於所有主鍵的,而姓名僅僅依賴於學號,和課程沒有半毛錢關係,這就叫部分依賴。基礎

不知足第二範式會存在一些問題:引用

  • 數據冗餘:每條記錄都含有相同信息;數據

  • 刪除異常:刪除全部學生成績,就把課程信息全刪除了;查詢

  • 插入異常:學生未選課,沒法記錄進數據庫;異常

  • 更新異常:調整課程學分,全部行都調整。

    若是按照第二範式設計,能夠拆分紅
    學生表:student(學號, 姓名);
    課程表:course(課程號, 學分);
    選課關係表:student_course(學號, 課程號, 成績)。

3、第三範式 知足第1、第二範式的前提下:從表的外鍵必須引用的主表的主鍵。

在知足第二範式的基礎上,不能存在依賴傳遞。

好比一張表有學號姓名課程號課程名稱,這幾個字段。課程號依賴於學號,而課程名稱依賴於課程號。因此課程名稱傳遞依賴於學號

可能會存在問題:

  • 數據冗餘:有重複值;
  • 更新異常:有重複的冗餘信息,修改時須要同時修改多條記錄,不然會出現數據不一致的狀況 。

若是按照第三範式進行設計,能夠拆分紅

學生表:student(學號, 姓名, 課程號);

課程表:course(課程號, 課程名稱)。

4、反三範式

在進行數據庫設計時,不能古板的一味迎合範式。不難看出,範式的等級越高,拆分的表就越多,查詢操做也就越複雜,查詢的效率也會受到影響。因此在有些時候適當下降範式標準,增長一些冗餘字段,雖然會增長一些空間佔用,以及對冗餘數據的維護工做,但帶來的效率的提高是很值得的,這就是所謂的反三範式。

相關文章
相關標籤/搜索