在講關聯之前,必須先認識「外鍵」。
假設我們有 Users (使用者) 和 Orders (訂單) 兩張表。為了知道哪筆訂單是誰買的,我們會在 Orders 表裡面加上一個 user_id 欄位。這個指向另一張表主鍵 (Primary Key) 的欄位,就稱為外鍵。它像是資料庫裡的「超連結」,把兩張表死死地綁在一起,並確保資料的一致性(你不能新增一筆屬於不存在使用者的幽靈訂單)。
這是實務上最常見的關聯。
Prisma ORM 實作範例:
model User {
id Int @id @default(autoincrement())
name String
// 一個 User 可以有多筆 Order (陣列)
orders Order[]
}
model Order {
id Int @id @default(autoincrement())
total Int
// 每一筆 Order 都有一個擁有者 (單一 User)
userId Int
user User @relation(fields: [userId], references: [id])
}
當你要查詢使用者的所有訂單時,只要設定 include: { orders: true },ORM 就會自動幫你用底層的 JOIN 語法把兩張表的資料完美合併並回傳。
這是初學者最容易卡關的地方。
StudentCourse (選課紀錄表),裡面只存 student_id 和 course_id。Prisma ORM 實作範例:
現代 ORM 最棒的地方在於,你甚至不需要自己手動去寫那張煩人的中介表!
model Student {
id Int @id @default(autoincrement())
name String
// 隱式多對多:直接互相指定陣列
courses Course[]
}
model Course {
id Int @id @default(autoincrement())
title String
// 隱式多對多:直接互相指定陣列
students Student[]
}
當你要寫入「學生 A 選了 Node.js 課程」時,Prisma 會自動在底層幫你把關聯 ID 寫進隱藏的中介表裡,完全封裝了複雜的底層邏輯。
當你掌握了 1:N 和 N:M,你就能設計出幾乎 90% 的現代應用程式資料庫架構:
今天我們徹底征服了 SQL 的關聯設計。明天 (Day 19),我們將轉換口味,進入 NoSQL 的世界,看看 MongoDB 是如何用完全不同的「降維打擊」思維,來處理這些複雜關聯的!