數據庫性能優(yōu)化之冗余字段的作用
來源:易賢網 閱讀:823 次 日期:2014-07-28 14:50:43
溫馨提示:易賢網小編為您整理了“數據庫性能優(yōu)化之冗余字段的作用”,方便廣大網友查閱!

什么是冗余字段?

在設計數據庫時,某一字段屬于一個表,但它又同時出現在另一個或多個表,且完全等同于它在其本來所屬表的意義表示,那么這個字段就是一個冗余字段。

——以上是我自己給出的定義

冗余字段的存在到底是好還是壞呢?這是一個不好說的問題。可能在有人看來,這是一個很蹩腳的數據庫設計。因為在數據庫設計領域,有一個被大家奉為圭臬的數據庫設計范式,這個范式理論上要求數據庫設計邏輯清晰、關系明確,比如,”用戶昵稱”字段”nickname”本來屬于表”user”,那么,表示”用戶昵稱”的字段就唯一的只應該屬于”user”表的”nickname”字段,這樣,當用戶要修改昵稱的時候,程序就只需要修改 user.nickname這個字段就行了,瞧,很方便。不過問題也隨之而來,我在其他數據表(如訂單orders表)里只存儲了用戶的ID,我要通過這個ID值得到用戶昵稱該怎么辦呢?一個普遍的解決方法是通過聯接(join),在查詢時,通過id這個唯一條件聯接兩個表,從而取到用戶的昵稱。

這樣確實是沒問題,我也一直覺得這樣是最好的方案,擴展方便,當要更新用戶信息時,程序中要修改的地方很少,但是隨著數據庫里數據不斷增加,百萬,千萬,同時,用戶表的數據肯定也在不斷的增加的,它可能是十萬,百萬。這個時候,你會發(fā)現兩個表通過聯接來取數據就顯得相當費力了,可能你只需要取一個nickname這個用戶昵稱屬性,你就不得不去聯一下那個已經幾十萬的用戶表進行檢索,其速度可想而知了。

這個時候,你可以嘗試把nickname這個字段加到orders這個訂單表中,這樣做的好事是,當你要通過訂單表呈現一個訂單列表時,涉及用戶的部分可能就不需要再進行聯接查詢了。當然,有利就有弊,這樣做的弊端就是,當你嘗試更新用戶信息時,你必須記得用戶信息表里當前被更新的字段中,有哪些是冗余字段,分別屬于哪些表,找到他們,然后加入到你的更新程序段中來。這個是程序中的開銷,開銷在開發(fā)人員的時間上了。至于這樣做是否值得,就得看具體情況而定了。

所以,目前要創(chuàng)建一個關系型數據庫設計,我們有兩種選擇:

盡量遵循范式理論的規(guī)約,盡可能少的冗余字段,讓數據庫設計看起來精致、優(yōu)雅、讓人心醉。

合理的加入冗余字段這個潤滑劑,減少join,讓數據庫執(zhí)行性能更高更快。

選擇哪一種呢?如果你是一個美學狂人,并且財大氣粗,非要使用第一種方案,也沒關系,這種方案的短板并非不可救藥的。比如,你可以增加服務器,從數據庫集群入手,進行讀寫分離,讀的時候可以將壓力分散到不同的數據庫服務器上,這樣也可以獲得很好的性能,只是多付出了硬件成本和維護成本?;蛘撸憧梢栽跀祿烨岸思茉OMemcached之類的緩存服務,減少讀寫數據庫的次數,也

可以達到同樣的效果。問題在于你確定你需要緩存之類的東西。

當然,如果你跟我一樣,只有一臺每月幾十元買來的vps,甚至可能是一個虛擬主機,建議還是暫時壓制你的美學欲望,跟我一起選擇第二種方案吧,除非你愿意你的整個數據庫都一直只有零零星星的幾條數據

更多信息請查看IT技術專欄

更多信息請查看數據庫

2025國考·省考課程試聽報名

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 加入群交流 | 手機站點 | 投訴建議
工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
聯系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:526150442(9:00—18:00)版權所有:易賢網