3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

サロゲートキーとナチュラルキーについて調べた

Last updated at Posted at 2018-12-14

俺でもわかるシリーズアドベントカレンダー15日目です。よろしくおねがいします。:hugging:

お恥ずかしながらデータベースのナチュラルキーとサロゲートキーについて知らなかったので、自分なりに調べてみた。

はじめに

まず、テーブルの中のデータで一意となるものを主キーと呼びます。これは流石に知っていますね。
ですが、この主キーはさらに2つに分類することが出来ます。それが、サロゲートキーナチュラルキーです。

それぞれ特徴を見てみます。

サロゲートキー

サロゲートキーは機械的につけられた連番のキーです。オートインクリメント等でつけられたものがそうです。
下のNoカラムがサロゲートキーです。

No 名前 年齢
1 taro 12
2 hanako 18
3 tadokoro 24
4 hirorin 17

このキーがあれが、一つのレコードを特定できるため、CRUD処理がしやすくなります。
また、外部キーを使用する際にもサロゲートキーだけを考えるだけで良いので、テーブル間の依存がしにくいです。

ただ、データ自体は機械的に付けられた連番なので、このデータだけ見てもなんの情報なのか全くわかりません。
必ずなにか別のカラムと合わせて取得します。

私は主キーといえばこのことを指すものだと思っていました。

ナチュラルキー

ナチュラルキーは、サロゲートキーとは全くの逆です。データの中身を見れば、なんの情報なのが人間が理解することが出来るようなカラムが主キーとなります。
とある学校で、以下のような学生の情報を持つテーブルがあったとしましょう。

学部番号 入学年 出席番号 名前 年齢
011 2014 006 hirorin 14
021 2015 102 hanako 17
022 2015 036 flandre 495
021 2018 006 hirorin 17

さて、ナチュラルキーも主キーの一種だとはじめに書きましたが、上記の場合はそれが主キーになるでしょうか。

  • 学部番号
    • 同じ学部なら重複する
  • 入学年
    • 同じ年に入学すれば重複する
  • 出席番号
    • 学部、入学年が異なれば同じ出席番号の人もいるかもしれない
  • 名前
    • 同じ名前なら(ry
  • 年齢
    • 同じ年齢なら(ry

なんだかどれも主キーになり得なさそうです。

ここで出てくるのが複合主キーと呼ばれるものです。
例のテーブルの場合は学部番号, 入学年, 出席番号の3つをまとめれば特定の学生を見つけることができそうです。

サロゲートキーと違って、どのカラムを一つ取っても利用者にとってはなんの情報かはわかりやすいです。

ただし、特定の一人を見つけるために3つのカラムを見る必要があります。
また、外部キーを設定することになった場合は、複合外部キーとしなくてはなりません。JOINする際にはSQLの文量は、サロゲートキーを採用しているときと比較して多くなります。

まとめ

サロゲートキー

機械的につけられた連番のキー。
一つのカラムで一人の特定が可能、テーブル間で依存が起こりにくい。
サロゲートキーだけでは、なんの情報だか分からない。

ナチュラルキー

ユーザが設定したキー。
一つの絡むだけでも何の情報だか理解できる。
一人の特定をするのに複数のカラムを要する(複合主キー)
テーブル間の依存が強くなりがち。


どっちの方式で主キーを決めるかは永遠の終わらない議論のような気がします。
システムによって、どちらが良いかよく考える必要がありそうですね。

3
0
1

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
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?