DB 資料庫設計中的正規化與反正規化

2021-08-21 02:35:33 字數 1151 閱讀 4651

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

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

目前關聯式資料庫有六種正規化:第一正規化(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的比例。但是反正規化化一定要適度,並且在原本已滿足三正規化的基礎上再做調整的。

資料庫正規化與反正規化

最近涉及到設計和建立數倉表,資料總體劃分為ods fact aggr dws rpt dim層,具體結構如下圖所示 遵從設計規則 以星型模型為設計模式,維度採用反正規化化,且維度資料要整個倉庫可共用,資料準確性要保證,事實表允許冗餘部分維度資料。針對其中幾個地方,解釋並mark一下。多維資料模型是最...

資料庫正規化設計和反正規化設計

1 庫表設計遵從三大正規化。a 資料庫設計的第一大正規化 資料庫表中的所有欄位都只具有單一屬性 單一屬性的列是由基本資料型別所構成的 設計出來的表都是簡單的二維表。乙個列存放的資訊只是乙個屬性的資訊,不能乙個字段存放多個屬性的組合資訊。即資料庫表中的所有字段值都是不可分解的原子值 b 資料庫設計的第...

mysql資料庫設計正規化與反設計正規化操作思考

資料庫結構優化的目的 減少資料冗餘,盡量避免資料維護中出現更新 插入和刪除異常,節約資料儲存空間。資料庫設計正規化 第一正規化 1 資料表中的所有欄位都只具有單一屬性 2 單一屬性的列是由基本的資料型別所構成的 3 設計出來的表都應該是簡單的二維表 第二正規化 1 要求乙個表中具有乙個業務主鍵,也就...