SQLアンチパターンその4 キーレスエントリ(外部キー嫌い)
SQLアンチパターンは全部で25章あるので、毎日書いても1ヶ月かかる内容だった。 なので、今後はそんなにがっつり書かずにポイントだけ。
キーレスエントリ(外部キー嫌い)とは
外部キー制約を使わない
いつ起こるのか
テーブル間で参照をするとき
何をしてはいけないのか(アンチパターン)
外部キー制約を使わない
何故ダメなのか
外部キー制約は使われず、でも外部キーとして参照されている列がある場合、アプリケーションコード側で完璧にお守りをしてあげないと迷子になる行が出てくる。アプリが完全であることを前提にしてはいけない。
いい解決策は
外部キー制約使え
参照関係をそもそも壊さない仕組みだから、外部キー制約使うべき。
マスタになるキーを更新する際、ON DELETE CASCADE, ON UPDATE CASCADEとか使えば、外部キーとして参照しているテーブル側もちゃんと更新なり削除がかかる。 知らなかった。これ覚えておくべき。
外部キー使う場合、たしかにオーバーヘッドになり得るけれど、アプリケーションコード側で事前チェックとか気にする必要なくなるし、DB側でできる部分は無理にアプリケーションに持ってくること無い。