根據資料庫設計的第三方式,在資料庫設計過程中,應該盡量消除冗餘。即設計資料庫時,某乙個字段屬於一張表,但它同時出現在另乙個或多個表,且完全等同於它在其本來所屬表的意義表示,那麼這個字段就是乙個冗餘字段。
隨著企業資料量與併發量不斷的增加,冗餘欄位的存在到底是好還是壞呢?
根據第三正規化而言,冗餘欄位是垃圾的資料庫設計。
2、舉例說明與研究
所有問題出現必然因為場景問題,針對冗餘字段問題,分為兩個場景:
(1)快照場景(副本場景):交易場景大部分是資料快照,而不是冗餘,使用者下單時候的使用者名稱、位址、商品名稱、商品描述等,若採用關聯,商品在下單後發生了更新的話再去關聯查詢就會導致和使用者操作時的資料不一致,從而產生糾紛。
(2)冗餘場景:一般資料改動的可能性少,而查詢多的場景會使用冗餘,例如**的店鋪名稱,**商家中心會有這個字段,可能裡面的商家論壇也有,再假設聚划算這種獨立的大業務自己也存乙份,再來個垂直頻道電器城的後台管理也獨立存乙份,這種場景是由於對查詢效能要求高產生的,所以必須要冗餘,在業務的取捨上,肯定是對讓使用者更快看到資訊,那麼不可避免的是帶來維護成本的增加,對於資料一致性問題,只要做到最終一致就可以了,分布式的cap原則的實際應用基本都是通過犧牲資料一致性(c)來保證高可用(a)和高可靠(p), 因為這種場景大部分都是可以接受短暫的資料不一致的,對業務的影響及其微小。
又比如,」使用者暱稱」字段」nickname」本來屬於表」user」,那麼,表示」使用者暱稱」的字段就唯一的只應該屬於」user」表的」nickname」字段,這樣,當使用者要修改暱稱的時候,程式就只需要修改 user.nickname這個字段就行了。不過問題也隨之而來,我在其他資料表(如訂單orders表)裡只儲存了使用者的id,我要通過這個id值得到使用者暱稱該怎麼辦呢?乙個普遍的解決方法是通過聯接(join),在查詢時,通過id這個唯一條件聯接兩個表,從而取到使用者的暱稱。
這樣確實是沒問題,我也一直覺得這樣是最好的方案,擴充套件方便,當要更新使用者資訊時,程式中要修改的地方很少,但是隨著資料庫裡資料不斷增加,百萬,千萬,同時,使用者表的資料肯定也在不斷的增加的,它可能是十萬,百萬。這個時候,你會發現兩個表通過聯接來取資料就顯得相當費力了,可能你只需要取乙個nickname這個使用者暱稱屬性,你就不得不去聯一下那個已經幾十萬的使用者表進行檢索,其速度可想而知了。
這個時候,你可以嘗試把nickname這個欄位加到orders這個訂單表中,這樣做的好事是,當你要通過訂單表呈現乙個訂單列表時,涉及使用者的部分可能就不需要再進行聯接查詢了。當然,有利就有弊,這樣做的弊端就是,當你嘗試更新使用者資訊時,你必須記得使用者資訊表裡當前被更新的字段中,有哪些是冗餘字段,分別屬於哪些表,找到他們,然後加入到你的更新程式段中來。這個是程式中的開銷,開銷在開發人員的時間上了。至於這樣做是否值得,就得看具體情況而定了。
所以,目前要建立乙個關係型資料庫設計,我們有兩種選擇:
1,盡量遵循正規化理論的規約,盡可能少的冗餘字段,讓資料庫設計看起來精緻、優雅、讓人心醉。
2,合理的加入冗餘字段這個潤滑劑,減少join,讓資料庫執行效能更高更快。
選擇哪一種呢?如果你是乙個美學狂人,並且財大氣粗,非要使用第一種方案,也沒關係,這種方案的短板並非不可救藥的。比如,你可以增加伺服器,從資料庫集群入手,進行讀寫分離,讀的時候可以將壓力分散到不同的資料庫伺服器上,這樣也可以獲得很好的效能,只是多付出了硬體成本和維護成本。或者,你可以在資料庫前端架設memcached之類的快取服務,減少讀寫資料庫的次數,也可以達到同樣的效果。問題在於你確定你需要快取之類的東西。
如果做不到上面的只能選擇第二種了,當涉及到修改的時候就需要將所有相關的資料進行修改了。
原文:
資料庫冗餘字段
什麼是冗餘字段?在設計資料庫時,某一字段屬於乙個表,但它又同時出現在另乙個或多個表,且完全等同於它在其本來所屬表的意義表示,那麼這個字段就是乙個冗餘字段。以上是我自己給出的定義 冗餘欄位的存在到底是好還是壞呢?這是乙個不好說的問題。可能在有人看來,這是乙個很蹩腳的資料庫設計。因為在資料庫設計領域,有...
資料庫冗餘字段設計作用
在設計資料庫時,某一字段屬於乙個表,但它又同時出現在另乙個或多個表,且完全等同於它在其本來所屬表的意義表示,那麼這個字段就是乙個冗餘字段,外來鍵除外 以上是我自己給出的定義 冗餘欄位的存在到底是好還是壞呢?這是乙個不好說的問題。可能在有人看來,這是乙個很蹩腳的資料庫設計。因為在資料庫設計領域,有乙個...
資料庫中的冗餘字段
在建庫的時候,尤其是複雜的資料庫,難免會出現大量的冗餘字段,出現資料冗餘 資料冗餘 在乙個資料集合中重複的資料稱為資料冗餘.資料冗餘的目的 資料的應用中為了某種目的採取資料冗餘方式。1 重複儲存或傳輸資料以防止資料的丟失。2 對資料進行冗餘性的編碼來防止資料的丟失 錯誤,並提供對錯誤資料進行反變換得...