外部キーの使い所についての雑感

前職の後輩に質問されて、実際どうすべきなのか迷ったけど、社内のDBのすごい人(何この表現w)に聞いたら、なんとなく腹落ちしたので、自分的な考えをとりあえずまとめておくアルヨ。
まず外部キーて、「テーブルAの列 aに入る値は、すべてテーブルBのbという列の値でなくてはならない」みたいな制約を入れたい時に利用するものですよね。外部キー(Foreign Key)を張るとDBMSは、テーブルAの列aに値がインサートされるタイミングで、その値がテーブルBのb列にある値であるかをチェックするわけです。はい。
つまり簡単に言うと、更新系の処理の場合には、外部キーを張っていない場合よりも張っている場合の方が、入力チェックがかかる分コストもかかる。という事です。
ただこの入力チェックが時に負荷的ネックになることもあるんです。不断なくログやトランザクションを短時間に大量にインサートするような場合に、このチェックが走ると、そりゃもうチリツモで馬鹿にできないらしいです。(特にOLTP環境では)
それをさらに超えるとコスト惜しさに主キーすら無くしたテーブルが登場するらしいですよ。(前職でそんなテーブルを見てゲンナリした記憶がありますが、今なら何となく歩みよれそうです。ただそこまで行ったら、そもそも設計を変えた方がいいような気がしますが。。。)
という訳で、自分的に外部キーは「参照整合性」が必要にならない限り、なんでもかんでも使わなくてもいいかなと思ってます。ただ使わざる得ない場合でも、

  • 履歴管理系のテーブルには使わない。

なんて緩いポリシーだけをとりあえず持っておこうと思います。
この話はとっても主観的な話なので、あまり鵜呑みにはしないように。だって書いてる本人はめっさ眠くて日本語がちゃんと書けてるかも良く分かってないからw