資料庫的反正規化設計

2021-07-27 22:00:51 字數 1200 閱讀 7975

正規化設計可以消除資料庫的資料冗餘及插入異常,但是過分的正規化設計可能導致資料查詢時需要關聯多張表,導致資料庫查詢效率下降,因此在實際工作中,需要適當的反正規化設計。

符合三正規化的資料庫設計

使用者資訊表 : 使用者名稱(主鍵),密碼,姓名,手機號,註冊日期

圖書資訊表 : 圖書名稱(主鍵),出版社名詞,圖書**圖書描述,作者

分類資訊表 : 分類名詞(主鍵),分類描述

圖書分類表 : (圖書名詞,圖書分類)(主鍵)

訂單表:訂單編號(主鍵),使用者名稱,下單日期,物流單號

訂單圖書關聯表 : (訂單編號,圖書名稱)(主鍵), 商品數量

在如上的資料庫設計中,如果需要查詢每個使用者的消費總金額

select 使用者名稱, sum(c.圖書***b.商品數量)

from 訂單表 a join 訂單圖書關聯表 b on a.訂單編號=b.訂單編號

join 圖書資訊表 c on b.圖書名稱=c.圖書名稱

group by 使用者名稱

如果需要查詢下單使用者和訂單詳情

select  a.訂單編號 a.使用者名稱 c.圖書名稱 b.商品數量 c.圖書**

from 訂單表 a join 訂單圖書關聯表 b on a.訂單編號=b.訂單編號

join 圖書資訊表 c on b.圖書名稱=c.圖書名稱

以上查詢也需要關聯3張**。

反正規化設計 ,在 訂單表  和 訂單圖書關聯表 中增加冗餘資料

訂單表:訂單編號(主鍵),使用者名稱,下單日期,物流單號,訂單金額

訂單圖書關聯表 : (訂單編號,圖書名稱)(主鍵), 商品數量,圖書**

在如上的資料庫設計中,如果需要查詢每個使用者的消費總金額

select 使用者名稱,sum(訂單金額) from 訂單表 group by (使用者名稱)

需要查詢下單使用者和訂單詳情

select  a.訂單編號 a.使用者名稱 b.圖書名稱 b.商品數量 b.圖書**

from 訂單表 a join 訂單圖書關聯表 b on a.訂單編號=b.訂單編號

反正規化設計後,因為 訂單圖書關聯表 已經儲存了當時的商品**,所以商品**波動並不影響查詢結果,而且減小查詢需要關聯的表。

反正規化設計需要更具具體業務實際決定,將經常使用的業務表進行合理的反正規化設計可以提高資料庫的查詢效率。

在實際的業務工作中,一般不使用外來鍵,因為外來鍵會在每次資料插入時進行合法性校驗,這樣回極大的拖累資料庫的插入效率。

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

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

資料庫設計的正規化和反正規化介紹

正規化化 總結 一正規化就是屬性不可分割,二正規化就是要有主鍵,其他欄位都依賴於主鍵,三正規化就是要消除傳遞依賴,消除冗餘,就是各種資訊只在乙個地方儲存,不出現在多張表中 反正規化化 不滿足正規化的模型,就是反正規化模型,反正規化跟正規化所要求的正好相反,在反正規化的設計模式,並不是完全不遵守正規化...

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

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