B03 · 資料持久化 詳細 ROADMAP

計畫文件,不會被 Quartz 渲染。 回主 roadmap → backend/ROADMAP.md 既有 database/ 系列 → database/index.md


章節目標

資料庫是後端最容易「看起來簡單實際超難」的主題。本章的定位:從後端工程師視角切入——不是 DBA 的視角(例如不講 storage engine 細節)、也不是純 SQL 教學(那在 database/ 系列)、而是「寫後端時要知道的資料庫知識」:連線池 / 交易隔離 / 索引策略 / ORM 取捨 / 遷移 / 分區。


🌱 基本介紹

#主題SlugStage大綱
01後端視角的資料庫01-what-is-backend-db🌱後端寫 DB 的 3 個關卡:正確性(交易)/ 效能(索引、池)/ 演進(migration)

❓ 為什麼需要

#主題SlugStage大綱
02為什麼不懂 isolation level 會資料壞02-why-isolation-level-matters🌱Read phenomena(dirty / non-repeatable / phantom)實際案例、預設 isolation level 坑(MySQL REPEATABLE READ vs PG READ COMMITTED)
03為什麼 ORM 會害你03-why-orm-hurts🌱N+1 問題、lazy load 失控、SELECT * 習慣、不知道真實 SQL、到 scale 才爆
04為什麼一定要懂 B+ tree04-why-btree-matters🌱理解索引設計 / 複合索引順序 / LIKE ‘xxx%’ 可用索引、為什麼 UUID v4 當 PK 糟糕
05為什麼連線池大小不是越大越好05-why-pool-size🌱DB 連線是昂貴資源、connection = 一個 backend process(PG)、pool 過大壓死 DB

🕰️ 演進

#主題SlugStage大綱
06關聯式 DB 演進06-rdbms-evolution🌱1970 Codd 關聯模型 → SQL 標準 → MySQL / PG 興起 → NoSQL 回潮 → NewSQL(Spanner / CockroachDB)→ Vector DB 時代
07ORM 演進史07-orm-evolution🌱ActiveRecord(Rails)→ Hibernate → Django ORM → SQLAlchemy → Prisma / Drizzle / TypeORM;current state
08Migration 工具演進08-migration-evolution🌱手動 SQL → Flyway / Liquibase → framework 內建(Rails / Django / Laravel)→ Atlas / goose / sqlx-migrate

🧠 知識型

F03-A SQL 基礎與進階

#主題SlugStage大綱
09SQL 基礎⛔️ database/index🌿跨系列
10Window Function10-window-function🌱ROW_NUMBER / RANK / LAG / LEAD 實戰;為什麼 self-join 之前這是噩夢
11CTE 與 Recursive CTE11-cte-recursive🌱WITH 寫可讀複雜 query、tree-like 資料用 recursive CTE
12JSON / JSONB 欄位12-json-columns🌱PG JSONB / MySQL JSON、索引(GIN)、什麼時候該用什麼時候不該用

F03-B DB 引擎與選型

#主題SlugStage大綱
13PostgreSQL 核心⛔️ infra/11-database-postgresql🌿跨系列
14PostgreSQL 進階⛔️ infra/13-postgresql-advanced🌿跨系列
15PG vs MySQL⛔️ micro-service/17-db-pg-vs-mysql / 31-pg-vs-mysql-deep-dive🌿跨系列
16NoSQL 分類16-nosql-taxonomy🌱KV(Redis)/ Document(Mongo)/ Column(Cassandra)/ Graph(Neo4j)、適用場景
17NewSQL(Spanner / CockroachDB / TiDB)17-newsql🌱分散式 ACID、shard auto-management、何時值得
18Vector DB(pgvector / Pinecone / Qdrant)18-vector-db🌱2026 AI 時代必要、相似度查詢、跟 RAG 整合

F03-C Transaction 與正確性

