后臺系統可擴展性學習筆記(十一)Database Denormalization

之前的兩篇筆記中談到了從單庫擴展到多庫以承載更多的請求量以及單庫(表)拆分成多庫(表),打破單庫的性能瓶頸。
這都是為了應對大數據量下的措施。
然而,除卻數據量外,還有一個極其影響單庫性能的因素——數據的組織方式。
對于關系型數據庫,我們可以嘗試在一定程度上改變數據的組織方式,即反范式化(Denormalization)

關于范式

可以參考以前做的筆記:
《MySQL——數據表設計三大范式》
設計范式相當于數據層的設計模式,對數據表進行解耦,使單表信息更加內聚,彼此邊界分明,依賴關系更加清晰.
試想,如果相同的信息在多行中重復出現,不相干的信息也湊在同一張表中,就很容易出現一些異常情況:

  • 更新異常:只更新單行,就會出現邏輯上的不一致
  • 插入異常:無法只插入部分信息,除非讓其它列先留空
  • 刪除異常:刪除部分信息的同時,可能會波及其它無關信息

范式化的弊端

在這些設計范式的約束下,相關聯的信息被存儲到了不同的邏輯表中,以致于經常需要多表聯查(join操作),關系越復雜,連表查詢越慢。例如分成客戶表和訂單表和商戶表,當我們要執行的操作與這張表的部分信息都有關時,就需要進行多表join。
那么,有辦法能改善查詢性能嗎?

  • 允許 DBMS 存儲額外的冗余信息,例如索引視圖(indexed views)、物化視圖(materialized views),但仍遵從設計范式
  • 增加冗余數據,減少join操作,打破設計范式(即反范式化)

反范式化

所謂反范式化,是一種針對遵從設計范式的數據庫(關系模式)的性能優化策略。
反范式化不等于非范式化(Unnormalized form),反范式化一定發生在滿足范式設計的基礎之上。前者相當于先遵守所有規則,再進行局部調整,故意打破一些規則,而后者全然不顧規則。
反范式化通過增加冗余數據或對數據進行分組,犧牲一部分寫入性能,換取更高的讀取性能:
在設計范式的約束下,數據表中沒有冗余信息(某個數據只存放在某張表的某個單元格中),為了得到某個數據可能需要一系列的跨表查詢,因而讀操作性能不佳,但寫操作很快,因為更新數據時只需要修改一處。
反范式化就是要打破這種約束,把某些數據在不同的地方多放幾份,以加快數據檢索速度。
具體操作如下:

  • 存一些派生數據:類似于往 Redux Store 中塞計算屬性,把需要頻繁重復計算的結果存起來,例如在一對多關系中,把“多”的數量作為“一”的屬性存儲起來
  • 預先連接(pre-joined)生成匯總表:把需要頻繁join的表提前join好
  • 采用硬編碼值:把依賴表中的常量值(或者不經常變化的值)直接硬編碼到當前表中,從而避免join操作
  • 把詳情信息納入主表中:對于數據量不大的詳情表,可以把全部/部分詳情信息塞到主表中,以避免join操作

反范式化的代價

  • 失去了數據完整性保障:打破范式,意味著之前通過范式化解決的更新、插入、刪除異常問題又將重新冒出來,也就是說,冗余數據的一致性要靠 DBA 自己來保證,而不像索引視圖等由 DBMS 來保證
  • 犧牲了寫入速度:由于反范式化引入了冗余數據,更新時要修改多處,但大多數場景都是讀密集的,寫入慢一點問題不大
  • 浪費了存儲空間:存儲了不必要的冗余數據,自然會浪費一些存儲空間,但空間換時間一般是可接受的(畢竟內存、硬盤等資源已經相對廉價了)

參考

http://www.ayqy.net/blog/database-denormalization/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/376569.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/376569.shtml
英文地址,請注明出處:http://en.pswp.cn/news/376569.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java Swing 影樓管理系統之登錄功能

