エンティティフレームワークVS LINQ to SQL VS ADO.NETとストアドプロシージャ [閉まっている]


430

それぞれについて、次の点でどのように評価しますか。

  1. パフォーマンス
  2. 開発のスピード
  3. きちんとした、直感的な、保守可能なコード
  4. 柔軟性
  5. 全体

私は自分のSQLが好きなので、常にADO.NETとストアドプロシージャの熱心なファンでしたが、最近、Linq to SQLを試してみましたが、DataAccessレイヤーをすばやく書き出して費やすことに決めましたLinq to SQLまたはEFのどちらかを実際に理解している...どちらでもない?

私が確認したいのは、これらのテクノロジーのいずれにも、私の研究時間を無駄にするような大きな欠陥がないことです。たとえば、パフォーマンスはひどいです。シンプルなアプリにとってはクールですが、これまでのところしか利用できません。

更新: ORM VS SPではなくEF VS L2S VS SPに集中できますか?主にEF VS L2Sに興味があります。しかし、プレーンなSQlは私がよく知っているものなので、ストアドプロシージャと比較することにも熱心です。


94
建設的ではなく、それでも多くの賛成票はありますか?...;)
BritishDeveloper

34
誰かがこれを建設的ではないとマークした理由はわかりません。本当に良さそうです。私からの+1。
Thanushka 2013

10
これは私の見解では素晴らしい質問です。個人的には、Entity Frameworkと同様のすべてのORMが、プレーン/シンプルなADO.Netコードと比較して遅いことに気づきました。私はこのテストを2年前に行った後、1週間前にもう一度行いました。LINQ to SQLとEFの比較についてはわかりません。ただし、ADO.Netは常に最高のパフォーマンスを発揮します。開発時間を節約したい場合、Entity Frameworkは優れたツールですが、パフォーマンスが主な関心事である場合は間違いありません。
Sunil、2014

2
@Timeless:データベースのメカニズムに依存しない傾向があります。すべてのデータベースエンジンには独自のストアドプロシージャ言語があるため、追加の学習があります。開発者の99.9%はORMに依存できます。これは、非常に優れたコードを生成し、SQLを自動的に作成します。単純なCRUDの場合、パフォーマンスの違いはわずかです。ストアドプロシージャの開発と保守は困難です。数年前、ORMがなく、魔法のように自動的にデータベースから何も生成されなかったとき。アプリケーションでSQLステートメントを作成する代わりにSPを作成することは、それほど時間はかからないと考えられていました。
LukLed 2014

4
@Sunilは正しいですが、十分な言葉ではありません。問題は、誰もが彼らの主な関心事はアプリのパフォーマンスと思っていることです。最高のパフォーマンスを必要とするアプリについて話すとき、ハードコアのC ++ MMOまたは何百万もの高額な顧客向けデータベーストランザクションを思い浮かべます。保守性可読性永続性の無知ドメインロジックの分離などのオブジェクト指向の原則に焦点を当てる必要があります。特に、多くの場合、パフォーマンスの向上がわずかであるか、存在しない場合。
Suamere 2014年

回答:


430

まず、新しいプロジェクトを開始する場合は、Entity Framework( "EF")を使用します。これにより、より優れたSQL(Linq to SQLと同様)が生成され、Linq to SQL( " L2S」)。.NET 4.0のリリースの時点では、Linq to SQLは時代遅れのテクノロジーであると考えています。MSは、L2S開発をこれ以上継続しないことについて非常にオープンです。

1)パフォーマンス

これは答えるのが難しいです。ほとんどの単一エンティティー操作(CRUD)では、3つのテクノロジーすべてでほぼ同等のパフォーマンスが得られます。EFとLinq to SQLを最大限に活用するには、それらがどのように機能するかを知っている必要があります。ポーリングクエリなどの大量の操作の場合、EF / L2Sでエンティティクエリを「コンパイル」して、フレームワークがSQLを常に再生成する必要がないようにするか、スケーラビリティの問題が発生する可能性があります。(編集を参照)

大量のデータを更新する一括更新の場合、生のSQLまたはストアドプロシージャは、ORMソリューションを介してデータをORMにマーシャリングする必要がないため、常にORMソリューションよりもパフォーマンスが高くなります。

2)開発のスピード

ほとんどのシナリオでは、EFは開発のスピードに関しては、裸のSQL /ストアドプロシージャを吹き飛ばします。EFデザイナは、変更に応じて(要求に応じて)データベースからモデルを更新できるため、オブジェクトコードとデータベースコードの間で同期の問題が発生することはありません。ORMの使用を検討しないのは、更新を行わないレポート/ダッシュボードタイプのアプリケーションを実行しているとき、またはデータベースで生データのメンテナンス操作を行うだけのアプリケーションを作成しているときだけです。

3)きちんとした/保守可能なコード

EFはSQL / sprocsに勝っています。関係はモデル化されているため、コード内の結合は比較的まれです。エンティティの関係は、ほとんどのクエリの読者にとってほぼ自明です。データに実際に何が起こっているのかを理解するために、層から層へのデバッグ、または複数のSQL /中間層を経由する必要があることほど悪いことはありません。EFは、非常に強力な方法でデータモデルをコードに取り込みます。

