資料庫不是「選一個就好」——大部分生產系統同時用 RDBMS(交易)+ Redis(快取)+ Elasticsearch(搜尋)。選型的關鍵不是「哪個最好」,而是「你的資料有什麼特性、你的查詢模式是什麼」。這篇串連 database、infra、micro-service 三個系列裡跟資料庫相關的 25+ 篇文章,畫出從選型到調校的完整路徑。
Level 0:全景圖
flowchart TD Q{你的需求是什麼?} Q -->|交易 / ACID| RDBMS[RDBMS] Q -->|快取 / Session| CACHE[Redis] Q -->|全文搜尋| SEARCH[Elasticsearch] Q -->|文件 / 彈性結構| DOC[Document DB] Q -->|向量 / AI| VEC[Vector DB] Q -->|時序資料| TS[Time Series DB] RDBMS --> PG[PostgreSQL] RDBMS --> MY[MySQL] CACHE --> PATTERN[快取模式] SEARCH --> ELK[ELK Stack] style Q fill:#ede7f6,stroke:#5e35b1 style RDBMS fill:#e3f2fd,stroke:#1976d2 style CACHE fill:#fff3e0,stroke:#f57c00 style SEARCH fill:#e8f5e9,stroke:#388e3c style DOC fill:#f3e5f5,stroke:#8e24aa style VEC fill:#fce4ec,stroke:#c62828 style TS fill:#e0f7fa,stroke:#00838f
先問「你的需求是什麼」:需要交易就 RDBMS,需要快取就 Redis,需要搜尋就 Elasticsearch。大部分系統三個都會用到。
Level 1:選型——先看全貌再決定
在深入任何一種資料庫之前,先搞懂「資料庫的世界有哪些選擇」。
全景概覽 — SQL、NoSQL、NewSQL,每種解決什麼問題。 → 資料庫全景:六大類資料庫的定位 → Infra 視角的 DB 全景:從基礎設施角度看選型 → Document vs Relational:MongoDB vs PostgreSQL 的取捨
設計原則 — 選好了資料庫,怎麼設計 schema。 → 資料庫設計模式:正規化、反正規化、多型關聯 → 好的資料庫設計:從系統設計角度看 DB schema
Level 1:PostgreSQL——大部分情況的正解
如果你不知道選什麼,選 PostgreSQL。它功能全、社群強、從小專案到大系統都撐得住。
flowchart TD PG[PostgreSQL] --> BASICS[基礎操作] PG --> ADV[進階調校] PG --> VS[vs MySQL] PG --> MIG[遷移指南] BASICS --> POOL[連線池] ADV --> EXPLAIN[EXPLAIN 分析] ADV --> PART[Partition] ADV --> VAC[Vacuum] style PG fill:#e3f2fd,stroke:#1976d2 style BASICS fill:#e3f2fd,stroke:#1976d2 style ADV fill:#e3f2fd,stroke:#1976d2 style POOL fill:#fff3e0,stroke:#f57c00
PostgreSQL 從基礎操作到 EXPLAIN 分析、Partition、Vacuum 進階調校,加上連線池管理,覆蓋了大部分 RDBMS 的需求。
基礎與安裝 — PgBouncer 連線池、備份還原、基本設定。 → PostgreSQL 基礎:安裝、PgBouncer、備份還原 → 為什麼選 PostgreSQL:跟其他 RDBMS 的比較
進階調校 — 當 query 開始變慢,你需要這些。 → PostgreSQL 進階:EXPLAIN、Partition、Vacuum → 查詢優化:索引策略、Query Planner → Bulk 操作與索引:壓測數據
PostgreSQL vs MySQL — 這是最常被問的問題。 → MySQL 的愛恨情仇:MySQL 的優缺點 → PG vs MySQL 壓測:效能比較數據 → PG vs MySQL 深入:進階功能比較
遷移 — 從 MySQL 搬到 PostgreSQL。 → PostgreSQL 遷移指南:實戰遷移步驟 → 資料庫遷移策略:通用的遷移方法論
Level 1:Redis——快取不是「加了就好」
Redis 讓讀取效能提升 6.5 倍,但用錯了比不用還慘。Cache stampede、cache 跟 DB 不一致、memory 爆掉——這些都是真實踩過的坑。
→ Cache & Session:快取的基本觀念和 Session 管理 → Cache 的正確用法:mutex lock 防 stampede、delete not update → Cache 反模式:常見的快取誤用 → Redis & ES 壓測:效能數據
Level 1:Elasticsearch——搜尋和日誌
當你需要全文搜尋或日誌分析,RDBMS 的 LIKE 查詢是不夠的。Elasticsearch 用倒排索引讓搜尋速度快幾個數量級。
→ 搜尋引擎:搜尋技術的全景 → Elasticsearch 深入:索引設計、查詢優化、叢集管理 → 搜尋比較:MySQL vs PG vs ELK:三種搜尋方案的壓測 → ELK 推薦系統:用 ES 做推薦
Level 1:其他資料庫類型
不是所有資料都適合放 RDBMS。有些場景需要專門的資料庫。
Vector Database — AI 時代的新寵,存 embedding 做語意搜尋。 → 向量資料庫:Pinecone、Milvus、pgvector
Time Series Database — IoT、監控、金融數據的首選。 → 時序資料庫:InfluxDB、TimescaleDB
Document Database — 結構彈性高,但交易能力弱。 → Document vs Relational:什麼時候該用 MongoDB
Level 1:擴展與高可用
單機跑不動了怎麼辦?讀寫分離、Sharding、Connection Pool——每種擴展方式有不同的適用場景。
→ 資料庫擴展模式:垂直/水平擴展、Sharding、Read Replica → 連線池與擴展:pool=5 vs pool=50 的差異 → 讀寫分離:Read Replica 實作 → Race Condition & 分散式鎖:並發寫入問題 → 樂觀鎖 vs 悲觀鎖:鎖策略選擇 → Saga Pattern:跨服務的資料一致性 → 最終一致性:CAP 理論的實際應用
閱讀路徑
新手(第一次接觸資料庫)
從 資料庫全景 看全貌,然後 PostgreSQL 基礎 裝起來練 SQL。不用急著學 Redis 或 ES——先把 RDBMS 搞熟。
已經會用 SQL,想優化效能
直接看 PG 進階 的 EXPLAIN 分析,再看 Cache 正確用法 加 Redis 快取層。
架構師 / 系統設計面試
把 擴展模式、Saga、讀寫分離 看完,搭配 PG vs MySQL 壓測 的數據來回答面試問題。
知識缺口
| 缺口 | 為什麼重要 | 建議放在哪 |
|---|---|---|
| ⚠️ MongoDB 實戰篇 | Document DB 在選型篇帶過,但缺實際操作 | database/ |
| ⚠️ Redis Cluster | 單機 Redis 的擴展方案,Sentinel vs Cluster | database/ 或 infra/ |
| ⚠️ 資料庫備份與災難恢復 | 目前只在 PG 篇帶過,缺通用的備份策略 | infra/ |
| ⚠️ NewSQL(CockroachDB / TiDB) | 分散式 SQL 的新選擇 | database/ |
| ⚠️ 資料庫 Connection Pooler 比較 | PgBouncer vs pgcat vs Supavisor | infra/ |
FAQ
Q: SQL 跟 NoSQL 差在哪? A: SQL 資料庫有固定 schema(像 Excel 表格),適合結構明確、需要 ACID 交易的場景。NoSQL 結構彈性(像 JSON),適合快速開發或資料結構常變動的場景。大部分應用選 SQL(PostgreSQL)不會錯。詳見 資料庫全景。
Q: PostgreSQL 跟 MySQL 怎麼選? A: PostgreSQL 功能更強(JSON 支援、CTE、Window Function),MySQL 生態更廣(WordPress、PHP 生態系)。新專案建議選 PostgreSQL。壓測數據顯示兩者效能差異不大,差別在進階功能。詳見 深入比較。
Q: 什麼時候需要加 Redis? A: 當你的讀取量遠大於寫入量(10:1 以上),而且同一筆資料會被重複讀取。典型場景:使用者 Profile、商品資訊、設定值。不要對頻繁更新的資料加 cache——會有一致性問題。詳見 Cache 正確用法。
Q: Elasticsearch 跟資料庫的搜尋差在哪?
A: RDBMS 的 LIKE '%keyword%' 是全表掃描,資料量大就很慢。Elasticsearch 用倒排索引,搜尋速度幾乎不受資料量影響。而且 ES 支援中文分詞、模糊搜尋、權重排序。詳見 搜尋比較。
Q: 什麼是連線池?為什麼重要? A: 資料庫連線的建立和銷毀很貴(幾十毫秒)。連線池預先建好一批連線重複使用,避免每次 request 都開新連線。PgBouncer 是 PostgreSQL 最常用的連線池。設定不當(pool 太大或太小)會直接影響效能。詳見 連線池與擴展。
Q: 資料庫要怎麼做水平擴展? A: 讀多寫少用 Read Replica(讀寫分離),寫入量大用 Sharding(資料分片)。但 Sharding 會大幅增加複雜度——跨 shard join、分散式交易都是坑。能用 Read Replica 解決就不要 Shard。詳見 擴展模式。