你知道資料庫設計的時候會用到幾種 Key 嗎?不查不知道,一查嚇一跳,足足有七種之多,分別是超鍵 (Super key)、候選鍵 (Candidate key)、主鍵 (Primary key)、替代鍵 (Alternative key)、複合鍵 (Composite key)、唯一鍵 (Unique key) 和外鍵 (Foreign key),關於每一個 Key 的定義與細部說明可以參考這篇文章
**7 Types of Keys in DBMS Explained 的說明,我就不再贅述了。
主鍵、唯一鍵、外鍵
在我擔任資料庫設計師的時候設計過不少資料庫,當我看到這四個陌生的 Key 也確時讓我緊張了一下。我真的需要這四個 Key 嗎?仔細讀完了作者的對七個 Key 說明後我鬆了一口氣,作者所謂的七個 Key 經過歸納後剩下三個,主鍵 (PK)、唯一鍵 (UK) 和外鍵 (FK),如此又就跟我們資料庫設計認知對上了。
資料庫就是一張或多張以上的資料表組成的集合,在每一張資料表都可以使用 PK, UK 這兩種 Key 來幫讓我們確保資料的唯一性,被設定為 PK, UK 的欄位會觸發資料庫內建的限制檢查能力 (constraint) ,確保我們的寫入的資料不會有重複的問題。PK, UK 的差別是欄位數,當我們發現資料表的某個欄位就可以判斷出唯一性,就可以把那個欄位設定為 PK;如果資料表需要兩個以上的欄位組合後才能決定資料唯一性就把這幾個欄位合併設定為 UK,FK, UK 可以同時存在一張表不會有衝突。資料表的 FK 欄位本質就是別張資料表的 PK,我實際拿個案例給你看就知道了。
實際案例
這是當時我用來紀錄產品異常的表,總共三張,客戶希望產品發生規格異常的時候能留下紀錄作為日後問題追蹤。客戶會透過預先設定的 UI 去填寫原因與對策,下拉選單的選項來源自 reason, action 兩張表,當客戶分析完原因、採取對策並且寫下註解送出後,這筆異常紀錄就完成了。這三張表都有自己的 PK (id),注意在 log 這張表上有三個 FK, user_id, reason_id 跟 action_id 分別對應外部的 user, reason, action 三張表。所以當客戶要產出異常報表的時候,程式會下 SQL 從 log 資料表開始撈資料,再用 log 資料的三個 FK 去 user, reason, action 資料表拿資料回來組成報表輸出。會設定為 PK, UK, FK 的欄位都是會被用來下 SQL 條件的欄位,MySQL 資料庫為了加快處理資料的速度會幫這些欄位加上索引 (index),萬一你用的資料庫沒有這功能,就得自己手動加這些欄位加上索引。
結論
總而言之,在你學習或設計資料庫的時候只要把注意力集中 PK, UK, FK 這三把 Key 就好了,可以直接無視掉其他四個 Key 徹底掌握這三把鑰匙就能做好資料庫設計的工作了。如果你對資料庫設計感興趣或是這三把 Key 的使用上其他的問題或想法,歡迎提出一起討論。