資料庫設計之欄位冗餘
學過資料庫設計的同學都知道,資料庫設計有三大正規化,但是在實際工作中,三大正規化很難被嚴格的執行。本文將給大家介紹一種常見的、違反正規化的資料庫設計方案——欄位冗餘
1 經典示例
先來看一個經典的例子,在一些商城系統裡,要顯示已購買的訂單,一般會顯示訂單號、下單時間、訂單金額、商品名稱等,如下圖。
正常我們如果按三大正規化來設計表,應該是下面這樣,包含【訂單表】和【商品表】,在【訂單表】中用【商品ID】來關聯【商品表】
但是這樣設計的話,在訂單詳情頁面,要顯示商品名稱的話,就得用【訂單表】+【商品表】關聯查詢
2 欄位冗餘設計
上面兩張表的設計,從三大正規化來說是合理的。但是在專案實際中,檢視訂單詳情是很頻繁的操作,每次操作,系統就得關聯【訂單表】+【商品表】查詢。但其實我們只會在訂單詳情裡顯示【商品名稱】這一個欄位,所以我們可以在【訂單表】裡增加一個【商品名稱】,這樣我們要顯示訂單詳情時,只需要查詢【訂單表】就可以了,如下:
3 欄位冗餘優缺點
缺點:
從上面的例子,我們能很直觀的看出來,欄位冗餘有一個明顯的缺點,就是【訂單表】和【商品表】都存了【商品名稱】,多佔用了一份資料庫空間,並且有多表同時更新的問題。當我們在後臺修改商品名稱時,要考慮訂單表裡的商品名稱是否要一起修改。這裡為什麼是“考慮”,而不是一定要一起修改呢?這就要看需求了,比如我訂單詳情就是要顯示當時購買的商品名稱,而不是最新的商品名稱,那麼這種場景,在更新商品表時就不需要去更新訂單表。
擴充套件:
有些時候,欄位冗餘不只冗餘一個欄位,還是訂單+商品的例子,商品名稱、商品價格、商品描述等,我都要儲存當時的值,後續就算修改商品,也不要去修改訂單裡關於商品的資訊,這種場景,我們就要在訂單表裡冗餘很多商品欄位,這時候,我們可以設計一張【商品快照表】儲存每筆訂單對應的當時的商品資訊,如下:
優點:
欄位冗餘雖然多佔用了空間,但是換來的好處是簡單化了資料庫查詢,要檢視訂單詳情,只需要查詢訂單表就可以了,減輕資料庫壓力。簡單來說,欄位冗餘就是用空間換取時間的一種資料庫設計方案
4 什麼時候使用欄位冗餘
只要記住一句話就可以了:查多改少的場景,適合用欄位冗餘。還是上面的例子:訂單詳情的查詢很多,但是商品名稱的修改很少,適合將商品名稱冗餘到訂單表中
5 總結
資料庫欄位冗餘是很常見的資料庫設計方案,基本上我接觸過的專案都不可避免的用到欄位冗餘設計,已經工作的小夥伴們也可以在自己的專案裡找找是否有欄位冗餘的設計。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69923331/viewspace-2714770/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 資料庫設計——冗餘欄位資料庫
- 資料庫效能優化之冗餘欄位的作用資料庫優化
- MSSQL冗餘欄位的策略和管理SQL
- MYSQL資料庫欄位命名及設計規範MySql資料庫
- 位運算-設計資料庫表的多選狀態欄位資料庫
- 如何消除冗餘資料的安全風險?
- 資料庫int欄位超限資料庫
- 資料庫欄位問題資料庫
- oracle 資料庫設定表和欄位的別名Oracle資料庫
- 資料鏈路層迴圈冗餘(CRC)檢驗
- 資料庫表欄位命名規範資料庫
- 資料庫欄位簡寫說明資料庫
- mysql資料庫新增和修改欄位MySql資料庫
- 資料處理之欄位合併
- 資料庫設計之思考資料庫
- 資料庫欄位設定非空, phalcon建立資料驗證不透過資料庫
- 冗餘資料一致性,到底如何保證?
- mysql-資料庫欄位date datetimeMySql資料庫
- 資料庫索引欄位請不要為NULL資料庫索引Null
- 資料庫中欄位資料型別以及約束資料庫資料型別
- 序列化,資料庫存多個欄位資料資料庫
- 如何刪除Git倉庫中冗餘的tag?Git
- MongoDB之資料查詢(欄位判斷)MongoDB
- hadoop之 心跳時間與冗餘快清除Hadoop
- 網路冗餘技術
- 【資料庫設計】資料庫的設計資料庫
- 為什麼資料庫欄位要使用NOT NULL?資料庫Null
- 查詢某資料庫中所有的欄位資料庫
- MSSQL資料庫的欄位型別總結SQL資料庫型別
- mysql 資料庫 表 欄位 編碼修改 方法MySql資料庫
- 帝國cms所有資料庫欄位說明資料庫
- SAP 介面程式設計之 RFC系列(14) : C# 版獲取 DDIC 的資料欄位程式設計C#
- 保留兩位小數:資料庫欄位型別NUMBER,Java欄位型別Double型別資料庫型別Java
- Go Web 程式設計之 資料庫GoWeb程式設計資料庫
- MySQL之規範資料庫設計MySql資料庫
- 模型資料追加欄位模型
- iOS專案冗餘資源掃描指令碼iOS指令碼
- 小白讀iOS冗餘資源掃描指令碼iOS指令碼