iT邦幫忙

2023 iThome 鐵人賽

DAY 1
2
Software Development

CRUD仔的一生(上集)系列 第 1

[前言] 寫後端一定ipad資料庫

  • 分享至 

  • xImage
  •  

CRUD仔的一生(上)

前言

為什麼要理解「原因」而不只是「結論」?

小時候長輩常說:「剛吃完飯不可以直接躺著,不然會消化不良。」

小孩總會追問:「為什麼?」大人往往一時語塞,最後只能回答:「這是老一輩的智慧,照做就對了。」

直到長大後學了一點生理知識,才恍然大悟:原來躺著時,重力無法幫助食物順利進入胃部,食道括約肌的壓力也會改變,容易導致胃酸逆流。理解了原理後,我們甚至能推論:如果改成右側躺(胃的位置較低),影響就會比平躺小一些。

這個故事告訴我們:知道「為什麼」,才能在不同情境下靈活應對,而不是死記硬背規則。


技術領域也有同樣的問題

回到軟體工程領域,我們常常看到類似的情況:

  • 「資料庫一定要加索引」
  • 「交易一定要用 ACID」
  • 「分散式系統要用最終一致性」

這些「定理」或「最佳實踐」,很多文章只告訴你「要這樣做」,卻沒有解釋:

  • 為什麼要這樣做? 解決了什麼問題?
  • 代價是什麼? 有什麼取捨?
  • 什麼時候可以不這樣做? 有例外情況嗎?

沒有這些解釋,技術就變成了玄學,最後也只能說:「這是老一輩的智慧,照做就對了。」

更糟的是,當你遇到這些定理無法解決的問題時,這些定理反而變成發展的天花板。因為你不知道背後的原理,就不知道什麼時候該打破規則,什麼時候該堅持原則。


我想做的事:補充那些「沒人解釋的為什麼」

身為一個後端工程師,我也踩過無數的坑:

  • 不理解鎖的原理 → 寫出 deadlock
  • 不理解索引的原理 → 查詢越加越慢
  • 不理解交易的原理 → 資料出現不一致

每次踩坑後回頭研究,才發現:原來前人的智慧都有其道理,只是沒人好好解釋。

所以我想透過這系列文章,補充那些「被當成常識但沒人解釋」的部分,讓大家不只知道「怎麼做」,更知道「為什麼這樣做」、「什麼時候不該這樣做」。

為什麼選擇資料庫作為主題?

因為資料庫系統濃縮了後端工程的核心問題:

核心問題 資料庫的解法 延伸應用
並發控制 鎖、MVCC 分散式鎖、樂觀鎖
資料一致性 ACID、交易 分散式交易、Saga
查詢效能 索引、查詢優化 快取策略、查詢設計
系統擴展 分散式、複製 微服務、CAP 理論

就像書法中的「永字八法」,筆畫雖不多,但寫好這個字,就能掌握八成的基礎筆法。學好資料庫,就能理解大部分後端系統的設計思維。


系列規劃:CRUD 仔的一生

本系列分為上下兩部:

📚 上集:單體式資料庫(本系列)

  • 重點:資料結構與運作原理
  • 內容:ACID、鎖機制、索引類型、查詢優化等
  • 目標:理解單機資料庫如何保證正確性與效能
  • 適合對象:想深入理解資料庫原理的後端工程師

🚀 下集:分散式資料庫(敬請期待)

  • 重點:演算法與權衡取捨
  • 內容:CAP、一致性協議、分片策略等
  • 目標:理解分散式環境下的挑戰與解決方案
  • 適合對象:需要設計高可用系統的架構師

讓我們開始這趟旅程吧!從最基礎的 Transaction 開始,一步步理解資料庫背後的設計哲學。


📖 系列目錄:

  1. [前言] 寫後端一定ipad資料庫
  2. [ACID]
    01. [ACID] 事務(Transaction)
    02. [ACID] SX鎖(SXLock)
    03. [ACID] 隔離層級(Isolation)
    04. [ACID] 顯式鎖(The Locking Clause)
    05. [ACID] 樂觀鎖(OptimisticLock)
    06. [ACID] 樂觀鎖(MVCC In Postgres)
    07. [ACID] 樂觀鎖(MVCC In MySQL)
    08. [ACID] 樂觀鎖(MySQL RR Problem)
    09. [ACID] Postgres WAL機制
    10. [ACID] Mysql WAL機制
    11. [ACID] 就是要ACID
    12. [ACID] 其實也不用ACID
    13. [ACID] 二階段提交(2 Phase Commitment (2PC))
  3. [CREATE]
    01. [CREATE] Heap/Index Organized Table
  4. [QUERY]
    01. [QUERY] OLTP/OLAP/HLAP
    02. [QUERY] Index
    03. [QUERY] SQL 規劃器/優化器(SQL Planner/Optimizer)
    04. [QUERY] 分頁問題(Paging Problem)
    05. [QUERY] IndexType: B+Tree
    06. [QUERY] IndexType: BRIN
    07. [QUERY] IndexType: GIST
    09. [QUERY] IndexType: GIN
    10. [QUERY] IndexType: GIN - Full Text Search (FTS)
    11. [QUERY] IndexType: BLOOM - bloom filter
    12. [QUERY] IndexType: BLOOM - 緩存穿透Cache Penetration
    13. [QUERY] IndexType: BLOOM
    14. [QUERY] 虛擬表(Virtual Table)
    15. [QUERY] 讀寫分離(Read/Write Splitting)
    16. [QUERY] 分割資料表(Partition/Sharding)
  5. [UPDATE/DELETE]
    01. [DELETE] 垃圾不分顏色: Vacuum/ReIndex
  6. [完結] 下集待續

下一篇
[ACID] 事務(Transaction)
系列文
CRUD仔的一生(上集)32
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 則留言

0
雷N
iT邦研究生 1 級 ‧ 2023-09-19 10:33:28

超讚的內容, 希望大大能完賽
話說你這資料庫的對象主要是PostgreSQL吧?

謝謝,大同小異的範例主要都會是postgres
如果設計上思路不同的會選mysql與postgres來做說明
這次範圍主要限制在RDB

0
艾薇 Ivy
iT邦新手 4 級 ‧ 2023-11-10 18:07:07

來拜讀ㄏ勝的大作,請接收我的膝蓋~

謝謝,以後還請多多指教

我要留言

立即登入留言