そのテーブルに、idは必要ですか?〜idの必要性とデータの一意性についてもう一度考えてみる
テーブルに必ずと行っていいほど入っているidカラム
普段扱っているテーブルには、だいたいidカラムが含まれている。
Ruby on Railsのmigration機能を使うと勝手にidカラムが入ったりする。
当たり前のように存在するidカラム。
そのidカラムの必要性について、もう一度考え直してみる。
忙しい人のために結論
idカラムが重要なのではない。重要なのはデータが一意に特定できること データが一意に特定できればidは必要ないことがある ただ、あったほうが後々便利なことも多い
こんな例について考えてみる
例えば30人の生徒がいるクラスに、同姓同名の生徒(山田太郎)がいたとする。
そして、このクラスの出席簿は名前カラムのみが存在している。
こんな感じ。
名前 |
---|
... |
山田太郎 |
山田太郎 |
... |
このとき、
-- 朝会にて。出席をとる先生。山田太郎は1人欠席してる。 先生「山田太郎さん」 山田太郎「はい!」 先生「山田太郎さんは元気だね。山田太郎さんは休みかな?」
となり、
どっちの山田太郎が出席していてどっちの山田太郎が休んでいるのかわかりゃしない。
30人から1人が特定できないのだ。困った。
解決策
生徒1人を特定できるように、カラムを増やしてやればよい。
出席番号 | 名前 |
---|---|
... | ... |
23 | 山田太郎 |
24 | 山田太郎 |
... | ... |
これで
-- 朝会にて。出席をとる先生 先生「23番!」 山田太郎(23)「はい!」 先生「24番!」 山田太郎(24)「はい!」
となり生徒の特定が可能だ。
番号で呼んでるせいで刑務所みたいになってるけど。
出欠というより点呼とってる。
一意性
このように、大量のデータの中から1つのデータを特定できる性質のことを、
「一意性」という。
データはなによりも「一意性」を持っていることが非常に重要である。
もし一意性がないと、
出欠が取れなかったり、
どっちの口座に振り込めばよいかわからなくなったり、
どの飛行機に乗ればよいかわからなくなったり、、、
一意性がないと困ることはいっぱいある。
兎にも角にもデータは一意性が大事。
ここでid
idはデータに「一意性」をもたせるためによく使われる。
idさえ降っておけば、idのおかげでレコードが1つに特定できるからだ。実にお手軽。
(そもそもidは「identification(識別)」の略)
でも、いつもidは必要かというと、そういうわけではない。
家族テーブル
下の名前 |
---|
太郎 |
次郎 |
三郎 |
「下の名前」だけで一意性が保たれる。
グローバルipアドレステーブル
ipアドレス |
---|
201.168.33.10 |
203.168.33.10 |
... |
そもそもグローバルipアドレスが一意。
都道府県・市テーブル
都道府県名 | 市名 |
---|---|
東京都 | 府中市 |
広島県 | 府中市 |
北海道 | 伊達市 |
福島県 | 伊達市 |
... | ... |