概念釐清
- 資料庫層級外鍵 (FK):
REFERENCES 约束,**保證資料完整性** (防止孤兒記錄、級聯刪除/更新)。
- SQL JOIN 查詢:
INNER/LEFT/RIGHT/FULL JOIN,**組合多表資料** 供應用讀取。
兩者關係:正交、互補
| 場景 | 需定義 FK? | 需寫 JOIN? | 說明 |
| 單表操作 | 否 | 否 | 無關聯需求 |
| 多表查詢報表 | 建議有 | **是** | FK 保證資料乾淨,JOIN 組裝結果 |
| 寫入/刪除主從資料 | **是** | 否 (應用層邏輯) | FK 級聯動作自動維護一致性 |
| 高併發寫入、分庫分表 | 通常無 | 應用層組裝 | 跨庫無 FK,JOIN 下推至應用 |
JOIN 類型速查
-- 內連接:僅返回雙邊匹配的列
SELECT * FROM orders o INNER JOIN users u ON o.user_id = u.id;
-- 左連接:保留左表所有列,右表無匹配則 NULL
SELECT * FROM users u LEFT JOIN orders o ON u.id = o.user_id;
-- 交叉連接:笛卡爾積 (慎用)
SELECT * FROM colors c CROSS JOIN sizes s;
最佳實踐建議
- OLTP 核心業務表:務必定義 FK (含
ON DELETE RESTRICT/CASCADE),資料完整性第一。
- 查詢層:視圖、存儲過程、ORM (Hibernate/MyBatis) 均需顯式寫 JOIN 或映射關聯,FK 不會自動產生 JOIN。
- 大數據/微服務:FK 可能成為效能瓶頸 (鎖爭用),評估改為應用層最終一致性補償事務。
- 開發規範:ER 圖同步更新、遷移腳本含 FK、測試驗證級聯行為。