第 3 週 · 資料庫與 D1
什麼是資料庫
用一張表格認識資料表、欄位、一列資料,以及主鍵為什麼不能重覆。
正在打開這一關…
學習目標
- 用自己的話說明資料表、欄位、列
- 說明主鍵的工作
- 把留言白板翻譯成一張 messages 表
前兩週的留言住在陣列裡,程式一停就沒有了。資料庫是專門幫你把資料留下、再依條件找出來的系統。這一課先認識名詞。明天才寫 SQL。
用生活例子理解
想像一本通訊錄,而且規定只能用表格,不能在空白處塗鴉。
- 資料庫是整本帳。
- 資料表是其中一張表,例如「留言」。
- 欄位是直的標題:編號、作者、內容、時間。
- 一列是橫的一筆留言。
- 主鍵是這一列獨一無二的編號。你用它指著說「就是這一則」,不會指到兩則。
生活比喻:主鍵像學生證號。班上可以有兩個同名的人,但不能有兩張相同的證號。刪掉某人之後,舊證號不要立刻發給下一個人,免得舊紙條找錯人。
D1 是 Cloudflare 上的 SQL 資料庫,語法走 SQLite。你用熟悉的表格觀念,加上下一課的四個動詞,就能讓 Worker 讀寫它。
留言表先想成這樣:
| id | author | body | created_at |
|---|---|---|---|
| 1 | Ada | 哈囉 | 2026-11-16T00:00:00Z |
| 2 | Bo | 第二則 | 2026-11-16T01:00:00Z |
id 當主鍵。作者名字可以重複,編號不行。
動手做
大約 15 分鐘。仍用紙筆。
- 畫一張
messages表,寫出四個欄位與兩列範例。 - 標出哪個欄位是主鍵。試著把兩列的主鍵改成同一個數字,寫下這樣會壞掉的一個場景(例如刪除時不知道刪哪一列)。
- 再畫一張你生活裡的表,例如「書架」:書的編號、書名、作者。不要超過五個欄位。
- 回答:陣列裡的物件,和資料表裡的一列,哪裡像?哪裡不像?(提示:生命週期、誰負責保存。)
案例
下面是明天會用到的建表語句,今天先當名詞對照來讀,不必執行。
CREATE TABLE messages (
id INTEGER PRIMARY KEY AUTOINCREMENT,
author TEXT NOT NULL,
body TEXT NOT NULL,
created_at TEXT NOT NULL DEFAULT (datetime('now'))
);INTEGER PRIMARY KEY:整數主鍵。AUTOINCREMENT:新增時若沒給編號,資料庫依序發號。TEXT NOT NULL:文字,而且必填。DEFAULT (datetime('now')):沒給時間就用資料庫此刻的 UTC 時間。
常見錯誤
- 把整份 JSON 檔當資料庫。小練習可以,但沒有「只更新一列」的規矩,也容易互相覆蓋。
- 用作者名字當主鍵。兩個人可以同名,一個人也可以改名。
- 主鍵拿來當排序。編號代表身分,不代表「最新」。排序用
created_at。 - 覺得欄位越多越專業。先留下你真的會讀寫的欄位。
自我檢查
- 資料表、欄位、列,各用通訊錄比喻一次。
- 為什麼主鍵不能重覆?
- 留言的作者適合當主鍵嗎?為什麼?