- 自然(Natural)キーは、データベースで一意性を保証するために使われるキー
- 自然キーは、名前、都市、年などの実データに基づいている
- たとえば、世界最高のレストラン50店のデータベースでは、
restaurantName、cityName、year を自然キーとして使うことができる
- しかし自然キーは、一意性を保証できない場合がある。たとえば、同じ名前のレストランが複数の都市に存在することがある
同一性
- 自然キーは、一意性を保証するだけでなく、同一性も保証しなければならない
- たとえば、自動車の車台番号や個人識別番号(CPR番号)を自然キーとして使うことができる
- しかし、同じ人物が複数の識別番号を持つことがある。たとえば、デンマークでは性別移行をした人が新しい CPR 番号を受け取ることがある
書類上の誤り
- 自然キーは、書類上の誤りに弱い
- データ入力ミス、ユーザーのタイプミス、データ変換エラーなどが発生する可能性がある
- システムはこうした誤りを修正できなければならない。したがって、外部キーをデータベースキーとして使うのは適切ではない
結論
- データベース設計で自然キーを使うのは、よい考えではない
- データエラーは起こり得るため、そうしたエラーを修正できなければならない
- したがって、データベーステーブルでは常に人工キーを使うのがよい
GN⁺の意見
- 自然キーの問題点: 自然キーは一意性と同一性を保証できない場合があり、データ入力ミスにも弱い。
- 人工キーの利点: 人工キーは一意性と同一性を保証し、データエラーを容易に修正できる。
- ORM 使用時の考慮点: ORM ライブラリを使う場合は、人工キーを使うほうが簡単。ORM はデータベース構造をある程度決定するため、人工キーを使うほうが効率的。
- 類似機能の製品: 他のデータベース設計ツールや ORM ライブラリでも、人工キーの使用が推奨されている。たとえば、Hibernate、Entity Framework など。
- 技術導入時の考慮点: 新しいデータベース設計を導入する際は、自然キーの欠点を考慮し、人工キーを使うのがよい。人工キーはデータの完全性を保証し、誤りを容易に修正できる。
2件のコメント
Hacker Newsの意見
cus_MJA953cFzEuO1zのようなIDが好まれている。JavaScript/TypeScriptで生成する方法もある。人工キーも、グローバルリージョンなどに対応する分散環境への備えができている TSID を使うことをおすすめします。私は MySQL と DynamoDB で PK として TSID を使っています。
https://jsonobject.hashnode.dev/using-tsid-as-database-pk