什麼是關聯式資料庫?

關聯式資料庫是一組資訊,以預先定義的關係整理資料,可將資料儲存在一或多個資料表 (或「關係」) 的資料欄或資料列中,以輕鬆查看及瞭解不同的資料結構之間有何關聯。「關係」是不同資料表之間的邏輯連結,根據這些資料表之間的互動來建立。

『關聯』是指不同表格中可以通過共同的欄位(通常是主鍵鍵和外鍵)建立關聯。

為什麼我們使用 RDBMS 而不是 noSQL

RDBMS 主要的核心在於提供嚴格的 ACID 特性,來確保事務(transaction)的可靠度。這對需要絕對準確性的應用(金融系統、訂單處理 etc…)至關重要。

RDBMS 提供複雜查詢功能,包括多表 JOIN、聚合函數、子查詢等,雖然 noSQL 本身有具備類似的功能,但 noSQL 的 JOIN 效能通常不如 RDBMS,因為 noSQL 設計理念是避免 JOIN

RDBMS 中預先定義的 Schema 確保資料格式一致,減少資料品質問題。這在需要嚴格資料規範的企業應用中特別重要。

RDBMS 的設計哲學與核心價值

RDBMS 主要圍繞著幾個原則來確保資料的一致性、完整性以及可靠性:

  1. ACID 特性
  2. 正規化(Normalization)
    通過正規化減少資料冗餘,將資料分散到多個相關的表中,透過外鍵建立關聯。可以:
    • 避免資料重複儲存
    • 降低資料不一致的風險
    • 簡化資料更新操作
    • 節省儲存空間
  3. 資料完整性約束
    • 實體完整性:主鍵唯一且不為空
    • 參照完整性:外鍵必須參照存在的主鍵值
    • 領域完整性:資料類型、格式、範圍的限制
    • 使用者定義完整性:業務規則的約束

何時該選 RDBMS vs noSQL

對於選擇 RDBMS 的 senario 主要在於需要

  1. 強一致性與 ACID 保證 有以下例子

    • 金融交易系統:確保交易不會遺失、重複或出現部分完成
    • 電商訂單系統:訂單、庫存、支付之間必須保持強一致性
    • 任何無法容忍資料不一致的關鍵業務場景
  2. 複雜的資料關聯與查詢

    • 需要頻繁進行多表 JOIN 操作
    • 複雜的聚合查詢、子查詢、窗口函數
    • 財務報表、業務分析、數據儀表板
    • 資料之間有緊密的關聯性(如用戶-訂單-商品-支付的關係網)
  3. 嚴格的資料結構與完整性

    • ERP/CRM 企業管理系統:需要嚴格的資料驗證和約束
    • 資料格式必須一致,不允許異常數據
    • 需要利用外鍵、唯一性約束等來保證資料品質
    • Schema 相對穩定,變動頻率低
  4. 可預測的資料規模

    • 資料量在單機或小型叢集可處理的範圍內(TB 級以下)
    • 增長速度可預測且相對穩定
    • 垂直擴展(升級硬體)即可滿足需求
    • RDBMS 在超大規模時,水平擴展比 NoSQL 更複雜
    • 需要手動設計分片策略,運維成本較高
  5. 成熟的生態系統與團隊經驗

    • 團隊熟悉 SQL 和關聯式資料庫設計
    • 豐富的工具支援(備份、監控、優化)
    • 行業最佳實踐與成熟的解決方案

對於選擇 NoSQL 的 senario 主要在需要

  1. 高併發與水平擴展能力,例如以下情景

    • 社交媒體動態牆:每秒數十萬甚至百萬次的讀寫請求
    • 即時聊天系統:大量用戶同時在線
    • 遊戲即時排行榜:頻繁的分數更新
    • 需要通過增加節點來線性提升效能
  2. 海量資料儲存

    • 應用日誌、系統監控數據
    • IOT感測器產生的時序資料
    • 點擊流、用戶行為追蹤
    • 資料量達到 PB 級且持續快速增長
  3. 靈活的 Schema 設計

    • 產品快速迭代階段,資料結構頻繁調整
    • 半結構化或非結構化數據(如 JSON 文檔)
    • 不同記錄可能有不同的欄位
    • 內容管理系統、使用者個性化配置
  4. 最終一致性可接受

    • 資料分析場景,不需要即時的強一致性
    • 內容推薦系統,可容忍短暫的數據延遲
    • 瀏覽記錄、搜尋歷史等非關鍵數據
    • 分散式系統中優先考慮可用性(CAP 理論中的 AP)
  5. 簡單的查詢模式

    • 主要是鍵值查詢或文檔查詢
    • 很少需要跨多個集合的 JOIN 操作
    • 讀多寫少或寫多讀少的極端場景
    • 快取層應用(Redis、Memcached)
  6. 地理分散式部署

    • 需要跨多個數據中心部署
    • 全球化應用需要就近訪問
    • 多活架構,任一區域故障不影響整體服務

選型決策樹

在選擇資料庫時,可以問自己以下問題:

資料一致性要求有多高?

  • 必須強一致 → RDBMS
  • 可接受最終一致 → 可考慮 NoSQL

資料關聯性如何?

  • 高度關聯,需要頻繁 JOIN → RDBMS
  • 關聯少,資料相對獨立 → NoSQL

資料結構是否穩定?

  • 穩定,變動少 → RDBMS
  • 頻繁變動,需要靈活性 → NoSQL

預期資料量與增長速度?

  • 可預測,中小規模 → RDBMS
  • 爆炸性增長,海量資料 → NoSQL

查詢複雜度如何?

  • 複雜查詢、多表關聯、聚合分析 → RDBMS
  • 簡單的鍵值查詢或文檔查詢 → NoSQL