4)柔軟性

ストアドプロシージャとraw SQLはより「柔軟」です。sprocsとSQLを活用して、奇妙な特定のケースでより高速なクエリを生成できます。また、ORMを使用するよりも簡単にネイティブDB機能を活用できます。

5)全体

ストアドプロシージャを使用するのではなく、ORMを選択するという誤った二分法にとらわれないでください。 両方を同じアプリケーションで使用でき、おそらく使用する必要があります。大きな一括操作は、ストアドプロシージャまたはSQL(実際にはEFから呼び出すことができます)で行う必要があります。EFは、CRUD操作とほとんどの中間層のニーズに使用する必要があります。おそらく、レポートの作成にSQLを使用することを選択します。ストーリーのモラルはいつもと同じだと思います。ジョブに適したツールを使用します。しかし、その細い点は、EFが今日非常に優れていることです(.NET 4.0現在)。リアルタイムで読んで理解することで、驚くほど高性能なアプリを簡単に作成できます。

編集:EF 5は、自動コンパイルされたLINQクエリを使用してこの部分を少し簡略化しますが、実際の大量のものについては、実際に何が最適であるかをテストおよび分析する必要があります。


35
絶対に素晴らしい答え。私は現在、EFを使用して迅速にアプリを開発しています。パフォーマンスが問題になると、パフォーマンスの悪いEFクエリをリファクタリングするためにストアドプロシージャが組み込まれます。ありがとう!
BritishDeveloper

17
@BritishDeveloper:また、ビューを使用する力も忘れないでください。L2Sプロジェクトでいくつかのビューを定義し、フレームワークが不十分なクエリを書いているように見える場所でそれらを活用することで、私たちは大きな成功を収めました。このようにして、フレームワークを使用することのすべての利点と、独自のSQLを作成することのすべての利点を得ることができます。
Dave Markle

5
私もビューを使用しています;)EFのクロスDB以外の制限の回避策として。ただし、最適化に使用することをお勧めします。おかげで
BritishDeveloper

5
間違いなく素晴らしい反応。L2SとEF4を使って自分の経験で得た所見を追加したかっただけです。複数の異なるRDMBSを使用している可能性があることに気付いた後、L2S-> EF4からスワップしました...しかし、MSSQLを実行している間、パフォーマンスの低下は主にアプリのGUI領域で示されました。L2Sの結果セットへのデータバインディングは、EF4よりもはるかに高速でした。これは、まったく同じDBに対するまったく同じクエリです。ただし、ここで注意すべき点の1つは、9万件以上のレコードを返すため、違いがかなり明白であるということです。たぶん小さなセットでそれは問題ではありませんか?ボリュームの大きいサイトではどのようにスケールするかわかりません...
bbqchickenrobot

5
いい反応。私は4週間かけてLINQ-to-Entitiesを操作し、すべてをそれに詰め込もうとしましたが、最終的に、一括コピー、一括削除、データベースからの重複の超高速削除などにネイティブSQLが必要であることに気付きました。仕事に最適なツールです。ネイティブSQLとLINQ to Entitiesフレームワークを混ぜ合わせても恥はありません。
Contango、2011

93

ストアドプロシージャ:

(+)

  • 優れた柔軟性
  • SQLの完全な制御
  • 利用可能な最高のパフォーマンス

(-)

  • SQLの知識が必要
  • ストアドプロシージャはソース管理外です
  • 同じテーブル名とフィールド名を指定している間、かなりの量の「繰り返し」。DBエンティティの名前を変更し、どこかにそれへの参照が不足していると、アプリケーションが破損する可能性が高くなります。
  • 遅い開発

ORM:

(+)

  • 急速な発展
  • 現在ソース管理下にあるデータアクセスコード
  • DBの変更から隔離されます。その場合は、モデル/マッピングを1か所で更新するだけで済みます。

(-)

  • パフォーマンスが低下する可能性があります
  • ORMが生成するSQLに対する制御がまったくないか、ほとんどない(非効率であるか、バグが多い可能性があります)。介入してカスタムストアドプロシージャに置き換える必要がある場合があります。これにより、コードが乱雑になります(コード内の一部のLINQ、コード内および/またはソース管理外のDB内の一部のSQL)。
  • どんな抽象化でも、それが内部でどのように機能するかわからない「高レベル」の開発者を生み出すことができるので

一般的なトレードオフは、優れた柔軟性と多くの時間を失うことと、実行できることを制限されることと、非常に迅速に実行することの間のトレードオフです。

この質問に対する一般的な回答はありません。それは聖なる戦争の問題です。また、手元のプロジェクトとニーズにも依存します。自分に最適なものを選択してください。


47
ソース管理に関するポイントは関係ないと思います。データベーススキーマ、ストアドプロシージャ、UDFなどはすべてソース管理下に置くことができ、ソース管理下にある必要があります。
Lee Gunn

15
+1 forAs any abstraction can produce "high-level" developers having no idea how it works under the hood
nawfal

