MySQL 三大正規化(設計理念 優點 不足之處)

2021-10-06 10:28:18 字數 3546 閱讀 3272

3.如何應用正規化

4.總結

乙個軟體專案基本都會用到資料庫,專案開發前期分析客戶的業務和資料處理需求,然後設計資料庫的e-r模型圖,確認需求資訊的正確和完整。再就要將e-r圖轉換為多張表,表設計後,很可能結構不合理,出現資料重複儲存,簡稱資料的冗餘,這對資料的增刪改查帶來很多後患,所以我們需要審核是否合理,就像施工圖設計後,還需要其他機構進行審核圖紙是否設計合理一樣。

如何審核呢?需要一些有關資料庫設計的理論指導規則,這些規則業界簡稱資料庫的正規化。資料庫正規化為資料庫的設計、開發提供了乙個可參考的典範。

那麼正規化的提出是為了解決什麼問題?

很明顯,這些正規化大都是為了消除冗餘而提出的,即盡可能的減少儲存成本。

一些約束、規範、規則來優化資料庫表的設計和儲存,這些規則就稱為正規化。前面提到了三大正規化的要求是啥,比較官話。下面簡而言之並舉例。

第一正規化(1nf):資料庫表的每一列都是不可分割的原子項。

假設有一張使用者資訊表,上面除了使用者編號、姓名之外,還會記錄位址資訊:

在這裡面,位址資訊一欄就是不符合第一正規化(1nf),因此,應該拆分為:

第二正規化(2nf):就是在第一正規化的基礎上所有列完全依賴於主鍵列。

完全依賴是指不能存在僅依賴主鍵一部分的列,第二正規化要求每個表只描述一件事情,確保表中的每列,都和主鍵相關。

以乙個訂單表為例,通常在**上下單時會產生包含多個商品的訂單,如下:

該訂單表符合了第一正規化,不符合第二正規化。第二正規化首先要求的是存在乙個唯一的主鍵,因為表中[商品名稱][**]是必須依賴於[訂單號][商品號]這兩個屬性的,[訂單號][商品號]都不能作為主鍵,必須將[訂單號][商品號]作為乙個復合主鍵才能滿足唯一主鍵要求。並且這樣設定後表中所有列完全依賴於主鍵列。我們增加乙個[商品類別]的屬性:

一般[商品類別]屬性只與[商品號]相關,即僅僅是依賴於主鍵的一部分。違反了第二正規化中"其他屬性必須完全依賴於主鍵"的規則,因此需要將該屬性分離到商品資訊表(其它表)中。

從上述中可以知道,當表中存在乙個復合主鍵包含多個主鍵列的時候,才會發生不符合第二正規化的情況。比如有乙個主鍵有兩個列,不能存在這樣的屬性,它只依賴於其中乙個列,這就是不符合第二正規化。

第三正規化(3nf):資料表中的非主鍵列都和主鍵直接相關,而不能間接相關。同樣,第三正規化也需要建立在第二正規化的基礎之上。

讓我們回到一開始的使用者表,如果在使用者資訊表中,同時補充一些城市的資訊:

使用者[編號]為主鍵列,這張表符合1nf、2nf,但不符合第三正規化,因為存在間接的傳遞決定關係:編號->城市->城市特點、城市人口。這裡的[城市特點][城市人口]屬性都僅僅依賴於使用者所在的城市,而不是使用者[編號]

符合第三正規化的設計是將城市相關的屬性分離到乙個城市資訊表中。將這張表拆分成使用者資訊表和城市資訊表,[城市]作為前者的外來鍵,後者的主鍵。

目前關聯式資料庫有六種正規化:第一正規化(1nf)第二正規化(2nf)第三正規化(3nf)巴斯-科德正規化(bcnf)第四正規化(4nf)第五正規化(5nf,又稱完美正規化)

滿足最低要求的正規化是第一正規化(1nf)。在第一正規化的基礎上進一步滿足更多規範要求的稱為第二正規化(2nf),其餘正規化以次類推。一般來說,資料庫只需滿足第三正規化(3nf)就行了

三正規化的具體使用上面已經提到,這裡想談一下在實際工作中的資料庫設計理念。

借助三正規化的理念,我們可以設計出很精煉的資料庫表結構。理解正規化是做好資料庫設計的一門基礎,比如選擇合適的主鍵、清晰的劃分每一列屬性等等。

而實際上的專案應用並不會完全遵循正規化的理念,原因在於:

效能原因,沒有任何冗餘的表設計會產生更多關聯以至於更多的查詢行為,這意味著會產生更多次的資料庫io操作。在一些實時互動的系統中,就會慢得讓人難以忍受。

資料儲存成本,資料庫正規化是在20世紀提出的,當時的磁碟儲存成本還很高。隨著科技發展,資料儲存的成本已經大幅度縮減,對於採用正規化設計(規避冗餘)帶來的成本縮減收益已經不那麼明顯。對一些實際資料庫應用,以時間換空間就不那麼明智了。

由於資料庫的三大正規化和資料庫的效能有時是矛盾的。沒有冗餘的資料庫設計可以做到。但是,沒有冗餘的資料庫未必是最好的資料庫,有時為了提高執行效率,就必須降低正規化標準,適當保留冗餘資料。

具體做法是:在概念資料模型設計時遵守第三正規化,降低正規化標準的工作放到物理資料模型設計時考慮。降低正規化就是增加字段,允許冗餘,達到以空間換時間的目的。

優點缺點

正規化設計

盡量的減少資料冗餘

表更新操作比反正規化化更快

表通常比反正規化化體積更小

對於查詢需要對多個表進行關聯

效能降低

更難進行索引優化

反正規化設計

減少表的關聯

更好地進行索引優化

存在資料冗餘及維護異常

對資料的修改需要更多成本

三大正規化是設計資料庫的基本理念,可以建立冗餘較小、結構合理的資料庫。如果有特殊情況,當然要特殊對待,資料庫設計最重要的是看需求跟效能,需求》效能》表結構。所以不能一味的去追求正規化建立資料庫,為了效能,需要做適當折中,適當犧牲規範化的要求,來提高資料庫的效能。

回到主題對三大正規化小結

正規化特點

1nf原子性:表中每列不可再拆分。

2nf不產生區域性依賴,一張表只描述一件事情

3nf不產生傳遞依賴,表中每一列都直接依賴於主鍵。而不是通過其它列間接依賴於主鍵。

MYSQL三大正規化

第一正規化 確保每列的原子性.如果每列 或者每個屬性 都是不可再分的最小資料單元 也稱為最小的原子單元 則滿足第一正規化.例如 顧客表 姓名 編號 位址 其中 位址 列還可以細分為國家 省 市 區等。第二正規化 在第一正規化的基礎上更進一層,目標是確保表中的每列都和主鍵相關.如果乙個關係滿足第一正規...

MySQL三大正規化

資料庫 的三個正規化 指的是什麼呢?即 屬性唯一,記錄唯一,表唯一。下面我們用一張關係圖來三者之間的關係。第一正規化 1nf 資料庫表中的字段的 屬性都是單一的,不可再分。這個單一屬性由哪些型別組成呢?主要是基本型別構成,包括整型 實數 字元型 邏輯型 日期型等。第二正規化 2nf 資料庫表 中不存...

mysql三大正規化

1.第一正規化 確保資料表中每列 字段 的原子性。如果資料表中每個欄位都是不可再分的最小資料單元,則滿足第一正規化。例如 user使用者表,包含欄位id,username,password 2.第二正規化 在第一正規化的基礎上更進一步,目標是確保表中的每列都和主鍵相關。如果乙個關係滿足第一正規化,並...