SQLアンチパターン 第四章を読んで

SQLアンチパターンwww.oreilly.co.jp

を読んでの要約、感想です。

目的

データベースのアーキテクチャを単純にしたい データベースのアーキテクチャ、複数のテーブルが複雑にからみあう中で、その関係をもっと柔軟にしたいとういのが今回の目的です。

アンチパターン

外部キー制約をしない

デメリット

  1. 関係してるテーブルを確認してから削除や追加をして、という作業をしている間に新たな行が作られたりしてぼっちの情報ができるのを防ぐことができない
  2. 外部キー制約がない場合全ての参照を調べなければならない

使用してもいい場合

外部キー制約が用いれない場合は仕方ないと本書にはあります。

解決策

外部キー制約を使用する。
ミス防止は投資以上の効果を発揮する事例が紹介されていました。外部キーを使用するのはミスを防ぐのでとても有用であるとのことです。
例えばRailsでもvalidationを定義するのはエラーメッセージ等レールにのれるというメリットもありますが、それ以上にミスを防げるというのがメリットだというのと同じだと思います。
制約を作ることは柔軟性を下げるかもしれませんがそれ以上にバグを減らすメリットがあるということですね。
カスケード更新もできるから柔軟性もあるとあります。確かにカスケード更新はよく書かれていますね。 関係ないですがrailsdependent: :destroyだけだと単に探して消してくれているだけです。

       Guide Load (0.3ms)  SELECT "guides".* FROM "guides" WHERE "guides"."champion_id" = $1  [["champion_id", 5]]
      Guide Destroy (0.3ms)  DELETE FROM "guides" WHERE "guides"."id" = $1  [["id", 3]]
      Champion Destroy (0.3ms)  DELETE FROM "champions" WHERE "champions"."id" = $1  [["id", 5]]
       (0.1ms)  RELEASE SAVEPOINT active_record_1
 

感想

外部キー制約を使いなさいという章でした。手軽にできてバグを大幅に減らしてくれるなんてなんて素敵な制約なんだ…