資料庫設計之欄位冗餘
學過資料庫設計的同學都知道,資料庫設計有三大正規化,但是在實際工作中,三大正規化很難被嚴格的執行。本文將給大家介紹一種常見的、違反正規化的資料庫設計方案——欄位冗餘
1 經典示例
先來看一個經典的例子,在一些商城系統裡,要顯示已購買的訂單,一般會顯示訂單號、下單時間、訂單金額、商品名稱等,如下圖。
正常我們如果按三大正規化來設計表,應該是下面這樣,包含【訂單表】和【商品表】,在【訂單表】中用【商品ID】來關聯【商品表】
但是這樣設計的話,在訂單詳情頁面,要顯示商品名稱的話,就得用【訂單表】+【商品表】關聯查詢
2 欄位冗餘設計
上面兩張表的設計,從三大正規化來說是合理的。但是在專案實際中,檢視訂單詳情是很頻繁的操作,每次操作,系統就得關聯【訂單表】+【商品表】查詢。但其實我們只會在訂單詳情裡顯示【商品名稱】這一個欄位,所以我們可以在【訂單表】裡增加一個【商品名稱】,這樣我們要顯示訂單詳情時,只需要查詢【訂單表】就可以了,如下:
3 欄位冗餘優缺點
缺點:
從上面的例子,我們能很直觀的看出來,欄位冗餘有一個明顯的缺點,就是【訂單表】和【商品表】都存了【商品名稱】,多佔用了一份資料庫空間,並且有多表同時更新的問題。當我們在後臺修改商品名稱時,要考慮訂單表裡的商品名稱是否要一起修改。這裡為什麼是“考慮”,而不是一定要一起修改呢?這就要看需求了,比如我訂單詳情就是要顯示當時購買的商品名稱,而不是最新的商品名稱,那麼這種場景,在更新商品表時就不需要去更新訂單表。
擴充套件:
有些時候,欄位冗餘不只冗餘一個欄位,還是訂單+商品的例子,商品名稱、商品價格、商品描述等,我都要儲存當時的值,後續就算修改商品,也不要去修改訂單裡關於商品的資訊,這種場景,我們就要在訂單表裡冗餘很多商品欄位,這時候,我們可以設計一張【商品快照表】儲存每筆訂單對應的當時的商品資訊,如下:
優點:
欄位冗餘雖然多佔用了空間,但是換來的好處是簡單化了資料庫查詢,要檢視訂單詳情,只需要查詢訂單表就可以了,減輕資料庫壓力。簡單來說,欄位冗餘就是用空間換取時間的一種資料庫設計方案
4 什麼時候使用欄位冗餘
只要記住一句話就可以了:查多改少的場景,適合用欄位冗餘。還是上面的例子:訂單詳情的查詢很多,但是商品名稱的修改很少,適合將商品名稱冗餘到訂單表中
5 總結
資料庫欄位冗餘是很常見的資料庫設計方案,基本上我接觸過的專案都不可避免的用到欄位冗餘設計,已經工作的小夥伴們也可以在自己的專案裡找找是否有欄位冗餘的設計。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69923331/viewspace-2714770/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 資料庫設計——冗餘欄位資料庫
- 資料庫效能優化之冗餘欄位的作用資料庫優化
- 位運算-設計資料庫表的多選狀態欄位資料庫
- 如何消除冗餘資料的安全風險?
- 資料庫欄位設定非空, phalcon建立資料驗證不透過資料庫
- mysql-資料庫欄位date datetimeMySql資料庫
- mysql資料庫新增和修改欄位MySql資料庫
- 資料庫表欄位命名規範資料庫
- 資料庫設計之思考資料庫
- 資料處理之欄位合併
- 查詢資料庫表及表欄位資料庫
- 冗餘資料一致性,到底如何保證?
- 如何刪除Git倉庫中冗餘的tag?Git
- 序列化,資料庫存多個欄位資料資料庫
- 資料庫中欄位資料型別以及約束資料庫資料型別
- 【資料庫設計】資料庫的設計資料庫
- 網路冗餘技術
- 帝國cms所有資料庫欄位說明資料庫
- 為什麼資料庫欄位要使用NOT NULL?資料庫Null
- SqlSugar code first 欄位為列舉型別,預設生成資料庫欄位為bigint如何設定為int型別SqlSugar型別資料庫
- Go Web 程式設計之 資料庫GoWeb程式設計資料庫
- MySQL之規範資料庫設計MySql資料庫
- 資料庫系列:高併發下的資料欄位變更資料庫
- python獲取、修改mysql資料庫欄位屬性PythonMySql資料庫
- mybatis 實體類排除資料庫欄位對映MyBatis資料庫
- 模型資料追加欄位模型
- es統計資料去除某個欄位的某些資料
- 資料庫表設計之儲存引擎資料庫儲存引擎
- 我在設計資料庫的時候會考慮到哪些資料欄位將來可能會發生變更。資料庫
- 織夢資料庫表結構_Dedecms資料庫表和欄位詳細介紹資料庫
- Hibernate/JPA中避免save()冗餘呼叫
- 演算法題——冗餘連線演算法
- [20210419]避免冗餘的輸出.txt
- FHRP - 閘道器冗餘協議協議
- Java資料型別與資料庫欄位型別對應關係Java資料型別資料庫
- 程式設計師面試之MySQL資料庫表的設計程式設計師面試MySql資料庫
- Jackson 解析json資料之忽略解析欄位註解@JsonIgnorePropertiesJSON
- SAP MM 物料主資料利潤中心欄位之修改