【さろげーときー】
サロゲートキー とは?
最終更新:
💡 業務の値とは別に、行を区別するIDを用意する
業務上の値とは別に用意する、行を区別するための人工的な識別子。自然キーとの違い、自動採番と制約、業務上の重複チェックを解説します。
サロゲートキーは、どんなID?
利用者の行にid=42を割り当て、メールアドレスなどの業務上の値とは別に識別する、という使い方だよ。値からその人の名前や業務上の属性を読み取るためのものではないんだ。
ナチュラルキーとの違いは?
業務で既に使う識別値をキーにするか、行の識別用に別の値を設けるかの違いだよ。社員番号などの業務上の値を使う場合は、どの範囲で一意か、変更や再利用があるかも確認する。
メールアドレスを変えると、IDも変わる?
別のIDを保つ設計なら、メールアドレスを変えてもid=42をそのまま使える。他の表はそのIDで同じ行を参照できるよ。IDが自動で永久に固定されるわけではなく、更新や削除のルールも設計する。
自動採番にすれば、一意になる?
生成と制約は分けよう。PostgreSQLのIDENTITYは値を生成するけれど、それだけで一意を保証しない。主キーやUNIQUEで重複を制限する。UUIDも生成方式が複数あり、全部がランダムな文字列という説明ではないよ。
IDが違えば、業務上の重複は気にしなくてよい?
もっと詳しく知りたい人へ
UUIDなら、認証にも使える?
行の識別子と、アクセスを許可する仕組みは別です。IDが分かりにくい値でも、それだけで他人のデータを見られないとは判断できません。利用者の権限を確認する処理を別に設けます。
連番は、1から欠けずに並ぶ?
採番方式や取り消し、削除などによって欠番が出る場合があります。IDを件数や登録順の保証として使わず、その用途の日時や集計を別に持ちます。
まとめ:ざっくりこれだけ覚えればOK!
「サロゲートキー」って出てきたら「業務上の値とは別に用意する、行を区別するためのID」と思えばだいたいOK!
📖 おまけ:英語の意味
「Surrogate Key」 = 代理のキー
💬 業務上の識別値をそのまま使う代わりに設ける人工的なキーです。「意味がない」は、識別の役割までないという意味ではありません。