一、正規化化的概念
正規化化(normalization)的目標是消除資料冗餘,減小物理儲存空間。
常用的正規化有以下3種:
1. 第一正規化(1nf)
在任何乙個關聯式資料庫中,1nf是對關係模式的基本要求,不滿足1nf的資料庫就不是關聯式資料庫。
所謂1nf是指資料庫表的每一列都是不可分割的基本資料項,同一列中不能有多個值,即實體中的某個屬性不能有多個值或者不能有重複的屬性。如果出現重複的屬性,就可能需要定義乙個新的實體,新的實體由重複的屬性構成,新實體與原實體之間為一對多關係。在1nf中表的每一行只包含乙個例項的資訊。
例如,對於員工資訊表,不能將員工資訊都放在一列中顯示,也不能將其中的兩列或多列在一列中顯示;員工資訊表的每一行只表示乙個員工的資訊,乙個員工的資訊在表中只出現一次。簡而言之,第一正規化就是無重複的列。
2. 第二正規化(2nf)
2nf是在1nf的基礎上建立起來的,即滿足2nf必須先滿足1nf。2nf要求資料庫表中的每個例項或行必須可以被唯一地區分。為實現區分通常需要為表加上乙個列,以儲存各個例項的唯一標識。
例如,員工資訊表中加上了「員工編號」列,因為每個員工的員工編號是唯一的,因此每個員工可以被唯一區分。這個唯一屬性列被稱為主關鍵字或主鍵、主碼。
2nf要求實體的屬性完全依賴於主關鍵字。所謂完全依賴是指不能存在僅依賴主關鍵字一部分的屬性,如果存在,那麼這個屬性和主關鍵字的這一部分應該分離出來形成乙個新的實體,新實體與原實體之間是一對多的關係。為實現區分通常需要為表加上乙個列,以儲存各個例項的唯一標識。簡而言之,第二正規化就是非主屬性非部分依賴於主關鍵字。
3. 第三正規化(3nf)
3nf要求乙個資料庫表中不包含已在其它表中已包含的非主關鍵字資訊。簡而言之,3nf就是屬性不依賴於其它非主屬性。 滿足3nf必須先滿足2nf。
例如,存在乙個部門資訊表,有「部門編號」、「部門名稱」、「部門簡介」等列。那麼在員工資訊表中列出「部門編號」後就不能再將「部門名稱」、「部門簡介」等與部門有關的資訊再加入員工資訊表中。如果不存在部門資訊表,則3nf也應該構建它,否則就會有大量的資料冗餘。
二、正規化化的優點
1. 從設計角度
正規化化之後,每個表的結構非常明確,對於設計人員來說非常清晰明了,更易於修改系統的架構。
2. 從效能的角度
正規化化之後,每個表變成最窄,因此每一頁可以容納更多的行。查詢、排序、索引的開銷都會降低。
三、反正規化化
1. 正規化化的缺點
當資料來自不同的表,需要join,當基表的記錄非常多時,這也將是乙個消耗資源的重要原因。此外,頻繁查詢一些派生列時需要臨時計算,這也會影響效能,而且可能會使查詢的設計過程變得複雜。
例如:對於一張超市pos機的流水單明細表,3nf之後只記錄商品id、單價、數量、單項折扣等資訊,查詢時才臨時產生乙個單項金額。 而這張流水單明細表對應的流水單主表,同樣也不會儲存金額,在查詢時通過聚合函式臨時計算。
對於上述表結構,如果頻繁查詢金額,並且表的記錄數非常多,效能就會受影響。
2. 反正規化化(de-normalization)
在正規化化的架構遇到效能問題時,就要考慮放寬正規化的要求。通常要仔細權衡,將更新(增、刪、改)與查詢這兩者的開銷進行對比。
例如,在資料更改時就直接計算聚合值,而不是在查詢時再臨時計算。
3. 反正規化化的優勢
(1)減少join的數量
(2)減少外來鍵的數量
(3)減少索引的數量,從而節省儲存空間
(4)加快查詢速度,因為聚合值已經預先計算
(5)某些情況下可能減少表的數目
四、反正規化化的缺點
1. 雖然加速查詢,但降低寫入速度。
2. 需要考慮應用程式是否適應。
3. 可能需要增加物理表。
4. 可能使**變得簡單,也可能更複雜。
五、正規化化 vs. 反正規化化
正規化化對錶結構的嚴格要求,可能會影響效能。在設計階段,務必權衡查詢與更新(增刪改)的開銷對比。
1. 考慮正規化化
較多的更新,而較少的查詢時。
2. 考慮反正規化化
較少的更新,而較多的查詢時。
正規化化和反正規化化各有優勢與短板,需要從儲存空間、維護的開銷、查詢的開銷等方面綜合考量。
mysql 逆正規化化 mysql優化
一 mysql優化主要體現在四個方面。設計 儲存引擎 設計型別 正規化與逆正規化 功能 索引 快取 分區分表 合理sql 測試 經驗 1 儲存引擎 在建立表的時候我們使用sql語句,create table tablename engine myisam innodb 儲存引擎是engine還是in...
mysql 正規化化 MySQL 正規化和反正規化
1.第一正規化 1nf 列不能再拆分 原子性,字段不可分 列的資訊 只要是關係型資料庫,就自動滿足1nf 2.第二正規化 2nf 主鍵唯一,且被依賴 在第一正規化基礎上建立的,即滿足第二正規化的必須先滿足第一正規化。要求db表中的每個例項或行必須可以被唯一區分,通常設計乙個主鍵來實現,其他屬性完全依...
mysql 正規化化 Mysql正規化與反正規化
第一正規化 1nf 第一正規化,強調屬性的原子性約束,要求屬性具有原子性,不可再分解。第二正規化 2nf 第二正規化,強調記錄的唯一性約束,表必須有乙個主鍵,並且沒有包含在主鍵中的列必須完全依賴於主鍵,而不能只依賴於主鍵的一部分。舉個例子 版本表 版本編碼,版本名稱,產品編碼,產品名稱 其中主鍵是 ...