開頭打廣告,Java1234.com。 首先,來個效果圖。 關鍵代碼 1,界面層 private void Jb_DengLuActionPerformed(java.awt.event.ActionEvent evt) {// TODO add your handling code here:String UserName this.Jb_UserNameTxt.getText();String …

Bdsyn百度手機助手是何物,它是怎樣神不知鬼不覺地安裝到你的電腦里的?

【電腦軟件管理中Bdsyn手機助手的問題】Bdsyn手機助手 is developed by Baidu, Inc. and is used by 10 users of Software Informer. 并不是本人安裝的(應該是自己自己主動安裝的),卸載以后過幾天又會出如今軟件列表里。百度搜索卻無法搜索出…

后臺系統可擴展性學習筆記(十二)NoSQL

文章目錄NoSQL定義NoSQL種類鍵值存儲文檔存儲寬列存儲圖形數據庫NoSQL 意味著什么ACID vs. BASESQL or NoSQLNoSQL定義 不同于關系型數據庫,NoSQL 數據庫(也叫非 SQL 或非關系型數據庫)提供的數據存儲、檢索機制并不是基于表關系建模的。沒有…

android2.2應用開發之IccCard(sim卡或USIM卡)

tyle"margin:20px 0px 0px; font-size:14px; line-height:26px; font-family:Arial; color:rgb(51,51,51)"> 如果要做android通訊錄的聯系人的機卡混排顯示,由于手機卡類型的不同,導致手機卡存儲容量以及可以存儲信息不同,就要涉…

后臺系統可擴展性學習筆記(十三)緩存

文章目錄在哪兒加緩存緩存什么內容緩存原始查庫結果緩存數據對象怎么查詢緩存結果預留緩存模式直讀模式直寫模式回寫式緩存繞寫式緩存提前刷新模式緩存滿了如何處理參考讀寫分離、分庫分表、反范式化、采用 NoSQL……如果這些擴展手段全都上了,數據響應依舊越來越慢…

[linux]gdb調試

使用gdb可以在命令行方便地調試,并且能以命令程序的方式調試源代碼。 常用命令簡寫print-p,step-s,next-n 進入gdb //方式一 gdb test//test 為可執行文件,使用-g編譯得到 //方式二 gdb -q //不顯示版權信息 file test //file命令打開文件 退出gdb quit …

后臺系統可擴展性學習筆記(十四)異步機制與MQ

對于 Web 服務而言,提升可擴展性的主要途徑是將耗時的同步工作改成異步處理,從而允許將這些工作“外包”給多個 Worker 去做,或者提前完成能夠預知的部分。 異步機制與可擴展性之間的關系需要從(異步)并行處理的優勢說…

RegisterClientScriptBlock與 RegisterStartupScript區別

Page.ClientScript.RegisterClientScriptBlock而用Page.ClientScript.RegisterStartupScript是因為:RegisterStartupScript 把script放置在ASP.NET page的底部,而RegisterClientScriptBlock把script放置在ASP.NET page的頂部,用RegisterClien…

【Web后端筆記】SQL Server與java數據類型對應

編號數據庫類型JDBC類型JDBC索引描述1intjava.lang.Integer4 2varcharjava.lang.String12 3charjava.lang.String1 4ncharjava.lang.String1 5nvarcharjava.lang.String12 6textjava.lang.String-1 7ntextjava.lang.String-1 8tinyintjava.lang.Integer-6 9intjava.lang.Intege…

后臺系統可擴展性學習筆記

整理了一下筆記目錄,將以前學習的一些知識串聯起來了,比如cdn、負載均衡、中間件,以前只是各自了解了一點,現在大概理清了后臺系統設計中他們各自的作用。 后臺系統可擴展性學習筆記(一)概要 后臺系統可擴展…

TFS 強制刪除鎖定文件(數據庫)

TFS:TFS2010 VS:VS2012 OS:Windows2008 DB:Sqlserver2008 R2 我們在團隊開發當中,版本控制是一個不可忽略的工具。我們團隊使用的是TFS2010這個版本控制器。 但在團隊實際協作開發當中,團隊成員難免有電腦損壞或人員離職情況&…

【轉】Java:String、StringBuffer和StringBuilder的區別

1 String String:字符串常量,字符串長度不可變。Java中String是immutable(不可變)的。 String類的包含如下定義: [java]view plaincopy /** The value is used for character storage. */ private final char value[]…

Linux中exit與_exit的區別

在exit,_exit的區別 - exit()與_exit()函數的區別(Linux系統中)2012-03-20 15:19:53 分類: LINUX 注:exit()就是退出,傳入的參數是程序退出時的狀態碼,0表示正常退出,其他表示非正常退出&…

光標閃爍問題的解決辦法

在調用Windows API函數SetCursor設置光標時,可能會碰到閃爍的問題:移動鼠標,光標在Class Cursor(即注冊窗口類時指定的Cursor)與預設Cursor之間閃爍。 在MSDN上有關SetCursor函數的備注中強調,如果Class Cursor非空,那…

視頻編解碼基礎

文章目錄前戲編解碼技術流程主流視頻編碼標準視頻傳輸面臨的問題視頻傳輸差錯控制視頻傳輸Qos質量保證參數人類視覺系統HVS 以及相應編碼措施正餐編碼層次與碼流結構PB幀編碼IBBP序列編碼結構圖像編碼結構條帶編碼結構宏塊編碼結構塊編碼結構預測技術碼率控制實例H264前戲 編解…

XShell 屏幕鎖定的恢復方法(Ctrl+Q)

操作XShell過程中很多時間大家會習慣性的按CtrlS進行保存. CtrlS在XShell的作用是屏幕鎖定,很多朋友會無法操作,會直接把窗口關閉。 解決方法: 快捷鍵 CtrlQ 即能完成解鎖!轉載于:https://www.cnblogs.com/liangle/p/3173475.html

adb端口被占用

程序不能執行,kill掉任務管理器里面adb服務,重新連接設備仍然有錯 查到可能是adb端口被占用 查看adb用的是哪個端口:C:\Users\wanglin>adb nodaemon server 查看誰占用了這個端口:C:\Users\wanglin>netstat -ano | findstr …

實時語音通訊丟包補償技術

文章目錄基于發送端丟包補償技術原理與媒體無關的前向差錯糾正媒體相關前向差錯糾正交織技術基于接受端丟包補償技術基于插入方法基于插值方法基于重構的方法應用建議非交互式交互式拓展閱讀參考丟包補償技術可以分為兩類:基于發送端補償、基于接受端補償 基于發送…

取得裝置可以顯示頁面的寬度

利用html中的div元素取得<div id"divGetWidth" width100%></div>Jquery:var width$(#divGetWidth).width(); //獲取元素寬度 Javascript:var objdocument.getElementById(divGetWidth);var width obj.offsetWidth轉載于:https://www.cnblogs.…

Xcode添加靜態庫以及編譯選項配置常見問題

本文轉載至 http://www.cnblogs.com/Quains/archive/2013/08/22/3276425.html 一,Xcode編譯出現Link錯誤,出現"duplicate symbols for architecture i386 clang"提示.問題:鏈接時,項目有重名文件.解決:根據錯誤提示,做如下檢查:1.Taraget->Build Settings->Li…