MODULE 6 · 資料庫 · 6-4

什麼是資料庫?
為什麼 AI 時代更需要懂它?

前面 6-1 到 6-3,你已經會用 Git 跟 GitHub 把「程式碼」好好存起來了。接下來 App 要存的,是另一種東西:「用戶的資料」(帳號、訂單、留言這些),這就要靠資料庫。 AI 能幫你寫程式,但不會主動幫你想「這份資料活在哪一層」。 這 Unit 從 CS 角度拆給你看,資料庫到底在解什麼問題、為什麼非它不可、跟 AI 講需求時你要提供哪些 context。

§1 · 資料庫概念

什麼是資料庫?

不是資料夾、不是 Google Sheets,而是為「跨重整、跨裝置、跨用戶共享」而存在的儲存系統。

「資料要存哪?」常見的兩個答案其實都撐不住
📁資料夾
  • 存單機硬碟
  • 換裝置就沒了
  • 不能多人共用
只活在一台機器
📊Google Sheets
  • 多人改就互相蓋掉
  • 沒有型別約束
  • 資料量一大就撐不住
不是給程式讀寫的
🏛️資料庫
  • 🔄 跨重整不歸零
  • 📱 跨裝置即時同步
  • 👥 跨用戶讀同一份
為共享而生的儲存系統

資料庫不是「比較厲害的檔案」、也不是「線上版 Excel」。它存在的理由很單純:讓資料活過程式的生命週期、讓不同裝置的不同人讀到同一份

步驟 1先看:跨裝置共享是什麼意思

同一則 IG 貼文,同時開在你的筆電跟手機上。下面這台 demo 試兩件事:

  • ① 在手機點一下打「還沒送出」的草稿留言,按重整 → 它消失了
  • ② 在手機按一下愛心,看電腦 → 愛心數自己跟著動

一個重整就沒、一個跨裝置同步,差別就是有沒有存進資料庫

📷 同一則 IG 貼文,同時開在兩台裝置
instagram.com
💻
vibeacademy···
🏖️
存資料庫跨裝置共享 · 撐過重整
128人說讚
只在這台記憶體
🏛️ 後端資料庫
128
這則貼文的愛心數
(兩台共享一份)
9:41
instagram.com · 📱
vibeacademy···
🏖️
存資料庫跨裝置共享 · 撐過重整
128人說讚
只在這台記憶體
試試看:① 在手機草稿框點一下打一句留言再按重整 ② 在手機按一下愛心。看哪個跨裝置同步、哪個重整就沒。

步驟 2資料居住的 5 階

資料庫住在整條「記憶體階層」的最下面。「該存哪」其實就是在問「該住哪一階」:

  • ⬆️ 愈往上:愈快,但愈短命、愈個人
  • ⬇️ 愈往下:愈慢,但愈持久、愈能共用

資料庫就是最下、最慢、但最持久、最共享的那一階。

愈往下:
愈慢、愈大、愈持久、愈多人能共用
愈往上:
愈快、愈小、愈短命、愈個人

→ 知道資料庫是什麼之後,先別急著學它怎麼運作。下一段先講一件更高層的事:為什麼「累積的資料」是 AI 時代最拿不走的資產。

§2 · 商業護城河

AI 能複製 UI,但拿不走累積的資料

先講最高層的一件事:為什麼資料,是你跟 AI 協作時最該從第一天就守住的資產。

AI 時代 介面是廉價的,AI 看一眼就能仿。真正貴的是被存下來的東西:你追蹤的 800 個朋友、看到第幾分鐘、失戀那週狂播哪首歌,新平台抄不走、也補不回來。下面點不同品牌,看它的護城河是什麼。

📸Instagram
UI 可抄 90% · 資料可抄 5% · 落差 85pp
看得見 · UI90%

九宮格照片牆、限動圓圈、底部導覽,看一眼就知道怎麼排

看不見 · 你的朋友圈5%

~ 2,000 億條好友關係追蹤的 800 個人、五年來按過讚的每張照片、跟誰常互傳訊息,換到新 App,朋友全不在那邊,你還要不要用?

🔑VIBE CODER 秘訣點一下看這題秘訣
👀觀察
AI 給的方案只滿足「現在的功能需求」,不會主動幫你留下「未來變值錢」的資料。半年後想做個人化推薦,才發現歷史資料根本沒存。
💬怎麼跟 AI 講
規劃資料時主動問:「哪些資料之後會變值錢?用戶行為、互動歷史、偏好變化要不要從第一天就存?」護城河是日積月累的,不能事後補。

