君は心理学者なのか?

大学時代に心理学を専攻しなぜかプログラマになった、サイコ(心理学)プログラマかろてんの雑記。

そのテーブルに、idは必要ですか?〜idの必要性とデータの一意性についてもう一度考えてみる

テーブルに必ずと行っていいほど入っているidカラム

普段扱っているテーブルには、だいたいidカラムが含まれている。

Ruby on Railsのmigration機能を使うと勝手にidカラムが入ったりする。

当たり前のように存在するidカラム。

そのidカラムの必要性について、もう一度考え直してみる。

忙しい人のために結論

idカラムが重要なのではない。重要なのはデータが一意に特定できること

データが一意に特定できればidは必要ないことがある

ただ、あったほうが後々便利なことも多い

こんな例について考えてみる

f:id:karoten512:20171122231525p:plain

例えば30人の生徒がいるクラスに、同姓同名の生徒(山田太郎)がいたとする。

そして、このクラスの出席簿は名前カラムのみが存在している。

こんな感じ。

名前
...
山田太郎
山田太郎
...

このとき、

-- 朝会にて。出席をとる先生。山田太郎は1人欠席してる。

先生「山田太郎さん」

山田太郎「はい!」

先生「山田太郎さんは元気だね。山田太郎さんは休みかな?」

となり、

どっちの山田太郎が出席していてどっちの山田太郎が休んでいるのかわかりゃしない。

30人から1人が特定できないのだ。困った。

解決策

生徒1人を特定できるように、カラムを増やしてやればよい。

出席番号 名前
... ...
23 山田太郎
24 山田太郎
... ...

これで

-- 朝会にて。出席をとる先生

先生「23番!」

山田太郎(23)「はい!」

先生「24番!」

山田太郎(24)「はい!」

となり生徒の特定が可能だ。

f:id:karoten512:20171122231540p:plain

番号で呼んでるせいで刑務所みたいになってるけど。

出欠というより点呼とってる。

一意性

このように、大量のデータの中から1つのデータを特定できる性質のことを、

「一意性」という。

データはなによりも「一意性」を持っていることが非常に重要である。

もし一意性がないと、

出欠が取れなかったり、

どっちの口座に振り込めばよいかわからなくなったり、

どの飛行機に乗ればよいかわからなくなったり、、、

一意性がないと困ることはいっぱいある。

兎にも角にもデータは一意性が大事。

ここでid

idはデータに「一意性」をもたせるためによく使われる。

idさえ降っておけば、idのおかげでレコードが1つに特定できるからだ。実にお手軽。

(そもそもidは「identification(識別)」の略)

でも、いつもidは必要かというと、そういうわけではない。

家族テーブル

下の名前
太郎
次郎
三郎

「下の名前」だけで一意性が保たれる。

グローバルipアドレステーブル

ipアドレス
201.168.33.10
203.168.33.10
...

そもそもグローバルipアドレスが一意。

都道府県・市テーブル

都道府県名 市名
東京都 府中市
広島県 府中市
北海道 伊達市
福島県 伊達市
... ...

この場合、市名だけでは一意性が保たれない。

都道府県名と市名を組み合わせることで初めて一意性が保たれる。

このように、複数のカラムを組み合わせて一意性をもたせることもできる。

...こんなかんじで、扱うデータの種類によってidは必要じゃない場合がある。

ただし、idがあると便利なことがある

先ほど都道府県を例に出したが、この場合はidをふっておくと便利なことがある。

顧客テーブルに出身都道府県idカラムをもたせ、その中に都道府県idを入れた場合、

外部キーとして使いやすい。

データ単体としてみたとき一意性が保たれていても、

データを組み合わせて使う際、idがあったほうがシステム的に扱いやすいことも多い。

まとめ

テーブル設計をするときは

「ほんとにidが必要なのか?」

「idなくても一意性が保たれるのではないか?」

「idがなくても一意性が保たれる場合、idカラムをあえて使うメリットは何か?」

を考えて設計しよう。

もしかしたら、無駄なカラムが1つ減るかもしれない。