#主題SlugStage大綱
19ACID 逐字拆19-acid🌱Atomicity / Consistency / Isolation / Durability 各自怎麼實作、代價
20Isolation Level20-isolation-level🌱Read Uncommitted / Committed / Repeatable Read / Serializable、對應 read phenomena、MySQL vs PG 預設差異
21MVCC 機制21-mvcc🌱為什麼 PG / MySQL InnoDB 用 MVCC、snapshot isolation、vacuum 代價
22悲觀鎖 vs 樂觀鎖⛔️ micro-service/60-optimistic-pessimistic-locking🌿跨系列
22-2Race Condition 與分散式鎖⛔️ micro-service/59-race-condition-distributed-lock🌿跨系列
23死鎖預防與診斷23-deadlock🌱怎麼產生、怎麼看(PG pg_locks / MySQL SHOW ENGINE INNODB STATUS)、lock order 策略

F03-D 索引與查詢規劃

#主題SlugStage大綱
24索引與查詢規劃⛔️ micro-service/18-db-bulk-and-index🌿跨系列
25B+ Tree 詳細25-btree-deep🌱節點結構、leaf node 串接、為什麼 range scan 快、為什麼 UUID v4 亂序 PK 差
26複合索引策略26-composite-index-strategy🌱最左前綴原則、覆蓋索引、order by 跟 where 怎麼配合
27EXPLAIN / EXPLAIN ANALYZE 讀法27-explain-analyze🌱Seq Scan / Index Scan / Bitmap / Nested Loop / Hash Join / Merge Join、cost 怎麼看

F03-E ORM 與 Data Access Layer

#主題SlugStage大綱
28ORM vs Query Builder vs Raw SQL28-orm-vs-query-builder-vs-raw🌱三種分層的 trade-off;哪種場景選哪種
29N+1 問題深入29-n-plus-1🌱怎麼產生、怎麼偵測、eager load / data loader / batching 對策
30Repository Pattern30-repository-pattern🌱從 Active Record 到 Repository、跟 DDD 整合、泛型 BaseRepository(proto shared 有實作 ⛔️ 見 B07)

F03-F 連線池與效能

#主題SlugStage大綱
31連線池原理⛔️ micro-service/19-db-pool-and-infra🌿跨系列
32PgBouncer / ProxySQL32-connection-proxy🌱為什麼需要、transaction / session / statement pooling mode、Serverless 場景必要性
33Prepared Statement33-prepared-statement🌱server-side parsing cache、跟 connection pool 的互動(同 connection 才 reuse)
33-2DB 批次處理極限狀態33-2-db-batch-limit🌱Bulk insert 數萬 / 數百萬筆的瓶頸:記憶體爆、transaction log 爆、lock contention、timeout;chunk 策略(how large is safe)、streaming query(server-side cursor)、COPY(PG)vs 單筆 INSERT;跟 B19 #22 壓測案例連動

F03-G Migration 與演進

#主題SlugStage大綱
34Migration 基礎34-migration-basics🌱up / down、版本控制、團隊協作(衝突處理)
35Zero-downtime Migration35-zero-downtime-migration🌱expand-contract pattern、column add/drop 分三步、rolling deploy 配合
36資料遷移 vs schema 遷移⛔️ micro-service/32-pg-migration-guide🌿跨系列

F03-H 分區與 Sharding

#主題SlugStage大綱
37Partitioning37-partitioning🌱PG declarative partition、MySQL partition;Range / List / Hash 策略
38Sharding38-sharding🌱何時該 shard、shard key 選擇、跨 shard 交易地獄
39Read Replica39-read-replica🌱Replication 模式(async / sync)、replication lag 監控、讀寫分離的坑
39-2讀寫分離實戰⛔️ micro-service/61-db-read-write-splitting🌿跨系列

F03-I 搜尋引擎