→ 知道資料值錢之後,接下來先綜觀一遍:一個真正的資料庫,到底默默幫你顧了哪四件事。

§3 · 四件事綜觀

資料庫默默幫你顧的四件事

它之所以叫資料庫,是因為這四件事它一次全包了。這裡先各看一眼,接下來一件一件深入。

→ 四件事先有個輪廓了。接下來一件一件拆開玩,從第一件「結構化」開始。

§4 · 結構化 = Schema 是資料的結構

Schema 是資料的結構

上一段預告了四個契約,這段拆第一個:結構化。同樣一筆髒資料丟進 NoSQL 倉庫 vs SQL 守門,結果差很多。

前端能擋的,AI agent、webhook、後台腳本 都能繞過、直接寫進資料庫。Schema 是把同一套規則寫進資料庫本身,每條寫入路徑都被它當下擋下。

你跟 AI 講的話 · 白話需求prompt
做一個 users 表:
- 每個人一定要有名字
- 年齡要是數字
- email 要長得像 email
- 價格不能是負的
AI 幫你生的 schema · 資料庫約束auto-generated
CREATE TABLE users (
  name  TEXT    NOT NULL,          -- 一定要有名字
  age   INTEGER,                   -- 數字
  email TEXT    CHECK (email~'@'), -- email 格式
  price NUMERIC CHECK (price >= 0) -- 不能負
);
跟 AI 描述五種規則就夠:必填型別格式範圍外鍵 / 唯一

AI 自動翻成 CREATE TABLE 約束。NoSQL 沒這層、什麼都收,等你讀資料才發現一半對不上。

實驗:同一筆髒資料 → NoSQL vs SQL 反應
📦NoSQL 倉庫來者不拒收下 0
📭倉庫空空,按上方按鈕投入資料
🛡️SQL 守門寫入時擋下0·0
🛡️守門待命,按上方按鈕嘗試寫入
Schema 工具箱 · 點擊看 SQL 語法
寫 schema 的成本
10 分鐘設好 5 個 constraint
髒資料連 prod 都進不去
不寫 schema 的成本
半年後 debug 3 小時
前端炸 → 翻日誌 → 寫 migration → 洗資料
🔑VIBE CODER 秘訣點一下看這題秘訣
👀觀察
AI 給的 schema 常常型別寫了、必填漏了,或 FK 沒設定,看起來能跑,髒資料一進來就 debug 三小時。
💬怎麼跟 AI 講
每次拿到 schema 都用 5 件事 checklist 過一遍:「型別對嗎?哪些必填?預設值是什麼?有沒有範圍約束?FK 有沒有指對?」漏一項都讓 AI 補上。

→ Schema 守住資料的形狀,但 100 萬筆裡找一筆還是慢,這是下一段要解決的問題。

§5 · 高效查詢 = Index 是什麼

Index 不是魔法,它是用「事先排好 / 建好對照表」換查詢速度。

上一段守住資料形狀,這段要解決『找得快』。同一筆查詢,O(n) vs O(log n) vs O(1)。

沒有目錄的字典要一頁頁翻(full table scan),資料愈多愈慢。Index(索引) 就是幫某個欄位多做一份「目錄」,把查詢從「跟資料量成正比」變成「幾步就到」。

全表掃描 O(n)
沒索引、一筆筆翻,100 萬筆就崩潰。
B-tree O(log n)
排好順序的樹,100 萬筆約 20 步到。
Hash O(1)
對照表直接拿,不管多大固定時間。
⬇️ 按 GO 看三種方法同時找同一個 id,誰先到?
資料量 1,000 筆,找 id = 502
O(n)📖 一頁頁翻
Full table scan
0/ 1000
O(log n)🌳 對折砍半
B-tree index
0[0, 999]
O(1)🗂️ 對照表
Hash index
key=502bucket 2
0/ 1 次到位

但 index 不是免費的:每加一個,寫入變慢多吃硬碟空間,哪些欄位該下是真實的工程取捨。下面是真的 benchmark,100 萬筆的時間差直接打在你眼前。

