Doma2環境の中間テーブルを考える

Doma2環境でレコードを削除するときに中間テーブルをどう扱うか悩んだのでそのメモ。

悩んだ状況

f:id:orekyuu:20180929201610p:plain 上のようなテーブルで、repositoriesのレコードを削除するときのことを考える。
repositoriesにはlanguages、frameworksの間に中間テーブルが存在していて、一緒に削除しないと外部キー制約に引っかかってエラーになる。 repositoriesを削除する前にこの中間テーブルを削除しなければならないが、Doma2ではsqlファイルに複数のSQL文を書くことができないので何かしらの方法を考える必要がある。

考えられる選択肢

カスケードを使う

中間テーブルの外部キーにON DELETE CASCADEをつけてrepositoriesのレコードを削除したときに一緒に削除できるようにする。
DB側で頑張るのでアプリケーションコードがすっきりする。ただし、テーブルA -> B -> C -> Dのように伝播が広がりすぎると手がつけられなくなる可能性がある。ちょっとこの辺は経験不足なのでどうなるかわからない。

アプリケーションコードで頑張る

中間テーブルのDaoを作ってアプリケーションコードで削除するようにする。アプリケーションコードがつらくなる。面倒。
メリットとしてはDBのマイグレーションよりはアプリケーションコードのほうが変更が容易であること。

JOINして削除する[ボツ]

これは試してボツになった案。調べてみて知ったが、joinして複数のテーブルをまとめて削除できるらしい。
DocumentMulti-Table Deletes 参照
以下のようなSQL1発で解決できると思ったが外部キー制約に引っかかってダメだったのでボツ。

delete repositories, rf, rl from repositories
  join repository_frameworks rf on repositories.id = rf.repository_id
  join repository_languages rl on repositories.id = rl.repository_id
where repositories.id = /*repo.id*/2

カスケードを使うことにした

アプリケーションコードがシンプルになる・カスケードに関してはテストである程度担保できるという理由で選択。
カスケードの伝播が広がりすぎて手がつけられなくなりそうになったら撤退する予定。