2009-07-02 19 views
2

歴史的に私は、最も基本的なアプリケーション以外のすべてでORMSの使用に完全に反対してきました。ORMの現在の状態は何ですか?

私の推論では、これは非常に漏れやすい抽象化であることが主な理由でした。主にSQLは、ORMによって大抵が乱されるような、リレーショナルソースからデータを取得する非常に強力な方法を提供するためです。リレーショナルバックエンドを持たない外観を得るためのパフォーマンス。

私はいつもデータは常にデータベースに保存されていなければならないと考えていました。さらに、ジェネリックになることのパフォーマンスヒットは有害です。たとえば、データベースのすべてのクライアントの名前とアドレスが必要な場合は、SQLを使用して取得する簡単な方法が1つのクエリで提供されます。 ORMを使用すると、すべてのクライアントを取得してから各名前とアドレスを取得する必要があります。遅延ロードされていても、それ以上時間がかかります。

これは私の考えですが、上記のいずれかが変更されていますか?私はエンティティフレームワーク、NHibernateなどのような多くのORMSを見ています。そして、彼らは最近、最近多くの人気を持っているようです...それらの価値がありますか?彼らは私が上記の問題を解決していますか?

答えて

6

お読みくださいAll Abstractions Are Failed Abstractionsこれは、あなたの質問を多く見てください。

パフォーマンスは通常ORMには問題ありません。実際に自分がいる状況にいる場合は、通常、ORMが使用するSQL文を手作りするオプションが常にあります。

IMHO ORMは、瞬時の巨大な開発スピードをもたらします。だから彼らはとても人気があります。そしてそれらを正しく使っても、コーナーで自分を塗ることはできません。常にパフォーマンスをチューニングするオプションがあります。

編集:

ジェフは、LINQ to SQLのに焦点を当てていますが、彼は抽象化とパフォーマンスについて言うすべてが(私は現実世界のアプリの開発の年から知っている)NHibernateのためにも同様に当てはまります。 IMHOは、デフォルトでORMを使用する必要があります。なぜなら、彼らは悪名高い90%の状況に対して十分に速いからです。 ORMのために書かれたコードを読むことは、コードを継承する次の開発者がコードを取り上げたときに、より保守性と読みやすさが向上します。 Always code as if the person who ends up maintaining your code is a violent psychopath who knows where you live.その男について決して忘れないでください!

さらに、キャッシング、遅延読み込み、作業単位などを提供します...名前を付けます。そして私はORM の性能について喜んでいないときは、それが私の失敗であることを発見しました。 ORMはあなたに良いOO設計プラクティスを遵守させ、あなたのドメインモデルを形作るのを助けます。

+0

+1これは私の答えです(自己投票!) – dfa

+0

私はすでにそれを読んだことがありますが、Jeffは主にLinqについてSQLで話しています。私はormsに興味があります。私はLinqのSQLへの制限を知っていて、それを使う方法とその限界を知っているときに便利なツールだと思っています...しかし... ORMに関して同じことを言えますか? –

+0

「ORMには通常問題がありません」と言われると、実行速度が速いか、パフォーマンスを目指している場合は使用しないでください。 –

0

いずれの抽象化でも、パフォーマンスのいずれかを支払うか、または漏洩する必要があります。 SQLはきれいで洗練された言語なので、私はORMに反対することに同意します。私は、私のためにこれを行う小さなフレームワークを書きましたが、ちょっと、私は自分自身のORMで座っていました(しかし、例えばHibernateよりも少しコントロールしています)。 Hibernateの背後にいる人々は、それが速いと述べています。あなたのデータベース(簡単なクエリ、更新など)に対して退屈な仕事の約95%を行うことができるはずですが、あなたが望むならあなた自身が最後の5%を自由にすることができます(特別な場合には常に独自のマッピングを書くことができます)。