3
同意し、ソース管理の引数は正しくありません。データベース作成スクリプトは常にsvnに保存します。データベースアプリケーションを開発するときに、データベースをソース管理外に保つにはどうすればよいですか?
Wout

3
EFは高可用性と高パフォーマンスにはあまり適していません。私はDBAの人ではありませんが、EFが何を提供してコーディングを容易にするのかわかりません。
ジェイミー

4
したがって、「迅速な開発」のための柔軟性、完全な制御、およびパフォーマンスを放棄し、DBが変更された場合のコード変更を回避しています。私には純粋な怠惰のように聞こえます。
user2966445 2014

18

あなたの質問は基本的にO / RMと手書きのSQLです

ORMまたはプレーンSQLを使用していますか?

他のO / RMソリューションのいくつかをご覧ください。L2Sだけがその1つではありません(NHibernate、ActiveRecord)

http://en.wikipedia.org/wiki/List_of_object-relational_mapping_software

特定の質問に対処するには:

  1. O / RMソリューションの品質に応じて、L2SはSQLの生成にかなり優れています
  2. これは通常、プロセスを実行するとO / RMを使用するとはるかに高速になります。
  3. また、コードは通常、よりすっきりとしていて、保守しやすくなっています。
  4. もちろん、ストレートSQLを使用すると柔軟性が高まりますが、ほとんどのO / RMは、最も複雑なクエリを除くすべてを実行できます
  5. 全体的に、O / RMを使用することをお勧めします。柔軟性の損失はごくわずかです

@Davidありがとうございます。ただし、ORM対SQLではありません。私はORMへの移行を検討しており、学習に時間を費やすのはどうだろうと考えています。EFまたはL2S(それらがStored Procと比較してゴミでない限り)
BritishDeveloper 2010

1
ストアドプロシージャと比較して、これらは決してゴミではないと私は間違いなく言います。また、副次的な利点は、データベースにコードが拡散されないことです。個人的にはL2Sが好きですが、現時点ではEFをあまり使っていません。L2EFに取って代わるようですので、EFに行きます。また、Linqにいったん戻ると、元に戻りません。
BlackICE 2010

13

LINQ-to-SQLは、非常に使いやすく、概してバックエンドへの非常に優れたクエリを生成する、注目に値するテクノロジです。LINQ-to-EFはこれに取って代わる予定でしたが、歴史的に使用するのは非常に不格好であり、はるかに劣ったSQLを生成していました。私は現在の状況を知りませんが、マイクロソフトはL2Sのすべての優れた点をL2EFに移行することを約束しました。

個人的に、私はORMツールに情熱を抱いて嫌いです(詳細については、ここの私のダイアトリブを参照してください)。したがって、L2Sはデータアクセスレイヤーから必要とするすべてのことを期待するので、L2EFを支持する理由はありません。実際、手作りのマッピングや継承モデリングなどのL2S機能は、完全に不必要な複雑さを追加すると思います。しかし、それは私だけです。;-)


1
L2Sはかなり良いものですが、Microsoftが基本的に拡張にあまり投資しないと述べているという欠点があります。この結果は、最新のバージョンで確認できます。最新バージョンでは、いくつかのバグ修正とSQL Server 2008データ型のサポートが追加されています。
FinnNk 2010

同意しました、@ FinnNk。L2Sを使用することは、パリアステータスであるため多少危険であるのは残念なことです。しかし、もし彼らが本当にL2EFを支持してそれを完全に無効にしたなら、私は移行パスが存在するであろうと強く信じています。
Marcelo Cantos、2010

3
Linq to EFは成熟し、L2Sと同等のSQLを生成します(.NET 4.0以降)。L2EFは、L2Sが決して自動的に行うことができなかった、DBの変更に応じて少なくともモデルを更新できるため、現在のL2Sよりも優れています。また、中間エンティティを必要とせずに、EFとの単純なM:M関係を関係としてマップできることも気に入っています。これにより、コードがよりクリーンになります。
デイブマークル2010

2
更新@Daveをありがとう。しかし、私はM:Mコメントに同意しません。私が使用したスキーマでは、ほとんどの場合、結合テーブルの属性が増えます。これにより、オブジェクトモデルの構造が変化し、多くのコードの再作成が必要になります。私はむしろ最初から明示的に中間関係を扱いたいと思います。
Marcelo Cantos、2010

1

ストアドプロシージャの能力とパフォーマンス、およびEntity Frameworkのようなツールが提供する迅速な開発である場合は、まったく新しいアプローチを検討する必要があります。

小規模なプロジェクトのテストドライブとしてSQL +を使用しましたが、それは本当に特別なものです。基本的にコメントに相当するものをSQLルーチンに追加し、それらのコメントはコードジェネレーターに指示を提供します。コードジェネレーターは、実際のSQLルーチンに基づいて非常に優れたオブジェクト指向クラスライブラリを構築します。逆のようなエンティティフレームワークのようなもの。

入力パラメーターは入力オブジェクトの一部になり、出力パラメーターと結果セットは出力オブジェクトの一部になり、サービスコンポーネントはメソッド呼び出しを提供します。

ストアドプロシージャを使用したいが、それでも迅速な開発が必要な場合は、この内容を確認することをお勧めします。

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