Unit 2.1 你學會設計一張表。但真實的 App 有 users、orders、products 很多張表,它們得認得彼此。 這個 unit 講兩個角色:Primary Key 是每筆資料的唯一身分證,Foreign Key 是表跟表之間的認親線索。 最後你會親手製造「孤兒資料」,再用刪除策略把資料一致性守回來。
把使用者、訂單、商品分開存(這是上個 Part 講的正規化)。但分開之後,要怎麼把它們連回去?
要把它們連回去,靠兩個角色。先用兩張圖建立直覺,後面 §2、§3 再實際動手操作。
每張表都需要一個欄位,能唯一指認每一筆資料,通常就叫 id。它就像身分證字號,不會重複、不會空白:報出一個號碼,就只會對到一個人。
一張表用一個欄位指向另一張表的 PK。orders 的 user_id 存的就是某位使用者的 id,就像訂單上寫著主人的會員編號,照號碼就能認親。
下面 §2 先看 PK 怎麼保證唯一,§3 再看 FK 怎麼認親。
PK 是每筆資料的唯一識別。資料庫會強制它不重複、不為空,這樣你才永遠指得到某一筆特定資料。
| id 🔑 | name |
|---|---|
| 1 | 小明 |
| 2 | 小華 |
id 主鍵,這點還不錯。但有時為了「方便」會拿 email、手機號這種會變動的自然鍵當主鍵。點一筆訂單,看它的 user_id 指到哪位使用者。再改改看 user_id,把它指向不存在的人會怎樣。
REFERENCES users(id) 的外鍵約束,不要只放一個普通的 id 欄位。」這叫「一對多(one-to-many)」關係。一邊是 1(使用者),另一邊是 N(他的訂單),靠 FK 串起來。
如果沒有保護,刪掉小明之後,那些 user_id=1 的訂單還指著一個已經不存在的人。
好消息是:只要宣告了 FK 約束,資料庫預設就不准你這樣刪。下面 §6 看你可以選哪幾種處理方式。
宣告 FK 時可以指定 ON DELETE 策略,決定「父資料被刪時,子資料怎麼辦」。選一個,再刪小明試試。
DELETE FROM users,沒考慮關聯資料。沒 FK 約束時會留下孤兒;有約束但策略選錯時,可能誤刪一票資料(CASCADE)或刪不掉(RESTRICT)。一樣答錯不鎖死,黃色提示陪你想清楚。
🪪使用者表的主鍵(PK)該用什麼?
🔗訂單要記錄「是哪個使用者買的」,最好怎麼做?
💬刪除一個聊天室,希望底下的訊息也一起被清掉
🧾員工離職要刪帳號,但他開過的發票要保留做帳
把這兩個 unit 的直覺收進口袋,跟 AI 一起設計資料模型時隨時拿出來用。
資料型態跟 PK / FK,是 schema 的兩根支柱。型態管「每一格裝什麼」,PK / FK 管「表跟表怎麼連」。 這兩件事 AI 都會幫你做,但它常常為了「能跑、寫得快」而偷工:型態用 TEXT 通吃、關聯不加約束。 你現在看得懂、也問得出對的問題,這就是 vibe coder 跟一般使用者最大的差別。
資料模型跟程式碼都備好了,下一課(6-8 部署)就要把整包推上線:學會怎麼讓你本機跑得動的 App,變成全世界打開網址就能用的網站。我們下一課見。