1. 程式人生 > 其它 >MySQL: 資料庫設計 - 三正規化 、反三正規化

MySQL: 資料庫設計 - 三正規化 、反三正規化

1 資料庫三正規化(空間最省)

概念: 三正規化就是設計資料庫的規則.

  • 為了建立冗餘較小、結構合理的資料庫,設計資料庫時必須遵循一定的規則。在關係型資料 庫中這種規則就稱為正規化。正規化是符合某一種設計要求的總結。要想設計一個結構合理的關係型資料庫,必須滿足一定的正規化
  • 滿足最低要求的正規化是第一正規化(1NF)。在第一正規化的基礎上進一步滿足更多規範要求的 稱為第二正規化(2NF) , 其餘正規化以此類推。一般說來,資料庫只需滿足第三正規化(3NF)就行了

2 第一正規化 1NF

概念:

  •   原子性, 做到列不可拆分
  •   第一正規化是最基本的正規化。資料庫表裡面欄位都是單一屬性的,不可再分, 如果資料表中每個 欄位都是不可再分的最小資料單元,則滿足第一正規化。

  

  • 示例:
    • 地址資訊表中, contry這一列,還可以繼續拆分,不符合第一正規化

3 第二正規化 2NF

概念:

  1.在第一正規化的基礎上更進一步,目標是確保表中的每列都和主鍵相關

  2.一張表只能描述一件事.

示例:

  1.學員資訊表中其實在描述兩個事物 , 一個是學員的資訊,一個是課程資訊

  2,如果放在一張表中,會導致資料的冗餘,如果刪除學員資訊, 成績的資訊也被刪除了

4 第三正規化 3NF

  • 概念:
    • 消除傳遞依賴
    • 表的資訊,如果能夠被推匯出來,就不應該單獨的設計一個欄位來存放
  • 示例
    •   通過number 與 price欄位就可以計算出總金額,不要在表中再做記錄(空間最省)

5 資料庫反三正規化

<1>  概念

  •       反正規化化:通過增加冗餘或重複的資料,來提高資料庫的讀效能
  • 浪費儲存空間,節省查詢時間 (以空間換時間)

<2>  什麼是冗餘欄位 ?

  設計資料庫時,某一個欄位屬於一張表,但它同時出現在另一個或多個表,且完全等同於它在其本 來所屬表的意義表示,那麼這個欄位就是一個冗餘欄位

<3>  反三正規化示例

  • 兩張表,使用者表、訂單表,使用者表中有欄位name,而訂單表中也存在欄位name。
  • 使用場景
    • 當需要查詢“訂單表”所有資料, 並且只需要“使用者表”的name欄位時, 沒有冗餘欄位, 就需要去join 連線使用者表,假設表中資料量非常的大, 那麼會這次連線查詢就會非常大的消耗系統的效能.
    • 這時候冗餘的欄位就可以派上用場了, 有冗餘欄位我們查一張表就可以了.

6 總結

建立一個關係型資料庫設計,我們有兩種選擇

1  儘量遵循正規化理論的規約,儘可能少的冗餘欄位,讓資料庫設計看起來精緻、優雅、讓人心醉。

2  合理的加入冗餘欄位這個潤滑劑,減少join,讓資料庫執行效能更高更快。