資料量:
目標 id:(0 ~ 99,999
O(n)
Full table scan
沒下 index,從頭翻到尾
O(log n)
B-tree index
事先排序,二分搜尋
O(1)
Hash index
建一張對照表,直接拿
Index 不是免費的
+ 讀取超快
指定欄位的查詢加速
寫入變慢
每次寫入要同步維護 index
多吃硬碟
每個 index 都是一份額外資料
🔑VIBE CODER 秘訣點一下看這題秘訣
👀觀察
AI 預設不下 index,它不知道你會怎麼查。Demo 時看不出差,資料量長到 10 萬筆才開始卡。
💬怎麼跟 AI 講
查詢變慢時不要說「優化效能」(太模糊),直接說:「幫我列出哪幾個欄位最常被當 WHERE 條件查,要不要下 index」,把選擇權還給 AI 但給它需要的資訊。

→ 找得快了,但同一筆資料兩個人同時要改怎麼辦?這就是下一段的並發控制。

§6 · 並發控制

兩個用戶同時下單,庫存會少賣嗎?

資料的正確性除了形狀,還有『多人同時動』。切換 3 種寫法,看哪一邊會出包。

庫存剩 10,A 和 B 幾乎同時按購買:各自「讀到 10 → 算 9 → 寫回 9」,該賣兩件卻只扣一件。這就是 race condition,誰先誰後沒人管、靠 OS 排程的運氣。切換下面三種寫法看差別。

Transaction交易(鎖住)
BEGIN / COMMIT 包成不可打斷的單位,鎖住那列,A 做完才換 B。
Atomic原子操作
不抓資料,直接 UPDATE stock = stock - 1,DB 保證不可分割。
📱 vibe-shop.com / iPhone 15 Pro
📱
iPhone 15 Pro
256GB · 鈦原色
NT$ 36,900
庫存
10
下單次數
0
實際扣庫存
0
少賣(漏單)
0
⏱ 執行時序圖0 events
AB(點左邊購買按鈕看時序)
RW○ race 風險區
🔑VIBE CODER 秘訣點一下看這題秘訣
👀觀察
AI 寫的「先 SELECT 抓出來、改一改、再 UPDATE 回去」三步式邏輯,在庫存、餘額、按讚數這類場景,一個人用對、多人用就會少賣
💬怎麼跟 AI 講
看到三步式寫法,問:「這段有沒有並發風險?要包 transaction 還是改 atomic update?」明示你關心多人同時操作的情況。

→ 結構、查詢、並發都做了,但機器一斷電全沒了,這就是下一段的持久化。

§7 · 持久化 = Durability

拔電源那一瞬間,誰活下來?

最後一個契約,寫進去之後真的活著。4 台機器排在你面前,寫入、拔電源、看誰活下來。

「寫進去了」其實有等級之分:資料從程式到「真的躺在硬碟上」,中間會在 OS 暫存區停留,這個空窗期斷電就消失。資料庫用三道保險頂住。

fsync強制落地
命令 OS「現在馬上寫到硬碟,不准延後」。
WAL預寫日誌
先寫「我要做什麼」的日誌並落地,crash 後照日誌重做。
Replication複製到第二台
同步到別台 / 別機房,主庫掛了從庫頂上。
DISK
1
ram
🧠
程式記憶體
useState · 變數
(空)
斷電瞬間就消失
2
browser
💻
瀏覽器本機
localStorage · IndexedDB
(空)
綁這台機器、這個瀏覽器
3
db
🏛️
主庫
PostgreSQL Primary
(空)
fsync 完才算落地
4
replica
🛡️
從庫副本
Read Replica · 異地
(空)
主庫掛了我頂上
(按「寫入一筆資料」開始 → 然後試「拔電源」看誰活下來)
關鍵字
fsync · 強迫資料從 page cache 真的寫到硬碟,不呼叫,斷電就掉
WAL · Write-Ahead Log,先寫日誌再改本體,crash 後可重放
Replication · 多副本同步,主庫掛了從庫頂上
🔑VIBE CODER 秘訣點一下看這題秘訣
👀觀察
AI 講「存起來了」很模糊,可能是程式記憶體、瀏覽器、後端、有沒有副本都不清楚。出事才發現存在最弱那層。
💬怎麼跟 AI 講
三連問:「存哪一層?」「有沒有副本(replica)?」「備份多久跑一次,能還原到哪一刻?」,這三題答完,你才知道資料的真實保護等級。

→ 結構、查詢、並發、持久,四件事都各別玩過了。接下來換你實戰複習:看 AI 給的方案,到底漏了哪一件。

§8 · 實戰複習

換你當把關的人:AI 給的方案,漏了哪一件?

四件事都玩過了,這裡來一場實戰。每一關,AI 都給你一個「現在能跑、之後會出事」的方案,換你看出它漏掉哪一件。

0 / 4
1 / 4 關做會員系統,AI 推 JSON 檔
👤
你 / 咨詢者
我要做一個會員系統,要存使用者資料。AI 朋友叫我直接用一個檔案存就好,這樣對嗎?
🤖
AI 助手
對啊超簡單!把使用者全部塞進一個檔案,新增一筆、改一筆都直接動那個檔,不用學什麼資料庫,省事。
⚠️ AI 這個方案漏了哪個契約?
🔑VIBE CODER 秘訣點一下看這題秘訣
👀觀察
AI 預設不會幫你想這四件事,它只給你「現在能跑」的最小方案。Demo 過得了,產品撐不住。
💬怎麼跟 AI 講
跟 AI 講資料需求時,先回答這四題:「資料有哪些填寫規矩?」「哪些資料常常要被查?」「會不會有很多人同時動同一筆?」「斷電、重開機絕對不能掉嗎?」把這四題答好給 AI,它的方案才會從玩具升級成產品。

→ 最後補一個本能:其實「並不是所有資料都該丟進資料庫」,下一段教你怎麼分。

§9 · State Locality

跟 AI 講需求前,把每份資料分到對的桶

這個 Unit 走完前的最後一個本能,下需求前先分桶。拖卡片到三個桶,放完按「看正解」會告訴你為什麼 + AI 會怎麼猜。

每份資料都歸到三個位置之一。分錯桶會出事(訂單放 useState 重整就棄單、搜尋記憶放資料庫每筆都打 server),而 AI 沒 context 時「預設往最簡單那層猜」。下面拖卡片,把每份資料分到對的桶。

UI State只活這次開啟
React useState 等,重整就消失。適合純畫面狀態。
瀏覽器本機跨重整、綁這台
localStorage / IndexedDB,無法跨裝置同步。適合個人偏好。
後端資料庫所有人同一份
能備份、能稽核。商業資產都在這。
候選卡片(拖到下面三個桶;無法拖也可點任一桶的「放這」按鈕)
頁面滾動位置
純 UI
正在輸入到一半的留言
未送出
深色模式(單機)
個人偏好
搜尋條件記憶
回來還在
通知開關(要跨裝置)
跨裝置同步
使用者大頭照
商業資產
電商訂單
商業核心
稽核日誌
合規
UI StateReact useState · 暫態
拖卡片進來
瀏覽器本機localStorage · 單裝置
拖卡片進來
後端資料庫PostgreSQL · 共享
拖卡片進來
🔑VIBE CODER 秘訣點一下看這題秘訣
👀觀察
沒給線索,AI 預設把每份資料丟到最簡單那層(state)。Demo 階段看不出問題,上線後用戶換裝置、重整、跨用戶共享時才爆。
💬怎麼跟 AI 講
講需求時主動標明每份資料的桶:「會員偏好要跨裝置同步 → 放 DB」「未送出草稿 → state 就好」「搜尋條件記憶 → localStorage」,把分桶結論直接給 AI。

→ 分完桶你才知道哪些丟資料庫、哪些留前端。這個 Unit 差不多了,最後收個尾。

§10 · 收尾

這個 Unit 你帶走了什麼

資料庫不是讓 App「能存資料」,
是讓 App 從玩具 變成產品

跟 AI 協作時,你帶走的 6 個直覺:

  • · 講需求前,能說出「這份資料該住哪一層」(畫面、瀏覽器、還是資料庫)
  • · 知道累積的資料是 AI 時代最值錢、最拿不走的資產,第一天就要存
  • · 聽到「丟資料庫」會自動想到它顧的四件事:形狀守得住、查得快、不打架、不怕斷電
  • · 看到 AI 說「先讀出來、改一改、再存回去」會警覺多人同時動會出事
  • · AI 說「存好了」會反問一句 「存在哪?斷電會不會掉?」
  • · 知道不是所有資料都該丟資料庫,會先分清楚哪些只是暫態、哪些才要永久存
📍 下一站 · 6-5
市面上資料庫百百種,你的 App 該選哪個?

知道資料庫顧了哪些事之後,下一步最關鍵的問題是:怎麼選對一個。下個單元帶你認識主流的資料庫、它們差在哪,還有大家最常聽到的 SQL 和 NoSQL 到底是什麼。