blog.toxn

あしあと

SQLアンチパターンその4 キーレスエントリ(外部キー嫌い)

SQLアンチパターンは全部で25章あるので、毎日書いても1ヶ月かかる内容だった。 なので、今後はそんなにがっつり書かずにポイントだけ。

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

外部キー制約を使わない

いつ起こるのか

テーブル間で参照をするとき

何をしてはいけないのか(アンチパターン

外部キー制約を使わない

何故ダメなのか

外部キー制約は使われず、でも外部キーとして参照されている列がある場合、アプリケーションコード側で完璧にお守りをしてあげないと迷子になる行が出てくる。アプリが完全であることを前提にしてはいけない。

いい解決策は

外部キー制約使え

参照関係をそもそも壊さない仕組みだから、外部キー制約使うべき。

マスタになるキーを更新する際、ON DELETE CASCADE, ON UPDATE CASCADEとか使えば、外部キーとして参照しているテーブル側もちゃんと更新なり削除がかかる。 知らなかった。これ覚えておくべき。

外部キー使う場合、たしかにオーバーヘッドになり得るけれど、アプリケーションコード側で事前チェックとか気にする必要なくなるし、DB側でできる部分は無理にアプリケーションに持ってくること無い。