多くのプログラマーが怠け者であり、確立されたフレームワークが彼らのために汚い退屈な永続性の仕事をすることを望んでいると思いますが(私は理解することができますが)抽象化の価格は常にそこにあります。私は、深刻なプロジェクトでORMを使用することを選択する前に、自分のオプションを徹底的に検討します。

1

Ruby on Rails側では、ActiveRecord(本質的にORM)がRailsアプリケーションの95%の基礎となります(統計は作成されましたが、その周辺にあります)。実際には、95%に達するためには、DataMapperのようにRails用に他のORMを組み込む必要があるでしょう。

抽象化は漏洩しており、開発者は必要に応じていつでもSQLに落とすことができます。 SQLを直接使用していないときでも、データベースのヒット数などを考慮する必要があります。たとえば、ActiveRecordでは、複数のデータベースヒットを避けるために "eager loading"が使用されます。最初のクエリ内の各ポストの「著者」フィールドには、...それがポイントである)私が思うに、ボンネットの下に

for post in Post.find(:all, :include => :author) 

に参加しないこと、すべての抽象化を行うが、それは本当にポイントではありません抽象化が漏れて。抽象化を使用するかどうかを決定するには、一般的な作業負荷を増やすか減らすかを検討する必要があります。言い換えれば、は抽象化作業を行うためにコンセプトを改造するのに多くの時間を費やすか、それほどハッキングすることなく(時間を節約して)必要な作業を行う準備ができていますか? ActiveRecordのは(Hibernateが持っているとして)ブロックの周りトンとなっているので、それはあなたが希望リークのほとんどにパッチを適用する抽象方法を提供しています。私はその仕事抽象化が成熟しているものであることを考える

明示的にローレベルのソリューションをローリングすることなく(つまり、SQLを書かずに)、通常心配する必要があります。

ほとんどのデータベースアクセスでは、ORMは驚くほど時間を節約でき、ほとんどのアプリケーションではDBの「通常の」使用が実際に行われていると私は考えています。あなたのケースではないかもしれませんが、直接DBアクセスのためのORMを避けることは、しばしば早期で不必要な最適化のケースです。

編集:この抽象化は、少なくとも 書くことが少し楽に我々のコードを作るん私はこれを見たことがなかったが、ジェフの引用は

のですか? に理解しますか?トラブルシューティングを行うには? より抽象度の高い方が良いでしょうか?

と本質的に同じものです。

1

最近のORMの中には、現実世界の多くの問題を解決する本当に強力なツールがあります。良いORMはあなたからリレーショナルモデルを隠そうとはしませんが、OOプログラミングをより強力にするために実際に活用しています。リレーショナル代数の「低レベル」の詳細を無視できるという意味では抽象概念ではなく、リレーショナル・モデルの抽象概念を構築し、データを必須モデルに取り込みやすくするためのツールキットです。その変更をデータベースに戻します。 SQL言語は、一般的な述語を構成可能で再利用可能なコンポーネントに分解して、ビジネスレベルの抽象化を達成するための良い方法を実際に提供していません。

確かにパフォーマンスが低下しますが、ORMに問題を起こす可能性があるため、ほとんどの場合定数の問題です。あなたの名前とアドレスの例のように、SQLAlchemyで行うだけです。

for name, address in session.query(Client.name, Client.address): 
    # process data 

となりました。しかし、ORMが役立つところでは、リユース可能な関係や述語があるときです。たとえば、クライアントのお気に入りアイテムに参加する方法を定義し、販売中であるかどうかを判断する述語を定義したとします。そして、あなたはまた、次のクエリで割り当てられた営業担当者をフェッチしている間に販売されて自分の好きな項目のいくつかを持っているクライアントのリストを取得することができます:私のため

potential_sales = (session.query(Client).join(Client.favorite_items) 
        .filter(Item.is_on_sale) 
        .options(eagerload(Client.assigned_salesperson))) 

Atleastのを、クエリの意図は、多くの書き込みに高速です10行のSQLではなく、このように書かれたときにはっきりとわかりやすくなりました。

関連する問題