SQLアンチパターン 第六章を読んで
を読んでの要約、感想です。
目的
複数の親を持つテーブルが欲しい。例えばキャラクターに関するコメントもアイテムに関するコメントもおなじコメントテーブルに置きたいとうのが今回の目的です。
アンチパターン
ポリモーフィック関連を定義するというのがアンチパターン。 ポリモーフィック関連とは親のテーブルの名前をカラムとして追加してその後外部キー制約なしに外部キーに当たるものをカラムに格納する関連付けの方法です。
comment_id | target_type | target_type_id |
---|---|---|
1 | Characters | 1 |
2 | Items | 1 |
デメリット
- target_typeに他のテーブルの値のみが入ること、target_type_idに他のテーブルの主キーが入ることを保証できない
- Characters、Itemsと結合しようとしても全ての行が一つのテーブルと関係があるわけではないので内部結合はできない
使用してもいい場合
外部キー制約使えってあります。フレームワークがしっかりしてるならまぁ使っても良いんじゃない?って感じです。使用してもいい場合の文章割と身も蓋もないです。
解決策
参照を逆にします。今回の例で言えばCommentsテーブルをCharactersとItemsの親にして関係テーブルを仲介させることでtarget_typeカラムを使わずに関係を表すことができます。 共通の親テーブルを作成することも有効です。今回ならGuidesテーブルを作成してguide_idを主キーとしてそれぞれのテーブルにもたせればそれぞれのテーブルが比較可能なカラムをもつので結合が簡単になります。
感想
毎日書くペースだとまとめ過ぎな気もしてきた(後大変)なのでさっくりまとめる感じでいきたい。どうせならもっと短くしたいという気持ちが強まってきました。この章は解決策がしっかりしていてポリモーフィック関連を使わないのも十分可能だなと感じました。ただSQLの正義が絶対正義ではないみたいな話を職場できいたのでメリデメしっかり理解するのが大事ですね。多分この本全てに言えますけど。