學過資料庫設計的同學都知道,資料庫設計有三大正規化,但是在實際工作中,三大正規化很難被嚴格的執行。本文將給大家介紹一種常見的、違反正規化的資料庫設計方案——字段冗餘1 經典示例先來看乙個經典的例子,在一些**系統裡,要顯示已購買的訂單,一般會顯示訂單號、下單時間、訂單金額、商品名稱等,如下圖。
正常我們如果按三大正規化來設計表,應該是下面這樣,包含【訂單表】和【商品表】,在【訂單表】中用【商品id】來關聯【商品表】
但是這樣設計的話,在訂單詳情頁面,要顯示商品名稱的話,就得用【訂單表】+【商品表】關聯查詢
2 字段冗餘設計
上面兩張表的設計,從三大正規化來說是合理的。但是在專案實際中,檢視訂單詳情是很頻繁的操作,每次操作,系統就得關聯【訂單表】+【商品表】查詢。但其實我們只會在訂單詳情裡顯示【商品名稱】這乙個字段,所以我們可以在【訂單表】裡增加乙個【商品名稱】,這樣我們要顯示訂單詳情時,只需要查詢【訂單表】就可以了,如下:
3 字段冗餘優缺點
缺點:
從上面的例子,我們能很直觀的看出來,字段冗餘有乙個明顯的缺點,就是【訂單表】和【商品表】都存了【商品名稱】,多占用了乙份資料庫空間,並且有多表同時更新的問題。當我們在後台修改商品名稱時,要考慮訂單表裡的商品名稱是否要一起修改。這裡為什麼是「考慮」,而不是一定要一起修改呢?這就要看需求了,比如我訂單詳情就是要顯示當時購買的商品名稱,而不是最新的商品名稱,那麼這種場景,在更新商品表時就不需要去更新訂單表。
擴充套件:
有些時候,字段冗餘不只冗餘乙個字段,還是訂單+商品的例子,商品名稱、商品**、商品描述等,我都要儲存當時的值,後續就算修改商品,也不要去修改訂單裡關於商品的資訊,這種場景,我們就要在訂單表裡冗餘很多商品字段,這時候,我們可以設計一張【商品快照表】儲存每筆訂單對應的當時的商品資訊,如下:
優點:
字段冗餘雖然多占用了空間,但是換來的好處是簡單化了資料庫查詢,要檢視訂單詳情,只需要查詢訂單表就可以了,減輕資料庫壓力。簡單來說,字段冗餘就是用空間換取時間的一種資料庫設計方案
4 什麼時候使用字段冗餘
只要記住一句話就可以了:查多改少的場景,適合用字段冗餘。還是上面的例子:訂單詳情的查詢很多,但是商品名稱的修改很少,適合將商品名稱冗餘到訂單表中
5 總結
資料庫字段冗餘是很常見的資料庫設計方案,基本上我接觸過的專案都不可避免的用到字段冗餘設計,已經工作的小夥伴們也可以在自己的專案裡找找是否有欄位冗餘的設計。
資料庫冗餘字段設計作用
在設計資料庫時,某一字段屬於乙個表,但它又同時出現在另乙個或多個表,且完全等同於它在其本來所屬表的意義表示,那麼這個字段就是乙個冗餘字段,外來鍵除外 以上是我自己給出的定義 冗餘欄位的存在到底是好還是壞呢?這是乙個不好說的問題。可能在有人看來,這是乙個很蹩腳的資料庫設計。因為在資料庫設計領域,有乙個...
資料庫冗餘字段設計作用
在設計資料庫時,某一字段屬於乙個表,但它又同時出現在另乙個或多個表,且完全等同於它在其本來所屬表的意義表示,那麼這個字段就是乙個冗餘字段。冗餘欄位的存在到底是好還是壞呢?這是乙個不好說的問題。可能在有人看來,這是乙個很蹩腳的資料庫設計。因為在資料庫設計領域,有乙個被大家必須遵守的資料庫設計正規化,這...
資料庫設計 設計資料庫之前
1.考察現有環境 在設計乙個新資料庫時,你不但應該仔細研究業務需求而且還要考察現有的系統。大多數資料庫 專案都不是從頭開始建立的 通常,機構內總會存在用來滿足特定需求的現有系統 可能沒有實 現自動計算 顯然,現有系統並不完美,否則你就不必再建立新系統了。但是對舊系統的研究 可以讓你發現一些可能會忽略...