LoginSignup
4
4

More than 5 years have passed since last update.

サロゲートキー

Posted at

色々と論争はあるようだが、今回はそのサロゲートキーというものについて調べてみた。

サロゲートキーの特徴

業務上は意味のないキーを持つので、容量を余分に使う。

ID項目を1つ追加しても、外部参照で複合主キーを追加したほうが容量使うことになるため、全体としては利点となっている。

テーブル間の依存関係が薄くなる。

ナチュラルキーだと主キーを変更したら、関連するテーブル全ての変更が必要になる。
サロゲートキーを使用していたら、連携はIDなので変更がない。

複合主キーのテーブルに比べSQLが簡潔になる

外部参照しているときに、参照先のエンティティが何者かわかりにくい。

他のテーブルと繋がっていることは把握できるが、それ以上のことは外部テーブルを参照する必要がある。
ナチュラルキー:年度、出席番号、性別
サロゲートキー:生徒_ID
1つのテーブルでは把握しにくいだけで、全体でみればサロゲートキーの方が個人的にはリレーションがわかりやすいため見やすい

アプリケーションの画面間引継ぎ情報や実装などを統一できる。

外部キーとして使用しているテーブルも同じ行を見ているテーブルとして把握できる。
ナチュラルキーであると、テーブルの検索に使用した複合主キーを他のテーブルも同じ検索条件で検索が必要
サロゲートキーであると、検索より取得したIDで他のテーブルを検索できる

JOINのときにUSINGを使用できない

主キーにしか設定できない制約がDBMSにあった場合、サロゲートキーが主キーとなるため設定できない。

ナチュラルキーとしての利点

主キーに設定した項目は個別にインデックスや制限(NOTNULLやUNIQUE)を設定しなくてよい
パッと見でデータ構造が把握しやすい

複合主キーが氾濫していると

SQLが複雑になり、バグの温床になる
変更による複雑なSQLの解析やテーブルの改修が発生

サロゲートキーを使うべき時

  • 主キーの値が使いまわされる場合
  • 主キーの体系が変化する場合
  • 複合主キーによるカラムが3つ以上ある、かつ、そのカラムでリレーションする場合。

前提の知識

ナチュラルキー(自然キー)とは

  • キーそのものに意味を持っている
  • 業務的にそのテーブルをユニークにするキー

サロゲートキー(代理キー)とは

  • システム的に一意な値を取る(オートインクリメントやUUIDなどを使用)
  • PKとしているテーブルのPKのこと

複合主キーとは

  • 行を特定するための主キーが複数必要であるもの

UUID

  • 採番やオートインクリメントと同じ目的。
  • その枠内で一意ではなくて、全体で一意にできる。

クラスター化インデックス

  • 各テーブルのメインとなるインデックス。
4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4