1. 程式人生 > >MySQL中資料中設計中的正規化與反正規化

MySQL中資料中設計中的正規化與反正規化

設計關係資料庫時,遵從不同的規範要求,設計出合理的關係型資料庫,這些不同的規範要求被稱為不同的正規化,各種正規化呈遞次規範,越高的正規化資料庫冗餘越小。但是有些時候一昧的追求正規化減少冗餘,反而會降低資料讀寫的效率,這個時候就要反正規化,利用空間來換時間。

目前關係資料庫有六種正規化:第一正規化(1NF)、第二正規化(2NF)、第三正規化(3NF)、巴斯-科德正規化(BCNF)、第四正規化(4NF)和第五正規化(5NF,又稱完美正規化)。滿足最低要求的正規化是第一正規化(1NF)。在第一正規化的基礎上進一步滿足更多規範要求的稱為第二正規化(2NF),其餘正規化以次類推。一般說來,資料庫只需滿足第三正規化(3NF)就行了。

三正規化

第一正規化(1NF)

即表的列的具有原子性,不可再分解,即列的資訊,不能分解, 只要資料庫是關係型資料庫(mysql/oracle/db2/informix/sysbase/sql server),就自動的滿足1NF。

關係型資料庫: mysql/oracle/db2/informix/sysbase/sql server 非關係型資料庫: (特點: 面向物件或者集合) NoSql資料庫: MongoDB/redis(特點是面向文件)

第二正規化(2NF)

第二正規化(2NF)是在第一正規化(1NF)的基礎上建立起來的,即滿足第二正規化(2NF)必須先滿足第一正規化(1NF)。第二正規化(2NF)要求資料庫表中的每個例項或行必須可以被惟一地區分。為實現區分通常需要我們設計一個主鍵來實現(這裡的主鍵不包含業務邏輯)

第三正規化(3NF)

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

反三正規化

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

知乎上對正規化和反正規化的理解

複製程式碼

摘自 https://www.zhihu.com/question/19900437
著作權歸作者所有。
商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
作者:孫文亮
連結:https://www.zhihu.com/question/19900437/answer/14089402
來源:知乎

資料庫設計應該也是分為三個境界的:
第一個境界,剛入門資料庫設計,正規化的重要性還未深刻理解。這時候出現的反正規化設計,一般會出問題。
第二個境界,隨著遇到問題解決問題,漸漸瞭解到正規化的真正好處,從而能快速設計出低冗餘、高效率的資料庫。
第三個境界,再經過N年的鍛鍊,是一定會發覺正規化的侷限性的。此時再去打破正規化,設計更合理的反正規化部分。
正規化就像武俠裡面的招數,初學者妄想不按招數來,只能死的很難堪。畢竟招數都是高手總結歸納的精華。而隨著武功提高,招數熟練之後,必然是發現招數的侷限性,要麼忘掉招數,要麼自創招數。只要努力,加上多熬幾年,總能達到第二個境界,總會覺得正規化是經典。此時能不過分依賴正規化,快速突破正規化侷限性的人,自然是高手。

複製程式碼