資料庫不是「選一個就好」——大部分生產系統同時用 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 Clusterdatabase/ 或 infra/
⚠️ 資料庫備份與災難恢復目前只在 PG 篇帶過,缺通用的備份策略infra/
⚠️ NewSQL(CockroachDB / TiDB)分散式 SQL 的新選擇database/
⚠️ 資料庫 Connection Pooler 比較PgBouncer vs pgcat vs Supavisorinfra/

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。詳見 擴展模式