なぜORMを使用する必要があるのですか?[閉まっている]


113

ORMを管理/クライアントに使用する理由の「長所」をやる気にさせるとしたら、その理由は何でしょうか?

回答ごとに1つの理由を試して、投票されたものを最良の理由として確認できるようにします。


3
投票が必要な場合はwikiにしてください
frankodwyer

投票が必要な場合はWikiにするための+1
cletus 2009年

16
コンはどうですか?
ブライアンマシューズ

4
スプーンもありません。いいえ、本当に、欠点があります。パフォーマンスです。ORMを経由する必要がない場合は、DBクエリを最適化する方がはるかに簡単です。(私は文句を言っていません-最近ORMに切り替えたので、私はほとんどそれで満足しています。一般的には、ORMは進むべき道ですが、パフォーマンスを必要とする場合に限り、金属に近い場所でクエリを実行する方法を維持します)
Piskvorは、

2
@UğurGümüşhan、IMHO ORMを使用する主な利点は、他のアプリで使用するのと同じ言語とOOパラダイムでプログラムを作成できるようにすることで、開発者の生産性を高めることです。ストアドプロシージャは、RDBMSストアドプロシージャ言語で開発者コードを作成する場合、それを提供できません。したがって、ORMができることすべてを行うことはできません。
ビルカーウィン2013

回答:


53

データアクセスをより抽象的で移植性の高いものにします。ORM実装クラスはベンダー固有のSQLの記述方法を知っているので、その必要はありません。


61
これはORMの機能であることに同意しますが、ユースケースはかなり限定されることを提案します。約10年間、MySqlとsqlite以外はまったく使用していません。ほとんどの開発者にとって、これはおそらく非常にまれな要件だと思います。
troelskn 2009

40
@troelskn:私は同意します。私は多くのRDBMS製品を使用しましたが、プロジェクトごとに1つまたは2つを超えることはありません。したがって、移植性は、SQLを抽象化する最も実用的な価値ではありません。多くのORMユーザーは単にSQLでのコーディングを避けたいだけだと思います。
ビルカーウィン

2
ベンダーは常に新しいバージョン/機能をリリースしています...方言を書いて簡単にアップグレードするには、クールな人が必要です!
dotjoe

5
典型的な役に立たない答えなぜそれが良い答えとしてマークされているのか疑問に思う人は、上司にORMを使用するよう正当化しようとするようです:)私の質問は、Hibernateで発生する問題の種類ですstackoverflow.com/questions/6477170/...
user310291

2
@ user310291:OPは問題や落とし穴を要求しなかった、と彼はORMを使用することの利点を求めました。もちろん長所と短所はありますが、彼は長所を求めました。率直に言って、この答えが受け入れられ、それがそうであるのと同じくらい多くの賛成票を得たのには驚いています。なぜなら、私はそれをORMの主な利点として数えないからです。
ビルカーウィン、2011年

83

ORMを使用する最も重要な理由は、豊富なオブジェクト指向のビジネスモデルを保持しながら、それを保存し、リレーショナルデータベースに対して効果的なクエリをすばやく作成できるようにするためです。私の観点からは、優れたORMが提供できる高度なタイプのクエリ以外の他の生成されたDALと比較したときに、優れたORMがもたらす実際の利点はわかりません。

私が考えているクエリの1つのタイプは、ポリモーフィッククエリです。単純なORMクエリは、データベース内のすべての形状を選択する場合があります。あなたは形のコレクションを取り戻します。しかし、各インスタンスは、その弁別子に従って、正方形、円、または長方形です。

別のタイプのクエリは、単一のデータベース呼び出しでオブジェクトと1つ以上の関連オブジェクトまたはコレクションを熱心にフェッチするクエリです。たとえば、各シェイプオブジェクトは、頂点とサイドコレクションが入力された状態で返されます。

ここで他の多くの人に同意できないことを残念に思いますが、コード生成自体がORMに対応する十分な理由だとは思いません。ORMのような概念的またはパフォーマンス上のオーバーヘッドのないコードジェネレーター用の多くの優れたDALテンプレートを作成または検索できます。

または、ORMを使用するために適切なSQLを記述する方法を知る必要がないと思う場合も、私は同意しません。単一のクエリを作成する観点からは、ORMに依存する方が簡単なのは事実です。ただし、ORMを使用すると、クエリがORMおよびSQLでどのように機能するかを開発者が理解していないと、パフォーマンスの低いルーチンを作成するのは非常に簡単です。

複数のデータベースに対して機能するデータレイヤーがあると、メリットがあります。それは私がしばしばそれに依存しなければならなかったものではありません。

最後に、私の経験では、ORMのより高度なクエリ機能を使用していない場合は、学習を減らしてCPUサイクルを減らすことで、残りの問題を解決する他のオプションがあることを繰り返し述べなければなりません。

そうそう、一部の開発者はORMを使った作業が楽しいと感じているので、ORMは開発者を幸せに保つという観点からも優れています。=)


