AI 能幫你寫程式,但不會主動幫你想「這份資料活在哪一層」。 這 Unit 從 CS 角度拆給你看 — 資料庫到底在解什麼問題、為什麼非它不可、跟 AI 講需求時你要提供哪些 context。
不是資料夾、不是 Google Sheets — 而是為「跨重整、跨裝置、跨用戶共享」而存在的儲存系統。
資料庫不是「比較厲害的檔案」,也不是「線上版 Excel」。 它存在的理由很單純 — 讓資料活過程式的生命週期、讓不同裝置的不同人讀到同一份。
這聽起來很抽象。但拆開來看,它做的就是 四件事:把資料的形狀守住(結構化)、找得快(高效查詢)、多人同時動不打架(並發控制)、斷電後還活著(持久化)。這四件事缺一個,都不能叫資料庫。
下面分三步把這件事吃進去: 先看「跨裝置共享」實際長什麼樣 → 再定位資料庫在整個系統裡的「居住階層」 → 最後一關一關拆它做的四件事。
同一個 App 同時開在筆電跟手機上 — 兩台裝置各有一個 Volatile(活在記憶體)跟一個 Persistent(活在資料庫)計數器。試試看:哪個計數器會跨裝置同步、哪個重整就歸零。
資料庫住在整條「記憶體階層」的最下面。愈往上愈快但愈短命、愈個人;愈往下愈慢但愈持久、愈能共用。「該存哪」其實就是在問「該住哪一階」 — 而資料庫就是最下、最慢、但最持久、最共享的那一階。
資料庫之所以叫資料庫,是因為它同時把這四件事內建好 — 結構化、高效查詢、並發控制、持久化。下面四關,看 AI 推給你的方案到底漏了哪一個契約。
→ 下面 §2 先從第一個契約「結構化」開始 — 它是讓資料庫從一堆檔案變成「可信來源」的第一道門。
上一段預告了四個契約,這段拆第一個 — 結構化。同樣一筆髒資料丟進 NoSQL 倉庫 vs SQL 守門,結果差很多。
你用 AI 做註冊頁時,前端會擋 email 沒 @、年齡填中文、密碼太短 — 但前端可以被繞過,AI agent、webhook、後台腳本都可能直接寫到資料庫。Schema 就是把同一套規則寫進資料庫本身,所有寫入路徑都被同一份規則檢查,不合規的當下擋下。
做一個 users 表:
- 每個人一定要有名字
- 年齡要是數字
- email 要長得像 email
- 價格不能是負的CREATE TABLE users (
name TEXT NOT NULL, -- 一定要有名字
age INTEGER, -- 數字
email TEXT CHECK (email~'@'), -- email 格式
price NUMERIC CHECK (price >= 0) -- 不能負
);怎麼用:跟 AI 描述五種規則就夠 — 必填、型別、格式、範圍、外鍵 / 唯一。AI 自動翻成 CREATE TABLE 的約束。 NoSQL 沒這層 — 什麼都收,等你讀資料才發現一半對不上。
→ Schema 守住資料的形狀,但 100 萬筆裡找一筆還是慢 — 這是 §3 要解決的問題。
上一段守住資料形狀,這段要解決『找得快』。同一筆查詢,O(n) vs O(log n) vs O(1)。
想像一本厚厚的字典,但沒有目錄 — 要找「資料庫」這個詞,只能從第一頁翻到最後一頁。100 頁還好,100 萬頁就崩潰。 這叫 full table scan(全表掃描),資料量愈大花的時間愈久 — 工程師會說「複雜度是 O(n)」,意思就是「跟資料量 n 成正比」。
Index(索引) 就是幫某個欄位多做一份「目錄」。最常見的是 B-tree(像一棵排好順序的樹),查詢時間變成 O(log n) — 100 萬筆也只要約 20 步就找到。 還有更快的 hash 索引,等於建一張對照表,O(1) 直接拿到(不管多大筆,固定時間)。
id = 182但 index 不是免費的:每加一個 index,寫入會變慢(要同步更新目錄)、硬碟要多吃一份空間。所以哪些欄位該下、哪些不該下,是真實的工程取捨。 下面是真的 JavaScript benchmark — 同一筆 id 查 100 萬筆資料,三種方法的時間差會直接打在你眼前。
→ 找得快了,但同一筆資料兩個人同時要改怎麼辦?— §4 並發控制。
資料的正確性除了形狀,還有『多人同時動』。切換 3 種寫法,看哪一邊會出包。
想像庫存還剩 10 件。用戶 A 跟 用戶 B 幾乎同時按下「購買」:程式先「讀」出庫存 = 10、計算「10 - 1 = 9」、再「寫回」9。 如果 A 跟 B 同時跑這三步、互不知道對方,兩人都會讀到 10、都寫回 9 — 結果應該賣兩件、庫存應該變 8,卻變成 9。少賣了一件。這就是 race condition:誰先誰後沒人管,結果取決於 OS 排程的運氣。
資料庫提供兩種解法:Transaction(交易) 用 BEGIN / COMMIT 包成「不可被打斷」的單位,資料庫鎖住那一列,A 處理完才換 B。Atomic operation(原子操作) 更直接 — 根本不抓資料,直接告訴 DB UPDATE stock = stock - 1,DB 內部保證這個運算不可分割。
SELECT 抓出來、改一改、再 UPDATE 回去」三步式邏輯,在庫存、餘額、按讚數這類場景,一個人用對、多人用就會少賣。→ 結構、查詢、並發都做了,但機器一斷電全沒了 — §5 持久化。
最後一個契約 — 寫進去之後真的活著。4 台機器排在你面前,寫入、拔電源、看誰活下來。
你以為「資料寫進去了」就安全?其實沒這麼簡單。資料從程式出發到「真的躺在硬碟上」,中間還會在作業系統的「暫存區」停留一下 — 為了效能,OS 通常會延後寫入。 這個空窗期斷電 → 資料消失。
所以資料庫多了兩道保險:fsync 命令 OS「現在馬上把資料寫到硬碟,不准延後」;WAL(Write-Ahead Log) 先寫一份「我要做什麼」的日誌、強制落地,再去動真正的資料表 — crash 後可以照日誌重做一次。
但單機再可靠也擋不住整台機器掛掉。所以還有 Replication(複製) — 同一份資料同步到第二台、甚至放到別的機房。主庫掛了從庫頂上,這就是「高可用」的基本招式。
→ 這四個契約讓 App 不掉資料、不出包 — 但這還只是「技術價值」。下面 §6 要講「商業價值」:為什麼資料庫是 vibe coder 的護城河。
四契約解決『不出事』;接下來講『為什麼出事不只是 bug、是商業災難』。
AI 時代介面是廉價的 — Instagram、Netflix、Spotify 的 UI,AI 看一眼就能仿。那為什麼大家不換家?因為真正貴的東西在資料庫裡:追蹤的 800 個朋友、看過哪些影片到第幾分鐘、失戀那週狂播哪首歌 — 新平台抄不走也補不回來。
對 vibe coder 的啟示:跟 AI 設計 schema 時主動加一句「哪些欄位之後會變值錢?用戶行為、互動記錄、偏好歷史,第一天就要存」— 護城河是滴水穿石的,不能事後補。
九宮格照片牆、限動圓圈、底部導覽 — 看一眼就知道怎麼排
~ 2,000 億條好友關係 — 追蹤的 800 個人、五年來按過讚的每張照片、跟誰常互傳訊息 — 換到新 App,朋友全不在那邊,你還要不要用?
→ 資料庫是護城河,但選錯一樣會把護城河變沼澤 — §7 怎麼選。
知道資料庫多重要之後,下一步:怎麼選對。點下面 3 個 App 看哪個最像你的,再直接複製它的 prompt 去問 AI。
AI 沒給 context 時預設給你 Firebase / Supabase — 因為它不知道你的需求是哪一型。 但其實 90% 的個人 App 都長得像下面 3 種之一: 自己用的工具型 App、有金流的交易型 App、讀重型的社群 App。
找到最像你的場景,直接複製它的 prompt 去問 AI — 比起硬填一張問卷,這樣的 context 更具體,AI 也更知道你在哪個權衡點上。
→ 選型不只看現在,還要看「半年後」— §8。
選對只是第一關,第二關是『半年後流量長 10 倍』。拖時間軸看不同階段會冒出什麼問題 — 每個都是「前期決策」種下的。
軟體工程裡有個現象:很多 demo 時跑得好好的方案,到了真實流量會「突然」爆 — 但其實不是突然,是 前期決策埋下的債 在累積到某個臨界點才出事。
這條軸把它拆成 4 個階段。每個階段會冒出特定型態的問題 — 查詢慢、並發 bug、帳單炸鍋、遷移地獄、廠商鎖死、跨區法規。 AI 在你問「現在能不能跑」時不會主動講這些 — 因為「未來」不在它的視野裡。
→ 契約、商業、選型、風險都看完,最後回頭看「並不是所有資料都該丟資料庫」— §9。
這個 Unit 走完前的最後一個本能 — 下需求前先分桶。拖卡片到三個桶,放完按「看正解」會告訴你為什麼 + AI 會怎麼猜。
做產品時,所有資料都可以歸到三個位置:
分錯桶會發生具體災難 — 把訂單放 useState(重整就棄單)、把搜尋記憶放資料庫(每筆都打 server)。 AI 在沒有 context 的情況下「預設往最簡單的那層猜」,所以你要在心裡先有答案 — 拖完卡片後會看到每張卡片的正解、丟錯的具體災難,以及 AI 通常會猜哪邊。
→ 分完桶你才知道哪些丟資料庫、哪些留前端 — 這個 Unit 結束了,§10 收尾。
資料庫不是讓 App「能存資料」,
是讓 App 從玩具 變成產品。
Vibe coder 跟 AI 協作時的 7 個直覺:
知道資料庫的契約之後,下一步分得出兩個陣營的差別 — 關聯式怎麼想、文件式怎麼想,以及 ACID、JOIN、CAP 這些 CS 觀念。