質問: PHP/SQLを学習中です。今までORMを使っていましたが、少し不便なところが出始めたので、素のSQLも使い始めました。 質問なのですが、サブクエリでまとめるのとクエリを何度も投げるのはどちらがよいのですか? PHPフレームワークとしてFuelPHPを使っているのですが、こちらのフレームワークのORMが生成したクエリを見ると、サブクエリを使ってひとつのクエリにまとめているようでした。しかし、そうしたクエリで取得される場合は、多くの場合重複が多く、無駄が多く見えてしまいます。 たとえば、ある特定のタグ(Tag)の情報と、そのタグに紐づいた投稿(Post)を全て取得したとき、 タグの情報は、取得された投稿内ですべて共通なのにもかかわらず、全ての結果レコードに重複して含まれてしまいます。 取得にかかるコストは、もしかしたら重複していようがなかろうが変わらないのかもしれませんが、なんとなく変な感じがしますし、メモリ効率も気になりますし、ORMを使わなかった場合、読みにくいコードになりそうな気がします。実際のところ、どうなのでしょうか?
回答: 前提がなにもないので、この場合の答えは、「場合による」でしょう。 コストのことを気にするよりは、メンテナンス性を気にしたほうがいいような気がします。 パフォーマンスに問題が出た時にメンテナンス性の高いコードなら対応もしやすいはずです。 DBは、実行前にExplainという処理が入るはずですし、フレームワークを作る人も私達よりも優秀な開発者でしょう。 プログラマが下手にコードを最適化するよりもコンパイラに任せるほうが良いという話も聞きますし、 下手にそのようなコードを書くとかえって最適化の邪魔になるとかもね。 ただ、SQLは書く人によって数百倍の差がでることがあるという話もあるので、そのようなことを分かったうえでルールを突破するというのもありでしょう。 その時々に応じて最適な解を出せるのがスキルじゃないかなぁと思います。