web-dev-qa-db-ja.com

ORMのないCRUD

私は、比較的複雑ですが標準的なデータベース関係を持つWebアプリを作成しています。 python/Ruby/phpなどでORMを使用すると、通常、多くのクエリが生成されることに気づきました。これは明白であると述べています。 ORMは通常、ジョブを完了するために必要な数よりも多くのクエリを作成します。彼らは完璧ではありません。

これらのクエリは自分で作成できます。これは古い学校のようですが、アプリはおそらくより高速に実行され、ORMをいじる必要はありません。代わりに、SQLをいじくります。言語固有/バージョン固有のライブラリーではなく、SQLをいじくり回します。

私はORMを恐れていません。過去に大成功を収めてきました。

人々が一般に(マクロレベルで)生のSQLクエリをサポートするためにコードをどのように編成するのか疑問に思っています。

たとえば、アプリケーションでアーキテクチャーのようなMVCを使用するとします。

  • 私の見解は、魅力的なライブラリを含むHTMLです。
  • 私のコントローラーはモデルからデータを取得し、ビューに送信します。
  • 私のモデルは、簡単なアクセスのために、構造のようなクラスのプロパティとメソッドに個々の/複数のdbテーブルをマップします。

SQLコマンドはどこに置くべきですか?私はそれがずさんなコードやマイルのSQLクエリを持つモデルのレシピであると想像できます。また、デフォルトのソートなどを追加することもできなくなります。そして、再びORMに戻ります。

これについて考えたら、クエリを含む各モデルのSQLヘルパーを作成することができます。他の方法があるのだろうか

3
user974407

私たちのチームでは、専用の データアクセスオブジェクト を使用して、DBアクセスコードを配置し、実際のSQLコードをストアドプロシージャに格納しています。

古臭く聞こえるかもしれませんが、実際に試されました。特定のチームメンバーの主張に基づいてORMフレームワークを評価したところ、非常に簡単なコードパスでN + 1選択の問題が見つかりました。私たちのチームにはSQLの専門知識があるため、あなたと同じ決定をしました。

DAOは痛い音?ボイラープレートがたくさん?シンプルでクリーンな状態を保つために、以下を使用しています。

  • ボイラープレートを最小限に抑えるためのSpring JDBC(JdbcTemplateおよびBeanPropertyRowMapperを参照)-ストアドプロシージャ名、パラメーター、およびJava.lang.Classを取り、結果セットを自動的にバインドする一般的な抽象化があります。
  • 依存性注入用のSpringを使用すると、DAOを簡単に配線し、テスト用に模擬できます。
3
Brandon