1
よく言った。元の投稿者は「短所」ではなく「長所」を具体的に探していましたが、ORMを使用する方法の影響を理解しないことによって作成されたHORRIBLE SQLをいくつか見ました。私にとって最大のメリットは、トランザクションシステムのDALコードの大部分を占める単純なCRUDトランザクションにあります。純粋なORMと他の生成されたDALメソッドの間でヘアを分割していると思います。オブジェクトとDBの間の変換に役立つものはすべてORMと見なすことができると思います。これは単なる異なる運用モデルです。
ダグランプ2013年

1
@Doug-単純なDALは生成されたCRUD SQLだけで構成されていたのに対し、ORMにはナビゲーションプロパティ、コレクションの永続性、専用クエリ言語、キャッシュなどのより多くの抽象化が含まれていたというのが私が後の違いだったと思います-より良い方法あなたの観察に照らして私のポイントを述べることは、ORMのより多くの機能を使用することでより速く実装できることは事実ですが、それらの機能がどのように機能するかを知らないままであることは決して容認できないということです。オームズの抽象化は、ほとんどのよりも漏れる多分ので(。en.wikipedia.org/wiki/Leaky_abstraction
チャック・

これについてもう少し詳しく説明してください:「ORMのより高度なクエリ機能を使用していない場合は、残りの問題を解決する他のオプションがあります」。また、hibernate gavin kingの作成者は次のように述べています。「確かに、Hibernateのようなシステムは意図的に「リークのある抽象化」として設計されているため、必要に応じてネイティブSQLを簡単に混在させることができます。ORMの抽象化のリークは機能であり、バグではありません!」- reddit.com/r/programming/comments/2cnw8x/...
jungle_mole

1)これは古いです。当時、ORMにはすべての機能(キャッシュ、クエリ、バッチ処理など)がありました。IMHO、オブジェクトベースのポリモーフィッククエリは、コード生成(明示的なADOマッピング)で簡単に提供できない唯一のORM機能です。2)いくつかの有用な穴が意図的に残されましたが、ORMで高い学習曲線を作成する必要な悪と高度な機能もありました。だから、私の答えは、高度なクエリが必要でない限り、ORMではなくコード生成を使用することでした。*)現時点では、ORMにはさまざまな種類があり、チームに適した機能セットはおそらくそこにあります。私のチームは現在Linq2DBが好きです。
チャック

60

開発のスピードアップ。たとえば、クエリ結果フィールドをオブジェクトメンバーにマッピングしたり、その逆を行ったりするような反復的なコードを排除します。


3
反復的なコードは非常に悪いですが、これを削除する抽象化を構築できませんか?たとえば、行を返すテーブル/クエリ結果オブジェクトを作成して、それを使って処理することができます。ORMは、DBで選択された抽象化(テーブル/クエリ結果の行)ではなく、個々のクラスインスタンスに行を分割するようです。これがORMが良くないと言っているわけではありませんが、これだけでORMを使用する理由はわかりません。
ベンジョン2014年

@Benjohn、私は、ORMソリューションが個々の行をオブジェクトとして扱うのに対して、RDBMS は行のセットをエンティティとして扱うことに同意します。RDBMSマインドセットでは、OOマインドセットでは実行できないことを実行できます。
ビルカーウィン2014

これは、トランクを使用するために車全体を購入するようなものです。反復作業を回避する方法はたくさんあります
mohas

15

データアクセスレイヤーでのビジネスルールのOOカプセル化のサポート。不格好なトリガーやストアドプロシージャ言語の代わりに、好みのアプリケーション言語でビジネスルールを記述(およびデバッグ)できます。


データベースにビジネスルールを設定したくないですか?これがデータベースの利点です。複数のクライアントが、DBMSが提供する同じインターフェースを使用できます。インターフェイスロジックの多くが特定のクライアントのORMコードでロックされている場合、それはデータベースに存在せず、他のクライアントはそれを使用していません。キューフロントオフィスバックオフィスの休憩(あるクライアントモデルが別のクライアントモデルと一致しない)。
ベンジョン2014年

1
@Benjohn、私は単純にビジネスルールをデータベースに入れる傾向がありますが、より複雑なルールは宣言制約で簡単に形成されません。たとえば、「同じブランドのスラックを3足以上購入すると、注文全体で10%オフになります。」そのビジネスルールをデータベースにどのように配置しますか(ストアドプロシージャに関する回答は扱いにくいことに注意してください)。
Bill Karwin、2014

2020年です。ストアドプロシージャを使用している人はもういないでしょう。それであなたはまだ立っていることを指摘しますか?
スパイダー

私の考えは、人々ストアドプロシージャを使用せず、アプリケーションコードを使用するということです。違うことを理解しましたか?
ビルカーウィン


8

抽象化に向けて開発しているため、さまざまなデータベースソフトウェアに簡単に移行できます。


41
datbaseの作業を行ってから30年以上たった今、私はこれを行う必要がありませんでした。
HLGEM 2010

