MySQL: 資料庫設計 - 三正規化 、反三正規化
阿新 • • 發佈:2021-07-17
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,讓資料庫執行效能更高更快。