1. 程式人生 > Mysql入門教學 >13 MySQL 資料表設計規範

13 MySQL 資料表設計規範

上一小節介紹瞭如何設計資料表,併合理選擇欄位資料型別新建資料表,本小節來介紹資料表的設計規範,主要遵循資料表設計三正規化和適當的反正規化化。

1.第一設計正規化

第一設計正規化要求表中欄位都是不可再分的,如果實體中的某個屬性有多個值時,必須拆分為不同的屬性 。通俗理解即一個欄位只儲存一項資訊,如下圖所示,其中聯絡方式可以拆分為手機、郵箱、固定電話,所以下圖不符合資料表第一設計正規化要求:

圖片描述

糾正之後符合第一設計正規化要求的如下圖所示:

圖片描述

2.第二設計正規化

第二設計正規化要求表中必須存在業務主鍵,並且全部非主鍵依賴於業務主鍵。第二正規化(2NF)是在第一正規化(1NF)的基礎上建立起來的,即滿足第二正規化(2NF)必須先滿足第一正規化(1NF)。第二正規化(2NF)要求資料庫表中的每個例項或行必須可以被惟一地區分

,為實現區分通常需要我們設計一個主鍵來實現(這裡的主鍵不包含業務邏輯)。

即滿足第一正規化前提,當存在多個主鍵的時候,才會發生不符合第二正規化的情況。比如有兩個主鍵,不能存在這樣的屬性,它只依賴於其中一個主鍵,這就是不符合第二正規化。通俗理解是任意一個欄位都只依賴表中的同一個欄位。(涉及到表的拆分)。如下圖資料表字段中 id 即為業務主鍵:

圖片描述

3.第三設計正規化

滿足第三正規化(3NF)必須先滿足第二正規化(2NF),簡而言之,第三正規化(3NF)要求一個數據庫表中不包含已在其它表中已包含的非主鍵欄位。就是說表的資訊如果能夠被推匯出來,就不應該單獨的設計一個欄位來存放(能儘量外來鍵 join 就用外來鍵 join)。很多時候我們為了滿足第三正規化

往往會把一張表分成多張表

即滿足第二正規化前提,如果某一屬性依賴於其他非主鍵屬性,而其他非主鍵屬性又依賴於主鍵,那麼這個屬性就是間接依賴於主鍵,這被稱作傳遞依賴於主屬性。 通俗解釋就是一張表最多隻存兩層同類型資訊
如下圖所示的商品表不符合第三設計正規化:

圖片描述

如圖所示,商品分類和分類描述欄位冗餘,每次新增相同分類商品都會使資料重複,浪費儲存空間,可以將表拆分成如下三個表:

圖片描述

遵循資料表設計三正規化可以避免欄位值的重複儲存提升儲存效率節省儲存空間,將各個資料之間分的更細,增加表的冗餘性,為後期維護和拓展打下堅實的基礎。高效能的 MySQL 資料庫第一步就是從資料表合理設計開始的。

4.反正規化化設計

沒有冗餘的資料庫未必是最好的資料庫,有時為了提高執行效率,提高讀效能,就必須降低正規化標準,適當保留冗餘資料。具體做法是: 在概念資料模型設計時遵守第三正規化,降低正規化標準的工作放到物理資料模型設計時考慮。降低正規化就是增加欄位,減少了查詢時的關聯,提高查詢效率,因為在資料庫的操作中查詢的比例要遠遠大於 DML 的比例。但是反正規化化一定要適度,並且在原本已滿足三正規化的基礎上再做調整的。

如下圖所示,上面的例子可以稍微反正規化化設計一下,可以減少實際資料查詢的連表查詢操作,提升效率:

圖片描述

5.小結

本節介紹了資料庫設計三正規化,實際工作中,只要遵循資料庫設計第三正規化要求即可,資料表的良好設計可以為今後更復雜的業務邏輯減少不必要的麻煩,適當反正規化化設計可以提升查詢效率工作效率