4
不可能ではありません!:)
Matt Fenelon、

2
@HLGEMは、クライアントの選択肢を閉じていることを意味します。実際に発生する可能性があります。たった3年間のwebapps作業で、
ORM

1
インメモリデータベースでテストを実行したい場合に便利です
Carlos Parraga

同じソフトウェアの複数のインスタンスが異なるデータベースを使用する可能性があります。しかし、実際に既存のデータを1つのDBソフトウェアから別のDBソフトウェアに移動することはほとんどありません。その場合、多くのORMは実際にはそれを支援しません。
jlh 2018年

4

オブジェクトモデルと永続モデルが一致するようにします。


1
多分あなたの永続性はあなたのオブジェクトモデルに対して透過的です
S.Lott

4

開発の幸福、IMO。ORMは、SQLで実行しなければならないベアメタルの多くを抽象化します。コードベースをシンプルに保ちます。管理するソースファイルが少なく、スキーマの変更に何時間も維持する必要がありません。

私は現在ORMを使用しており、それにより私の開発がスピードアップしました。



3

私が調査している理由は、VS2005のDALツール(スキーママッピング、TableAdapters)から生成されたコードを回避するためです。

私が1年以上前に作成したDAL / BLLは、他の誰かが生成された関数の一部を利用するために(私がそこにあるとは思いもよらなかった)使用するまで、(私が作成したものに対して)うまく機能していました。

それはからのDAL / BLLソリューションよりもはるかに直感的でクリーンなソリューションを提供するように見えます http://wwww.asp.netの。

独自のSQLコマンドC#DALコードジェネレーターを作成することを考えていましたが、ORMはよりエレガントなソリューションのように見えます


2

クエリのコンパイルとテスト。

ORMのツールが改善されると、コンパイル時のエラーとテストにより、クエリの正確性をより迅速に判断することが容易になります。

クエリをコンパイルすることで、開発者はエラーをより早く見つけることができます。正しい?正しい。このコンパイルが可能になるのは、開発者がSQLの文字列やSQLのようなステートメントではなく、ビジネスオブジェクトまたはモデルを使用してコードでクエリを記述しているためです。

.NETで正しいデータアクセスパターンを使用している場合、メモリコレクション内でクエリロジックをユニットテストするのは簡単です。データベースにアクセスしたり、データベースにデータを設定したり、本格的なデータコンテキストを起動したりする必要がないため、テストの実行速度が向上します。メモリ内のテストは提示することができます、克服するのが難しい課題するます。しかし、これらの統合テストは、以前よりも簡単に記述できると思います。[/ EDIT]

これは、質問が尋ねられた数年前よりも今日の方が明らかに関連性が高いですが、それは、私の経験が存在するVisual StudioとEntity Frameworkにのみ当てはまる可能性があります。可能であれば、独自の環境をプラグインしてください。


1

SQLを95%離れた場所に抽象化して、チームの全員が超効率的なデータベース固有のクエリを作成する方法を知る必要があるわけではありません。


1

ここには多くの良い点があると思います(移植性、開発/保守の容易さ、OOビジネスモデリングに焦点を当てるなど)は、クライアントまたは管理を説得しようとするとき、すべてを使用することで節約できる金額に要約されます。 ORM

典型的なタスク(または今後発生する可能性のあるさらに大きなプロジェクト)の見積もりを行うと、(うまくいけば!)無視するのが難しい切り替えに関するいくつかの引数が得られます。


0

コードスミステンプレートを使用した.net層

http://nettiers.com/default.aspx?AspxAutoDetectCookieSupport=1

同様に生成できる何かをコーディングする理由。


ああ。大規模な商業プロジェクトでネット階層を使用しましたが、使用しないことを強くお勧めします。問題は、それが構成可能でないことです。FooとBarオブジェクトをクエリしたいですか?結合を作成することはできません。必要なオブジェクトタイプごとに個別のクエリを発行する必要があります。その結果、データベースへの呼び出しが多くなり、パフォーマンスと原子性が損なわれる可能性があります。悪い、悪い、悪い。近づかないで。
ユダガブリエルヒマンゴ

0

変更が行われたときに節約できる時間と費用を納得させ、ORMツールが代わりにSQLを作成するため、SQLを書き直す必要がありません。


0

短所の1つは、ORMがPOJOで更新を必要とすることです。主にスキーマ、リレーション、クエリに関連しています。したがって、モデルオブジェクトを変更することを想定していないシナリオは、プロジェクトまたはb / wクライアントとサーバー上で共有されているためと考えられます。そのため、このような場合は、2つのレベルに分割する必要があり、追加の作業が必要になります。

私はAndroid開発者です。ご存知のように、モバイルアプリのサイズは通常それほど大きくありません。そのため、pure-modelとorm-affected-modelを分離するこの追加の作業は、十分に価値があるとは思えません。

私はその質問が一般的なものであることを理解しています。しかし、モバイルアプリも一般的な傘の中にあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.