如果你正在打造你的第一個實際應用程式,你很快就會遇到這個問題:「我應該使用 SQL 還是 NoSQL?」

這聽起來有點嚇人,但一旦你掌握核心概念,其實非常簡單。讓我們來拆解說明。

資料庫到底是什麼?

資料庫就是存放你應用程式資料的地方,這樣資料就不會在你關閉瀏覽器的那一刻消失。把它想像成一個非常有條理的檔案櫃。如何整理這個檔案櫃,就是 SQL 和 NoSQL 分道揚鑣的地方。

SQL 資料庫:結構化且嚴謹

SQL 資料庫(如 PostgreSQL、MySQL 或 SQLite)將資料儲存在資料表中——以列和欄的方式,就像試算表一樣。每一列都遵循相同的結構,而且資料表之間可以相互連結。

範例:簡單的 usersorders 設定。

CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  name VARCHAR(100),
  email VARCHAR(100)
);

CREATE TABLE orders (
  id SERIAL PRIMARY KEY,
  user_id INT REFERENCES users(id),
  item VARCHAR(100),
  price DECIMAL
);

Enter fullscreen mode Exit fullscreen mode

想要取得特定使用者的所有訂單?只需要一個簡潔的查詢:

SELECT orders.item, orders.price
FROM orders
JOIN users ON orders.user_id = users.id
WHERE users.email = '[email protected]';

Enter fullscreen mode Exit fullscreen mode

那個 JOIN 就是 SQL 的超能力。資料之間的關聯性由資料庫本身強制執行,而且跨資料表的查詢也非常直觀。

NoSQL 資料庫:彈性且快速

NoSQL 資料庫(如 MongoDB、Firebase 或 Redis)不會強迫你的資料放入僵化的資料表。最常見的類型——文件資料庫——將資料儲存為類似 JSON 的物件,而且每個文件的外觀可以彼此不同。

範例:在 MongoDB 中相同的「使用者與訂單」概念。

{
  "_id": "0001",
  "name": "Jane",
  "email": "[email protected]",
  "orders": [
    { "item": "Keyboard", "price": 45 },
    { "item": "Mouse", "price": 20 }
  ]
}

Enter fullscreen mode Exit fullscreen mode

關於 Jane 的所有資訊都存在單一文件中。不需要 join——你只要直接取出即可。

真正的差異

SQL NoSQL
結構 固定資料表、列與欄 彈性文件/物件
綱要 預先定義 隨時可以變更
關聯性 透過 joins 建立強關聯 通常採用巢狀或重複方式
擴展性 主要是垂直擴展(更大型的伺服器) 原生支援水平擴展
適合情境 交易處理、複雜查詢 快速迭代、大量寫入

那麼我應該使用哪一種?

老實說,這取決於你正在打造什麼。

  • 如果你正在打造涉及金錢、庫存,或任何需要嚴格一致性的東西(銀行、金融、電子商務結帳)?選擇 SQL。
  • 如果你正在打造資料結構經常變動,或需要快速處理大量讀寫的應用(聊天應用程式、活動動態、內容平台)?NoSQL 更適合。

這裡是大多數教學忽略的部分:你不必只選擇其中一種。許多實際上線的應用程式會同時使用兩者——使用 SQL 存放核心交易資料,並搭配 Redis 作為快取,或使用 MongoDB 存放日誌和分析資料。這種混合方式有時被稱為多語持久化,而且比人們想像中更常見。

總結

SQL 與 NoSQL 其實不是一場戰爭——它是在結構與彈性之間的權衡。一旦你了解每種資料庫真正擅長的地方,選擇通常會根據你正在打造的東西而自然浮現。