關聯式資料庫靠主鍵(PK)與外鍵(FK)將離散資料表編織成一致的資料網絡。PK 在物理層僅有兩大職責:
一旦進入生產環境,修改鍵結構極高風險(需重建索引、重寫應用、停機遷移),故設計階段必須定案。
PK 不應攜帶任何業務語義(如發票號、身分證字號、UUID 等)。若使用者看見連接表的 PK 覺得「沒用」,代表設計正確——它純粹為系統服務,避免業務變更牽動鍵值更新。
單欄 PK(BIGINT AUTO_INCREMENT、UUID、SNOWFLAKE ID)可大幅提升 JOIN、篩選、索引維護效能。複合鍵常見誤區:
PK 唯一職責是識別,無更新理由。若業務需「修改識別碼」,實為刪除舊列、插入新列的業務邏輯,不應在資料庫層面 UPDATE PK。
時間戳、建立時間、修改時間等會隨資料變動的欄位,絕不可納入 PK。
人為干預產生 PK(如手工指定 ID)會引入業務語義,進而誘發更新慾望。採用資料庫原生序列、AUTO_INCREMENT、UUID() 或分散式 ID 生成器(Snowflake、Leaf)。
CASCADE、SET NULL、RESTRICT、NO ACTION,並在資料字典文檔化。SET FOREIGN_KEY_CHECKS=0; 匯入完成後重開並驗證一致性。| 反模式 | 危害 | 修正方向 |
|---|---|---|
| 自然鍵作 PK(如 Email、手機號) | 業務變更導致 PK 更新、索引碎片化、FK 連鎖更新 | 改用代理鍵,自然鍵加 UNIQUE 索引 |
| 複合 PK 疊加傳遞 | 子表鍵寬度隨層級增長,JOIN 效能指數級下降 | 所有表統一單欄代理鍵,FK 單欄參考 |
| 業務表無 PK | 無法唯一識別、Replication 異常、工具無法運作 | 補加 BIGINT AUTO_INCREMENT PK |
| FK 僅在應用層檢查 | 並發下極易產生髒資料,修復成本極高 | 資料庫層面宣告 FK 约束 |
主鍵是「系統身分證」,外鍵是「關係契約」。堅守無業務意義、單欄、不更新、自動產生四大原則,配合明確的 FK 宣告與級聯策略,即可構建穩健、可演進的物理資料模型。