色々と論争はあるようだが、今回はそのサロゲートキーというものについて調べてみた。
サロゲートキーの特徴
業務上は意味のないキーを持つので、容量を余分に使う。
ID項目を1つ追加しても、外部参照で複合主キーを追加したほうが容量使うことになるため、全体としては利点となっている。
テーブル間の依存関係が薄くなる。
ナチュラルキーだと主キーを変更したら、関連するテーブル全ての変更が必要になる。
サロゲートキーを使用していたら、連携はIDなので変更がない。
複合主キーのテーブルに比べSQLが簡潔になる
外部参照しているときに、参照先のエンティティが何者かわかりにくい。
他のテーブルと繋がっていることは把握できるが、それ以上のことは外部テーブルを参照する必要がある。
ナチュラルキー:年度、出席番号、性別
サロゲートキー:生徒_ID
1つのテーブルでは把握しにくいだけで、全体でみればサロゲートキーの方が個人的にはリレーションがわかりやすいため見やすい
アプリケーションの画面間引継ぎ情報や実装などを統一できる。
外部キーとして使用しているテーブルも同じ行を見ているテーブルとして把握できる。
ナチュラルキーであると、テーブルの検索に使用した複合主キーを他のテーブルも同じ検索条件で検索が必要
サロゲートキーであると、検索より取得したIDで他のテーブルを検索できる
JOINのときにUSINGを使用できない
主キーにしか設定できない制約がDBMSにあった場合、サロゲートキーが主キーとなるため設定できない。
ナチュラルキーとしての利点
主キーに設定した項目は個別にインデックスや制限(NOTNULLやUNIQUE)を設定しなくてよい
パッと見でデータ構造が把握しやすい
複合主キーが氾濫していると
SQLが複雑になり、バグの温床になる
変更による複雑なSQLの解析やテーブルの改修が発生
サロゲートキーを使うべき時
- 主キーの値が使いまわされる場合
- 主キーの体系が変化する場合
- 複合主キーによるカラムが3つ以上ある、かつ、そのカラムでリレーションする場合。
前提の知識
###ナチュラルキー(自然キー)とは
- キーそのものに意味を持っている
- 業務的にそのテーブルをユニークにするキー
サロゲートキー(代理キー)とは
- システム的に一意な値を取る(オートインクリメントやUUIDなどを使用)
- PKとしているテーブルのPKのこと
複合主キーとは
- 行を特定するための主キーが複数必要であるもの
UUID
- 採番やオートインクリメントと同じ目的。
- その枠内で一意ではなくて、全体で一意にできる。
クラスター化インデックス
- 各テーブルのメインとなるインデックス。