~/VibeHandbook
免費 PDF

14 · 01

資料儲存的三種形態

大多數資料庫分為三個家族。你不需要去背產品——你需要認出哪種形態適合你的問題。

型別例子最適合取捨
關係型(PostgreSQL, MySQL, SQLite帶關係的結構化資料;任何與金錢或準確性相關的關鍵場景你必須預先設計 schema;把寫入擴充套件到非常大的規模更難
文件型 / MongoDB, Firestore, DynamoDB靈活或巢狀的資料、快速迭代、形態各異的記錄容易產生不一致的資料;關係和報表處理起來很彆扭
鍵值型Redis, Memcached, Cloudflare KV快取、會話、計數器、按已知鍵的快速查詢無法按內容查詢;通常不是你的事實來源

這三種形態以確實不同的方式儲存資料。把它們並排來看:

  關係型 (SQL)              文件型 (NoSQL)           鍵值
  行 + 列                   自包含的資料塊           一鍵 → 一值
  ┌────┬───────┬──────┐     ┌──────────────────┐     ┌─────────┬─────────┐
  │ id │ email │ name │     │ {                │     │ key     │ value   │
  ├────┼───────┼──────┤     │   id, email,     │     ├─────────┼─────────┤
  │ 1  │ a@... │ Ana  │     │   name,          │     │ session │ "x9f2"  │
  │ 2  │ b@... │ Bob  │     │   posts: [ ... ] │     │ count   │ "42"    │
  └────┴───────┴──────┘     │ }                │     └─────────┴─────────┘
  表彼此                    └──────────────────┘     內部無法查詢 —
  相互引用                  一切都巢狀著             只能按鍵查詢

把關係型資料庫想像成一組彼此知道如何相互引用的電子表格。你用來跟它對話的語言就是 SQL(Structured Query Language,結構化查詢語言)。對 90% 的專案來說一個好的預設選擇:從關係型資料庫(Postgres)開始。 它成熟、可預測、強制結構化,並能處理真實應用不可避免會長出來的關係。當你的資料確實沒有固定形態時,再去考慮文件儲存;而鍵值儲存則作為一個輔助層(快取),而不是你的主儲存。

要避免的陷阱是憑感覺選。"NoSQL(不使用 SQL 表的資料庫——它儲存靈活、自由形態的記錄)擴充套件性更好"只對一小撮大多數應用永遠碰不到的問題成立,而即便如此,代價也是放棄那些讓資料可信賴的一致性保證。挑選與你的資料相匹配的形態,而不是在系統設計影片裡聽起來最唬人的那個。拿不準時,關係型是穩妥的選擇——快取或文件儲存你以後隨時可以加上,但解開一團亂麻的 NoSQL 資料模型卻很痛苦。

想離線閱讀?

免費下載整本書的 PDF 或 EPUB。