資料庫設計之欄位冗餘

千鋒Python唐小強發表於2020-08-26

學過資料庫設計的同學都知道,資料庫設計有三大正規化,但是在實際工作中,三大正規化很難被嚴格的執行。本文將給大家介紹一種常見的、違反正規化的資料庫設計方案——欄位冗餘

1 經典示例

先來看一個經典的例子,在一些商城系統裡,要顯示已購買的訂單,一般會顯示訂單號、下單時間、訂單金額、商品名稱等,如下圖。

資料庫設計之欄位冗餘


正常我們如果按三大正規化來設計表,應該是下面這樣,包含【訂單表】和【商品表】,在【訂單表】中用【商品ID】來關聯【商品表】

資料庫設計之欄位冗餘

資料庫設計之欄位冗餘


但是這樣設計的話,在訂單詳情頁面,要顯示商品名稱的話,就得用【訂單表】+【商品表】關聯查詢

2 欄位冗餘設計

上面兩張表的設計,從三大正規化來說是合理的。但是在專案實際中,檢視訂單詳情是很頻繁的操作,每次操作,系統就得關聯【訂單表】+【商品表】查詢。但其實我們只會在訂單詳情裡顯示【商品名稱】這一個欄位,所以我們可以在【訂單表】裡增加一個【商品名稱】,這樣我們要顯示訂單詳情時,只需要查詢【訂單表】就可以了,如下:

資料庫設計之欄位冗餘

3 欄位冗餘優缺點

缺點:
從上面的例子,我們能很直觀的看出來,欄位冗餘有一個明顯的缺點,就是【訂單表】和【商品表】都存了【商品名稱】,多佔用了一份資料庫空間,並且有多表同時更新的問題。當我們在後臺修改商品名稱時,要考慮訂單表裡的商品名稱是否要一起修改。這裡為什麼是“考慮”,而不是一定要一起修改呢?這就要看需求了,比如我訂單詳情就是要顯示當時購買的商品名稱,而不是最新的商品名稱,那麼這種場景,在更新商品表時就不需要去更新訂單表。

擴充套件:
有些時候,欄位冗餘不只冗餘一個欄位,還是訂單+商品的例子,商品名稱、商品價格、商品描述等,我都要儲存當時的值,後續就算修改商品,也不要去修改訂單裡關於商品的資訊,這種場景,我們就要在訂單表裡冗餘很多商品欄位,這時候,我們可以設計一張【商品快照表】儲存每筆訂單對應的當時的商品資訊,如下:

資料庫設計之欄位冗餘

優點:
欄位冗餘雖然多佔用了空間,但是換來的好處是簡單化了資料庫查詢,要檢視訂單詳情,只需要查詢訂單表就可以了,減輕資料庫壓力。簡單來說,欄位冗餘就是用空間換取時間的一種資料庫設計方案

4 什麼時候使用欄位冗餘

只要記住一句話就可以了:查多改少的場景,適合用欄位冗餘。還是上面的例子:訂單詳情的查詢很多,但是商品名稱的修改很少,適合將商品名稱冗餘到訂單表中

5 總結

資料庫欄位冗餘是很常見的資料庫設計方案,基本上我接觸過的專案都不可避免的用到欄位冗餘設計,已經工作的小夥伴們也可以在自己的專案裡找找是否有欄位冗餘的設計。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69923331/viewspace-2714770/,如需轉載,請註明出處,否則將追究法律責任。

相關文章