Chuyển đến nội dung chính

第 9 課:SQL 與 NoSQL - 選出正確的資料庫

RDBMS 和 ACID 屬性。 NoSQL 類別:鍵值(Redis、DynamoDB)、文件(MongoDB、CouchDB)、寬列(Cassandra、HBase)、圖(Neo4j)。鹼與酸。什麼時候選擇SQL,什麼時候選擇NoSQL。多語言持久性。 NewSQL(CockroachDB、TiDB)。

🏗️ 建築 — 第 9 課 第 9 課:SQL 與 NoSQL - 選出正確的資料庫 適合的

系統架構:從零到英雄

第 3 部分:資料庫架構與資料管理

亞洲開發網

簡介

資料庫是每個系統的核心。選擇錯誤的資料庫可能會導致整個系統的重新架構—昂貴且痛苦。本文可協助您了解每種類型的資料庫以及何時選擇哪種資料庫。


1. SQL(關聯式資料庫)

1.1 酸性質

物業意義範例
原子性交易要麼全有要麼全無匯款:減去 A + 加 B 或什麼都沒有
一致性資料始終處於有效狀態平衡永遠不會是負數
隔離交易互不影響2人一起買票→不衝突
耐用提交完成=資料安全伺服器崩潰≠資料遺失

1.2 什麼時候選擇SQL?

✓ Data có cấu trúc rõ ràng (schema cố định)
✓ Relationships phức tạp (foreign keys, joins)
✓ Cần ACID transactions
✓ Data integrity quan trọng
✓ Query patterns đa dạng (ad-hoc queries)

Ví dụ: Banking, ERP, E-commerce orders, CRM

1.3 熱門:PostgreSQL 與 MySQL

特點PostgreSQLMySQL
酸完整完整(InnoDB)
JSON 支援優(JSONB)好
全文搜尋內建內建
複製串流媒體,邏輯二進位日誌
擴展TimescaleDB、PostGIS有限公司
最適合複雜查詢,資料完整性網頁應用程序,閱讀量大

2. NoSQL 類別

2.1 鍵值存儲

SET user:123 → {"name": "John", "email": "[email protected]"}
GET user:123 → {"name": "John", "email": "[email protected]"}

Cực nhanh: O(1) read/write
Hạn chế: Không có query phức tạp, không có relationships
資料庫最適合
Redis快取、會話、排行榜、發布/訂閱
DynamoDB無伺服器、自動縮放鍵值
記憶體快取簡單的快取

2.2 文件存儲

// MongoDB document
{
  "_id": "order_123",
  "customer": {
    "name": "John",
    "email": "[email protected]"
  },
  "items": [
    {"product": "Laptop", "price": 1000, "qty": 1},
    {"product": "Mouse",  "price": 25,   "qty": 2}
  ],
  "total": 1050,
  "status": "shipped"
}
資料庫最適合
MongoDB架構靈活,開發快速
CouchDB離線優先,同步
彈性搜尋全文搜尋、分析

2.3 寬列存儲

Row Key: user_123
  Column Family "profile":
    name: "John"
    email: "[email protected]"
  Column Family "activity":
    last_login: "2026-03-30"
    posts_count: 42

Mỗi row có thể có columns khác nhau
→ Linh hoạt cho IoT, time-series, analytics
資料庫最適合
卡桑德拉高寫入吞吐量、多資料中心
HBaseHadoop 生態系、分析
ScyllaDB相容於Cassandra,效能更高

2.4 圖表資料庫

(John) ─[FRIENDS_WITH]─► (Jane)
(John) ─[WORKS_AT]────► (Google)
(Jane) ─[LIVES_IN]────► (Hanoi)
(John) ─[LIKES]───────► (Post_123)

Query: "Tìm bạn của bạn John sống ở Hà Nội"
→ Cực nhanh với Graph DB, cực chậm với SQL (multiple JOINs)
資料庫最適合
Neo4j社群網路、推薦、詐欺偵測
亞馬遜海王星AWS 託管圖
ArangoDB多模型(文檔+圖表)

3. 酸與鹼

物業酸性(SQL)基礎(NoSQL)
焦點一致性可用性
交易強軟狀態
規模垂直為主水平
一致性立即最終
架構固定靈活

4. SQL 與 NoSQL 決策框架

                      Cần ACID?
                      ╱       ╲
                   Yes         No
                    │           │
               Complex         Scale
              Relations?    requirements?
              ╱       ╲     ╱        ╲
           Yes        No   High       Low
            │          │    │          │
         SQL          SQL  NoSQL      SQL
      (PostgreSQL)  (MySQL)(Cassandra)(Simple)
                           (MongoDB)

4.1 決策矩陣

要求→ 資料庫
銀行、金融PostgreSQL(ACID)
使用者會話、快取Redis(鍵值)
內容管理、CMSMongoDB(文件)
社交圖譜、建議Neo4j(圖)
物聯網,時間序列卡桑德拉/TimescaleDB
全文檢索彈性搜尋
電商目錄MongoDB + Elasticsearch
分析、資料倉儲ClickHouse/BigQuery

5. 多語言持久性

E-commerce Platform:

┌─────────────────────────────────────────────┐
│              Application Layer               │
├──────────┬──────────┬───────────┬───────────┤
│ Users    │ Products │ Orders    │ Analytics │
│   │      │   │      │   │       │   │       │
│PostgreSQL│ MongoDB  │PostgreSQL │ClickHouse │
│(accounts)│(catalog) │(payments) │(reports)  │
├──────────┴──────────┴───────────┴───────────┤
│              Redis (Caching Layer)            │
├─────────────────────────────────────────────┤
│          Elasticsearch (Search)              │
└─────────────────────────────────────────────┘

每個服務都會為其用例選擇最合適的資料庫。


6.NewSQL

NewSQL 結合了兩者的優點:ACID + 水平擴展。

資料庫描述
CockroachDB分散式 SQL,相容於 PostgreSQL
TiDBMySQL 相容,HTAP
Google扳手全球分佈式,強一致性
YugabyteDB相容 PostgreSQL,分散式
NewSQL = SQL Syntax + ACID Transactions + Horizontal Scaling

Trade-off: Latency cao hơn single-node SQL (distributed overhead)

總結

資料庫類型優勢使用案例
SQLACID、關係、複雜查詢銀行、電子商務、ERP
鍵值速度、簡單快取、會話
檔案架構靈活,快速開發CMS、目錄
寬柱寫入吞吐量、規模物聯網,時間序列
圖表關係查詢社交、推薦
新SQL兩全其美分散式酸

練習

  1. 資料庫選擇: 對於醫療保健管理系統(醫院),選擇以下資料庫:(a) 病患記錄,(b) 體檢歷史,(c) 醫學影像,(d) 症狀搜索,(e) 醫病關係。

  2. 多語言設計: 為類似 Shopee 的平台設計資料架構。確定每個服務需要哪個資料庫以及原因。

  3. **遷移:**系統目前全部使用MongoDB。訂單需要強一致性。計劃在不停機的情況下將訂單遷移到 PostgreSQL。