日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

后台系统可扩展性学习笔记(十一)Database Denormalization

發(fā)布時(shí)間:2023/12/1 windows 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 后台系统可扩展性学习笔记(十一)Database Denormalization 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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

關(guān)于范式

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

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

范式化的弊端

在這些設(shè)計(jì)范式的約束下,相關(guān)聯(lián)的信息被存儲(chǔ)到了不同的邏輯表中,以致于經(jīng)常需要多表聯(lián)查(join操作),關(guān)系越復(fù)雜,連表查詢?cè)铰@绶殖煽蛻舯砗陀唵伪砗蜕虘舯?#xff0c;當(dāng)我們要執(zhí)行的操作與這張表的部分信息都有關(guān)時(shí),就需要進(jìn)行多表join。
那么,有辦法能改善查詢性能嗎?

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

反范式化

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

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

反范式化的代價(jià)

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

參考

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

總結(jié)

以上是生活随笔為你收集整理的后台系统可扩展性学习笔记(十一)Database Denormalization的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。