由mysql5.7支持JSON 淺談數(shù)據(jù)庫設(shè)計

為什么MYSQL更新的幅度越來越大?是因為原來的三NF設(shè)計完全不夠用了 又沒有大神提出新的標(biāo)準(zhǔn) 雖然暫時還是最熱門的數(shù)據(jù)庫 但是挑戰(zhàn)者已經(jīng)在敲門了 說說這問題 順便整理下思路 以觀后效

以一個簡單需求舉例 用戶發(fā)表文章?其它用戶可以點(diǎn)贊 前端頁面需要顯示哪些用戶點(diǎn)贊了此文章 本用戶點(diǎn)贊了哪些文章

開始數(shù)據(jù)庫設(shè)計?

1.用戶表 用戶名 密碼 UID

2. 文章表 UID 文章標(biāo)題 內(nèi)容 tid

3.點(diǎn)贊表 UID TID

通過聯(lián)表查詢?以TID為條件索引可查詢到點(diǎn)贊了本文章的用戶列表

以UID為條件索引可查詢到某用戶點(diǎn)贊了哪些文章?

需求搞定?如果數(shù)據(jù)量不大的話一點(diǎn)問題沒有 但是如果是新浪微博呢 問題就大大的來了

? ? ? ?首先從背景上來說 之前所有的系統(tǒng)基本都是以公司工廠為單位運(yùn)行的局域網(wǎng)環(huán)境中 90%以上了不起就三~三百臺電腦的規(guī)模 簡單說就是業(yè)務(wù)流程復(fù)雜 數(shù)據(jù)規(guī)模不大 并發(fā)性基本不用考慮 在此基礎(chǔ)上總結(jié)的數(shù)據(jù)庫設(shè)計規(guī)范 中心思想是一份數(shù)據(jù)只保存在一個地方 只在一個地方更新 表與表之間通過ID外鍵互聯(lián)即可 只要是接觸過由EXCEL建立的系統(tǒng)的人 都能理解這種設(shè)計的優(yōu)越性 徹底的解決了數(shù)據(jù)不一致的困擾。在此基礎(chǔ)上發(fā)展了外鍵 觸發(fā)器 存儲過程 索引等概念 將數(shù)據(jù)庫作為數(shù)據(jù)倉庫集中處理數(shù)據(jù)的作用發(fā)揮到了極致。

? ? ? 但是現(xiàn)在使用的環(huán)境已經(jīng)完全變了 隨便一個最簡單的帳本應(yīng)用都是面向互聯(lián)網(wǎng)公開的 并發(fā)量 數(shù)據(jù)量都不可同日而語 各種新的理論 工具層出不窮 ?分庫分表?Memcache??redis 還有MongoDB 都是為了解決一個問題 MYSQL不夠用了 性能不夠造成業(yè)務(wù)崩潰的例子每天都在發(fā)生 MYSQL有各種問題 我覺得其它問題什么修改表結(jié)構(gòu)慢之類那都不算事 最主要還是這個中心思想一份數(shù)據(jù)只保存在一個地方?到底還合不合時宜

? ? ?同樣以這個需求舉例 如果按照文檔數(shù)據(jù)庫的設(shè)計思路?例如MONGO 可能我會以文章建一個表 包含TID 標(biāo)題 內(nèi)容和一個點(diǎn)贊用戶列表

再以用戶建一個表 包含UID?用戶名 密碼和一個點(diǎn)贊文章的列表 這樣無需聯(lián)表 只需要一個主鍵查詢?就能獲取到需要的數(shù)據(jù) 但是寫入的時候比如某用戶點(diǎn)贊了某文章 就要在二個地方寫數(shù)據(jù) 有可能帶來數(shù)據(jù)不一致的問題 當(dāng)然使用一些手段可以避免或修復(fù) 但是這就引入了復(fù)雜度 有沒有必要?這里我覺得是有必要 大多數(shù)的系統(tǒng)讀比寫多 也比寫復(fù)雜 這樣改寫之后 應(yīng)該可以幾乎完全的避免MYSQL死鎖的問題 但是如果業(yè)務(wù)場景太復(fù)雜 可能會需要維護(hù)不止二份的數(shù)據(jù)

? ? 來點(diǎn)對比

? ??1.MongoDB在阿里云比MYSQL貴2倍不止?

? ? 2.?MongoDB與MYSQL語法完全不同 有不少坑要踩

? ? 基于以上在簡單系統(tǒng)上試用過一段時間的?MongoDB之后 還是沒敢切換 用回MYSQL了 但是這次更新支持JSON之后我就在想既然MYSQL成本明顯比MongoDB低 穩(wěn)定性成熟度又比MongoDB好 那能不能把文檔數(shù)據(jù)庫的設(shè)計思路用來用MYSQL來實(shí)現(xiàn)呢???或許是個路子。

? ? 總結(jié)一下 個人一點(diǎn)小建議:

? ?.應(yīng)用層可以無限制的擴(kuò)張 CPU 帶寬 內(nèi)存都不是個事(除了¥¥。。。)?所以系統(tǒng)瓶頸一般在數(shù)據(jù)庫?所以盡量不要使用外鍵 觸發(fā)器 存儲過程等任何需要占用數(shù)據(jù)庫鎖甚至是數(shù)據(jù)庫服務(wù)器CPU的東西 一切計算往前提 在應(yīng)用層組裝計算?甚至可以提到用戶端瀏覽器去

? ?.應(yīng)該可以改變一下傳統(tǒng)3NF的設(shè)計思路 采用文檔數(shù)據(jù)庫的思路 中心思想主要是按需求組織數(shù)據(jù)和保存數(shù)據(jù) 好處是可以一次獲取所有相關(guān)數(shù)據(jù) 至于寫數(shù)據(jù)的多處修改問題 正好可以使用MYSQL的事務(wù)機(jī)制 通過前面說的日志隊列的方式實(shí)現(xiàn)快速返回 隊列寫入

? ?.盡信書不如無書 透過現(xiàn)象看本質(zhì) 在現(xiàn)在這個SSD成本大降 存儲成本越來越低 數(shù)據(jù)卻越來越大 并發(fā)數(shù)越來越高的時代 我覺得犧牲點(diǎn)存儲空間 和寫入速度 換來瓶頸中心數(shù)據(jù)庫的可擴(kuò)展性 和讀取速度的提升 無論怎么算都是劃算的也必將會成為主流設(shè)計思路 相信一段時間之后必然有行業(yè)大牛出來推出新的設(shè)計標(biāo)準(zhǔn) MYSQL又將大行其道?

? ?.再次印證了?巨頭沒那么容易被打倒 屌絲永遠(yuǎn)還是屌絲。。。。殘念。。。

??回頭找個小應(yīng)用?實(shí)踐下看

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容