ネットの海の片隅で

技術ネタの放流、あるいは不法投棄。

「サロゲートキー vs 複合キー」という間違った対立

DB設計についてググっていると、サロゲートキーは使うべきではない」「複合キーは使うべきではない」といったDBのキーに関する論争をよく見かけます。

それらを見ていると、多くの議論で「これって対比の軸がズレてないか?」と思いました。

正しい対比

正しいと思う対比とそのざくっとした意味。

自然キー vs 代替キー

自然キー(Natural key)

キーそのものに意味が含まれているキー。

都道府県を含むテーブルprefecturesがあったとして、都道府県名prefectures.nameは自然キー。

代替キー(Surrogate key)*1

キーそのものには意味が含まれていないキー。

前述のprefecturesの例で言えば、システム内部のみで使用されている都道府県コードprefectures.codeは代替キー。*2

単一キー vs 複合キー

単純キー(Simple key)

単一のカラムだけでレコードを一意に特定できるキー。

都道府県を一意に特定するためには「都道府県名」があれば十分なので、これは単一キー。

複合キー(Composite key)

複数のカラムによってレコードを一意に特定できるキー。

市町村を一意に特定するためには「都道府県名」と「市町村名」が必要*3なので、これは複合キー。

主キー vs 代理キー

主キー(Primary key)

候補キーのうち、主キーとして選んだもの*4

代理キー(Alternate key)

候補キーのうち、主キーとして選ばれなかったもの。

対比の組み合わせ

前述の対比のうち「自然キー/代替キー」と「単純キー/複合キー」を組み合わせると以下のようになります。

自然キー 代替キー
単純キー 単純自然キー(A) 単純代替キー(B)
複合キー 複合自然キー(C) 複合代替キー(D)

よく見かける「サロゲートキー vs 複合キー」はこの表の「B vs C」を見て、サロゲートキー・複合キーのメリット・デメリットを論じている気がします。

仮に「複合キー」のデメリットとして「変更に弱い」が挙げられているとして、「B vs C」しか見ていないと、

  • 「ここの複合キー(C)が変更に弱い」
  • 「じゃあ、サロゲートキー(B)にしよう」

のようになりがちだと思います。

一方、正しい対比の軸を意識できていれば

  • 「ここの複合キー(C)が変更に弱い」
  • 「でも、制約かけたいよね」
  • 「じゃあ、複合キーを構成してる自然キーを代替キーに変えよう(D)」

のようなことが選択肢に入ってきます。

さいごに

このエントリはWeb上の議論を見ていて感じたふわっとした疑問を書いただけのものです。 そのため、「サロゲートキー vs 複合キー」のどちらが良いといったことを言うつもりはありません。

ただ、僕はケース・バイ・ケースではありますが原則として「複合自然キー」派ですので、意見が偏っているかもしれませんし、それ以前の認識違いなどもあると思うので、コメントお待ちしています。

*1:他にも人工キー(Artificial key)などの呼び方もあります。

*2:都道府県コード」が現実世界でも使われている場合はその限りではない。

*3:日本全国の市町村名には重複があるため。

*4:トートロジー