web-dev-qa-db-ja.com

ORMなしでモデルレイヤーを設計するにはどうすればよいですか、いつそれを使用する必要がありますか?

私はCodeIgniterで始めたPHP開発者です。モデルの設計は簡単でした。モデルで定義された各メソッドは、通常のオブジェクト指向環境の静的メソッドと同等であるように見えました。

組み込みのアクティブレコードスタイルORMを備えたFuelPHPと、CodeIgniterで使用する PHP ActiveRecord を試しました。 ORMを使用するとモデルの作成が簡単であることがわかり、モデルを設計する際のベストプラクティスを学びました。

しかし、私は特定のORM実装に縛られているのが嫌で、SQLで良くなったので、SQLでどれだけ速くデータを取得できるかと比較すると、ORMは少し重いと思いました。

しかし、ORMを使用せずにモデルを最初から設計しようとすると、失われます。テーブルごとに1つのクラスのORMシステムと熱心なロードを伴うクエリは理にかなっており、ORMを使用することでパフォーマンスヒットの価値があるようです。

ORMの使用はどのような状況で避けるべきですか? SQLを直接使用できるように、ORMを使用せずにモデルを設計するにはどうすればよいですか?

8
kapv89

特定のORM実装に縛られているという事実が気に入らなかった...

何故なの?間違ったものを選ぶことを恐れていますか? 「ここでは発明されていない」のように聞こえます。選択した言語、SQL、Webフレームワーク、その他多数のものに依存することになります。 ORMはもう1つです。

ORMによるパフォーマンスが適切である限り、それを使用します。 ORMで生成されたクエリが一部のページに対して遅すぎる場合は、SQLビューまたはストアドプロシージャを作成して、必要な情報を正確に取得し、結果をカスタムプレゼンテーションクラスにマップします。便利な場合は、マッピングにORMを使用します。そうでない場合は、SQL結果セットをオブジェクトの配列に自分でマッピングできます。

6
kevin cline

OPで、ORMの使用が「悪い」ときにインスタンスを要求しました。 ORMが悪いとまでは言いませんが、結果はありますが、すべてが良いわけではありません。

  1. ORMは通常、アクティブレコードパターン*に従います(データマッパーは少し扱いに​​くいため)。
  2. これは、アプリケーションコードを支持する設計上の決定をデータベースに課す傾向があります。

これがこのような優れたパターンではない理由をまとめたBill Karwinの記事からのすばらしい引用です(SO参照されているスレッドは見つかりませんでした...):- http://karwin.blogspot.com/2008/05/activerecord-does-not-suck.html

単一のModelクラスは、1つのデータベーステーブル、複数のデータベーステーブル、またはおそらくデータベーステーブルなしでサポートされます。データの永続性は、モデル内の内部実装の詳細である必要があります。 Modelクラスの外部APIは、物理的なデータベース構造ではなく、論理的なOO=要件を反映する必要があります。

「DAL」に関しては、これは一見単純な頭字語であり、さまざまなパターンを含んでいます。個人的には、Zend_DBやNotORMなどのクエリジェネレーターを使用し、必要に応じて関係を記述するカスタムメソッドを作成することを好みます。少し手作業が必要ですが、Domainモデル(ORMモデルとは対照的に...)とサポートするデータベースに親しみますそれ。

あなたがそれらを追跡することができるなら一読に値するこの主題に関する古典的な本がいくつかあります:

データアクセスパターン:クリフトンノック

リレーショナルデータベース設計のハンドブック

余談ですが、RDBMSの設計とSQLを破棄してアプリケーション層に問い合わせることは、いくらか悲劇的なことのようです。これは新しいことではないかもしれませんが、プロジェクトの当面のニーズに適用される短期設計フェーズよりも間違いなくより堅牢である、非常に洗練された概念を表現する驚くべきテクノロジーのビットです。アプリケーションレイヤーに整合性の制約を残したり、使用しているDBプラットフォームで採用されているインデックス作成/クエリ方法を考慮に入れたりしないアプリが多すぎることを確認しました。 ORMは間違いなく賢いキットですが、SQLもそうです...

この感情を表す主題に関するもう1つのすばらしい引用があります(テーブルモジュールパターンを参照してください)。

多くの点で、このアプローチはリレーショナルデータベースを、屋根裏部屋に閉じ込められ、誰も話したくないクレイジーな叔母のように扱います http://martinfowler.com/eaaCatalog/tableModule.html

SOこの主題に非常に関連する別のスレッドがあります: リレーショナルデータベースの制約-完全に削除しないのはなぜですか?

8
sunwukung