#主題SlugStage大綱
40Elasticsearch / OpenSearch⛔️ infra/14-elasticsearch-deep-dive🌿跨系列
41PG Full Text Search41-pg-fts🌱tsvector / tsquery、GIN 索引、什麼時候 PG FTS 夠用、什麼時候該上 ES
41-2Search:MySQL / PG / ELK 選型⛔️ micro-service/56-search-mysql-pg-elk🌿跨系列
41-3Recommendation with ELK⛔️ micro-service/57-recommendation-with-elk🌿跨系列
41-4DB 選型總結⛔️ micro-service/65-conclusion-db🌿跨系列

F03-J 微服務化的 DB 策略

#主題SlugStage大綱
41-5Database-per-service vs Shared DB41-5-db-per-service🌱兩種模式的 trade-off;DB-per-service 是 textbook 答案但實戰有代價;什麼規模值得轉換
41-6Shared Schema → 分 DB 的遷移路徑41-6-shared-to-split-db🌱Expand-contract for DB schema;先分 schema 再分 instance;foreign key 跨 DB 如何處理
41-7Master Data 管理41-7-master-data-management🌱哪個 service 是某資料的 source of truth;跨服務資料一致性;authoritative service 設計
41-8Data Duplication 策略41-8-data-duplication🌱User 資料在 auth / profile / order 各存一份的 trade-off;同步機制;eventual consistency 接受度
41-9CDC(Change Data Capture)41-9-cdc🌱Debezium / PG logical replication;DB 變更推送到 Kafka;跟 Outbox pattern 的差異與互補
41-10Event Sourcing 跨服務歷史41-10-event-sourcing-cross-service🌱事件當真相來源;重放建 state;跨服務查歷史不用 join
41-11Multi-tenancy DB 策略41-11-multi-tenancy-db🌱Shared DB + tenant_id / Separate schema / Separate DB 三種模式;跨租戶資料洩漏風險;migration 成本

🔧 小實作注意事項

#主題SlugStage大綱
42壓測前後的 query 改造案例⛔️ micro-service/18-db-bulk-and-index / 19-db-pool-and-infra🌿跨系列
43本機跑 PG + Mongo + Redis(Docker Compose)43-local-db-stack🌱開發用 stack、volumes、seed data、reset workflow
44DB 連線池參數怎麼調44-pool-sizing🌱公式:threads × connections ≤ pool;實際案例

💣 Anti-pattern

#主題SlugStage大綱
45DB Anti-patterns45-db-antipatterns🌱N+1、SELECT *、UUID v4 當 PK、index 不夠或太多、nullable foreign key 濫用、用 DATETIME 不用 TIMESTAMPTZ、在 application 層做 JOIN(應該在 DB)、pool size 訂 200+、migration 沒 down、schema 跟 data migration 混

🧰 對應檢查工具

#主題SlugStage大綱
46資料庫工具46-db-tooling🌱pgAdmin / DBeaver、pt-query-digest(MySQL)、pganalyze / pg_stat_statements、sqlfluff(lint)、Atlas(migration)、schemaspy(文件)

📎 補充

#主題SlugStage大綱
S01為什麼 UUID v7 適合當 PKs01-uuid-v7🌱timestamp-based、index-friendly、2024 RFC 9562 標準化
S02Soft Delete 的坑s02-soft-delete🌱deleted_at pattern、unique constraint 失效、報表雙重邏輯、何時該 hard delete
S03Time-series DB(TimescaleDB / InfluxDB)s03-timeseries-db🌱為什麼時序資料不適合一般 RDBMS、何時值得上 TSDB

章節進度統計

  • 知識主題:46 + 3 補充 = 49 項
  • 🌿 growing:6(跨系列)
  • 🌱 seed:43

跨系列連結

  • database/index(SQL 基礎系列)
  • infra/ 11、13、14(PG / PG Advanced / ES)
  • micro-service/ 17–19、31–32、56–57、59–61、65(PG vs MySQL、bulk、pool、migration、search、lock、read-write split、conclusion)
  • backend/cache/ B13(DB cache 層)
  • backend/conventions/ B07 Repository(proto BaseRepository 實作)
  • backend/stress-testing/ B19(壓測暴露 DB 瓶頸)
  • standards/04-good-database-design