ナチャラルキー(自然キー)とサロゲートキー(代替キー)


テーブルの主キーを決める場合、ナチャラルキー(自然キー)とサロゲートキー(代替キー)というアプローチがある。

ナチャラルキーとは、システムの外部から入力される社員番号のような業務上意味のあるキーであり、サロゲートキーとは、単にレコードをユニークに扱う為の業務上意味を持たない連番などのキーである。

一概にどちらが優れていると言えないが次のようなメリット、デメリットがあると考える。

  ナチュラルキー サロゲートキー
メリット ・テーブルの関連が理解しやすい ・変更に強い
・ORMする場合、オブジェクトとテーブルの対応がしやすい
デメリット ・変更に弱い
・・ORMする場合、オブジェクトとテーブルの対応がしづらい
テーブルの関連がわかりづらい


個人的に・・・
単にレコードのデータを見た場合、サロゲートキーだと何のレコードかわかりづらい気がするし、テーブルの関連をみる場合もナチュラルキーの方が関連の意味が読み取りやすい気がする。
でもORMするなら、複合キーを利用するよりはサロゲートキーを利用した方が扱いやすいし、ナチュラルキーより断然向いている気がする。いちいち複合キークラスを作るのも面倒くさいし。。
あと、社員番号の体系が数値から英数を含むコードに変更されたなんていう場合もサロゲートキーの方が修正のインパクトが小さいだろうなぁ。


というわけで今後、JPAを使う場合は、サロゲートキーを導入して、ナチュラルキーとなりそうな項目は候補キーとしてユニーク制約を貼るといったアプローチをとってみようと思う。