HABTMリレーションシップは悪であるという論争
Ruby On RailsやCakePHPといったフレームワークのORマッパに存在するHas And Belongs To Manyという機能(通称:HABTM)があります。HABTMとは2つのデータモデルを中間のデータを介して関連させるデータモデルで冒頭の図のようなデータモデルです。筆者がこの省略形の読み方などについてTwitterで話していたところ、興味深いリプライを受け取りました。
俺らはHABTMなんか使わない。なぜならHABTMは悪だからだ。
HABTMについて検索したところ見つかったのがThe evil, unnecessary has_and_belongs_to_manyと題された記事。それによると下記の理由からHABTMを使うべきではないとしています。
- joinテーブルが隠蔽されて過度に魔法的である。また
- たいていの場合、ジョインしたモデルにデータが増える。これをHABTMから追うのは難しい。
- HABTMではなくHMTを使えばなんの問題もない。
- データが大きなってしまってからHMTに移行するのは難しい。
文中に出ているHMTとはHasManyの:throughオプションの事で、HMTを利用すれば中間のモデルを介さずに同様のデータ構造を実現できます。蛇足ですがこれまでは「HABTM」を「はびたむ」と発音していましたが、助言に従って「エイチエービーティーエム」と発音していくことにします。
HABTMはRailsにインスパイアされたCakePHPにも実装されていますが、Railsのコミュニティではすでにバッドプラクティスになっているというギャップが興味深いですね。おそらく他にもこのような例があるのではと思います。
via:http://archive.culann.com/2008/03/the-evil-unnecessary-has_and_belongs_to_many
古いエントリーに対するコメントで恐縮ですが、HABTMを使わなくてもHMTで実現できるというのは理解し、普段使うのもHMTに移行しているのですが(CakePHP)、「中間のモデルを介さずに同様のデータ構造を実現できます」というのが未だに理解ができていません。故に「HABTMが悪だ」というところも理解ができないでいます。
n:nの関係にあれば中間テーブルは必要だと思いますし、それが単にjoinだけの役割であるとき(他のデータを保持する必要が無い)、HABTMを使うべきでないというのはどの点が理由になるのでしょうか。
Masayuki Tahara (@macchaka)
2014/06/10 at 01:01