Primary key 設計考量

在關連式資料庫中,我們會用 Primary key (PK) 來識別資料表中的每一筆資料,因此PK必需具備唯一性與識別性,並且不能為 NULL。PK 可以使用單一欄位,也可以使用多個欄位組成具有此特性的 key 來取代此功能,理論上只要具備識別性的資料,都可以拿來當作PK使用,實務上 PK 也可以使用 auto increment 欄位、GUID、複合欄位或設計一組有規律的資料也可以,並沒有一個最佳的作法。

以下是我的一些經驗分享及網路搜集到的資訊,並不一定是絕對正確,但或許可以當作一些參考:

  • 先看看資料表中是否已經有可以做 PK 的欄位。
  • 單一欄位比複合欄位速度更快。
  • 數值欄位比文字欄位速度更快。
  • 數值欄位比文字欄位更省空間。
  • 數值欄位與文字欄位在查詢時速度上差異不大,但在新增時差異很大。
  • 資料表需要大量 INSERT、資料表資料量很大或需要使用 JOIN 時,優先使用數值欄位做為 PK。
  • 分散式資料庫可以使用 GUID 做為 PK,可以保證不管任何地方過來的資料都不會有衝突的狀況,且 GUID 可以在應用程式端產生,不用到資料庫產生。
  • 考慮到未來有可能做資料表整併的話,優先使用 GUID,不用擔心PK重複。
  • 如果 PK 是需要讓使用者識別用的,可以在額外設計一組有規律的 Key 讓使用者方便記憶,例如員工編號。