1. ホーム
  2. sql

[解決済み】ORMを使うか、プレーンなSQLを使うか?[クローズド]

2022-04-03 21:47:31

質問

私が開発した(その後忘れてしまった)いくつかのアプリケーションでは、主にMySQLでプレーンなSQLを書いていました。 PythonでORMを使ったこともあります。 SQLAlchemy でも、長くは続かなかったんです。 通常、ドキュメントや複雑さ(私の視点)が私をためらわせるのです。

移植性のためにORMを使い、1種類のデータベースを使うだけならプレーンなSQLを使う、というように考えています。データベースのサポートが必要なアプリを開発するときに、ORMとSQLのどちらを使うべきかのアドバイスを本当に求めています。

考えてみると、データベースの不整合を処理するための軽量なラッパーを使用する方が、ORMを使用するよりもはるかに優れていますね。

どのように解決するのか?

ORMにはいい機能があります。データベースのカラムをオブジェクトのフィールドにコピーするような面倒な作業の多くをこなすことができるのです。通常、言語の日付や時刻の型を適切なデータベース型に変換してくれます。一対多の関係も、ネストしたオブジェクトをインスタンス化することで、かなりエレガントに処理することができます。ORMの長所と短所を考慮してデータベースを設計すれば、データベースへのデータの出し入れの手間を大幅に省くことができることがわかりました。(ポリモーフィズムや多対多のリレーションシップをマッピングする必要がある場合は、その処理方法を知っておくとよいでしょう。この2つの領域が、ORMを「コンピュータサイエンスのベトナム」と呼ばせる「インピーダンスミスマッチ」のほとんどを提供するのです)。

トランザクションを行うアプリケーション、つまりリクエストを行い、いくつかのオブジェクトを取得し、それらをトラバースしてデータを取得し、Webページでレンダリングする場合、パフォーマンスへの影響は小さく、多くの場合ORMは以前見たオブジェクトをキャッシュするのでより速くなります、そうしなければ何度もデータベースにクエリを発行することになります。

レポート作成が多いアプリケーションや、リクエストごとに大量のデータベース行を扱うアプリケーションでは、ORM の負担はより重くなり、キャッシュは大きな、無駄なメモリを消費する負担に変わります。その場合、シンプルなSQLマッピング(LinQやiBatis)や、薄いDALでハンドコーディングされたSQLクエリが望ましいでしょう。

大規模なアプリケーションでは、両方のアプローチを使うことになると思います。(単純なCRUDにはORM、レポーティングにはSQL/thin DAL)。