sqlアンチパターンを読んでいる[2]

Table of Contents

sqlアンチパターン part2 :@log:

Entered on [2018-07-11 Wed 17:32]

読んでくぞ。

キーレスエントリ(外部キー嫌い)

外部キー制約が使える場面で使わないと、 参照整合性を自分で担保しなくちゃいけなくなるからしんどいぞやめとけ、 みたいな話。

参照整合性はあれ、 関連付けられたテーブル間における共通する列の関係が 正しい必要があるよ、みたいな話。

つまり〜以下のようになってるときに〜

id, name, password
1 , taro, 12345
2 , jiro, aaaaa

id, name , price, account_id
1 , book , 100  , 1
2 , shark, 2000 , 2
3 , hoge , 9000 , 1

はい。 これはザックリと

  • taro が book を 100 円 で買った
  • jiro が shark を 2000 円 で買った
  • taro が hoge を 9000 円 で買った

という感じのことを表さんとする拙い例です。

で、taroが名前を hanako に変えても goods テーブルにはなんの影響もなくて いい感じだねーってなるんだけど、

じゃあアカウントを削除しようって思ったときに外部キー制約がないとしんどい。

たとえばtaroを削除しようとすると

  • まずgoodsテーブルの taroのid のモノを削除
  • 他にも依存している全てのテーブルを見ていって taro に紐付いているのを削除
  • 最後にやっとaccoutsにおいて taro を削除

一個でも削除するテーブルを見逃すとアウト。しんどい。

そこでCREATE TBALE する際のFOREIGN KEY を設定するときに ON UPDATE CASCADE やら ON UPDATE RESTRICT とかが設定できるようになってるわけですな。

便利だね。