68

Linq to Sql やその他の ORM マッパーについて私が考えたことについて、コミュニティに意見を求めたいと思います。

Linq to Sql と、C# と SQL の間の「インピーダンスの不一致」に対処するよりも、ネイティブの開発言語でデータ アクセス ロジック (または一般的な CRUD 操作) を表現するというアイデアが好きです。たとえば、ビジネス レイヤーの Event インスタンスの ObjectDataSource 互換リストを返すには、以下を使用します。

return db.Events.Select(c => new EventData() { EventID = c.EventID, Title = c.Title })

古い SQL-to-C# コンストラクトを使用してこれを実装する場合、Command クラスを作成し、EventID パラメーターを追加して ("@EventID" 引数を記述する文字列を使用)、SQL クエリ文字列をコマンドクラス、コマンドを実行し、(cast-type)nwReader["FieldName"] を使用して、返された各フィールド値を取得し、EventData クラス (yuck) の新しく作成されたインスタンスのメンバーに割り当てます。

だから、人々は Linq/SubSonic/etc を好むのです。そして私は同意します。

しかし、全体像を見ると、間違っていることがたくさんあります。私の感覚では、Microsoft も何か問題を認識しているため、Linq to SQLを廃止し、人々を Linq to Entities に移行させようとしているのです。ただ、マイクロソフトは悪い賭けに賭けていると思います。

それで、何が悪いのですか?

問題は、Linq to Sql を見て、それが真のデータ管理ツールではないことに気付く、特に Microsoft のアーキテクチャ宇宙飛行士がいることです。 . これは、Linq to Entities の背後にある野心、Linq の革新的な性質 に関するブログ投稿、さらにはLinqPad の挑戦に表れています。

そして、それに関する問題は、SQL が問題であると想定していることですつまり、軽度の不快感 (SQL と C# の間のインピーダンスの不一致) を軽減するために、Microsoft は、バンドエイド (Linq to SQL など) がうまく機能する場合に、宇宙服 (完全な分離) に相当するものを提案しました。

私が見る限り、開発者はリレーショナル モデルを習得し、それを開発作業に賢く適用するのに十分なほど賢いです。実際、Linq to SQL、SubSonic などはすでに複雑すぎます。学習曲線は、SQL 自体を習得することとそれほど違いはありません。近い将来、開発者はSQL とリレーショナル モデルを習得する必要があるため、現在、 2 つのクエリ/CRUD 言語の学習に直面しています。さらに悪いことに、Linq は多くの場合テストが難しく (クエリ ウィンドウがありません)、実行している実際の作業から 1 つのレイヤーを削除し (SQL を生成します)、次のような SQL 構造のサポートが (せいぜい) 非常に不器用です。日付処理 (DateDiff など)、「Having」、さらには「Group By」。

代替手段は何ですか?個人的には、Linq to Entities のようなデータ アクセス用の別のモデルは必要ありません。Visual Studio で単純にウィンドウをポップアップし、SQL を入力して検証し、ボタンを押して C# クラスを生成または補足し、呼び出しをカプセル化することをお勧めします。あなたはすでに SQL を知っているので、次のように入力することを好まないでしょうか。

Select EventID, Title From Events Where Location=@Location

最終的に、A) プロパティとして EventID および Title フィールドが含まれ、B) 'Location' 文字列を引数として受け取り、List<EventData>? オブジェクト モデルについては慎重に検討する必要がありますが (上記の例は明らかにそれを扱っていません)、インピーダンスの不一致を排除しながら SQL を使用するという基本的なアプローチは、私にとって非常に魅力的です。

問題は次のとおりです。私は間違っていますか? Microsoft は SQL インフラストラクチャを書き直して、SQL やリレーショナル データ管理をこれ以上学ぶ必要がないようにする必要がありますか? この方法で SQL インフラストラクチャを書き直すことはできますか? それとも、パラメーターを設定してデータ フィールドにアクセスする手間を省くために、SQL の上に非常に薄いレイヤーを配置するだけで十分だと思いますか?

更新2 つのリンクをトップに宣伝したかったのは、それらが私が求めているものの重要な側面を捉えていると思うからです。まず、CodeMonkey は「The Vietnam of Computer Science」というタイトルの記事を指摘しています。 読み始めるのに少し時間がかかりますが、非常に興味深い読み物です。次に、AnSGri は Joel Spolsky の著名な作品の 1 つであるThe Law of Leaky Abstractions を指摘しています。トピックとは正確には一致しませんが、近く、素晴らしい読み物です。

更新 2: ここには多くの優れた回答があり、「正しい」回答の選択は純粋に主観的ですが、ocdecio に「回答」を与えました。この場合、彼の答えは、現在のテクノロジーの状態を考えると、本当にベスト プラクティスであると私が考えるものと一致しています。ただし、これは進化することを完全に期待している領域であるため、状況が変わる可能性があります. 貢献してくれたすべての人に感謝したいと思います。思慮深い回答をしてくれたと思うすべての人に賛成票を投じました。

4

24 に答える 24

45

はじめに、私は根っからのデータベースのやつだと言っておきましょう。

全体的な過度の一般化として: 開発者は SQL を知りません。開発者は実際には SQL を知りたくありません彼らはそれを書くことができ、テーブルを設計することができますが、それは彼らを不快に感じさせます. 必要なクエリが単純な結合以上のものである場合、彼らは愚かなことをする傾向があります。開発者が愚かだからではありません。彼らは、1 つの概念空間だけを扱う必要がある世界に住むのが好きです。オブジェクトからテーブルへの移動とその逆は、彼らが支払いたくない価格を切り替えるコンテキストです。

これは、それらが悪い、または間違っているという意味ではありません。それは改善の機会があることを意味します。顧客 (この場合、フレームワークを使用する開発者) が SQL とテーブルを好まない場合は、根本的な混乱に対処せずに済むようにするための抽象化レイヤーを提供します。

これは、ガベージ コレクションや自動メモリ管理が大ヒットした理由と同じロジックです。はい、開発者は対処できます。はい、それなしでより最適化されたコードを書くことができます。しかし、それに対処する必要がないことで、彼らはより幸せになり、生産性が向上します。

于 2009-01-19T19:37:20.647 に答える
36

ORM の人気は、開発者がデータ レイヤーを開発し、同じ CRUD コードをアプリケーションごとに何度も繰り返し作成したことによって生み出されたと思います。ORM は、開発者が同じ SQL ステートメントを何度も記述する時間を減らし、アプリケーションのロジックに集中できるようにするツール/テクノロジの 1 つです (うまくいけば)。

于 2009-01-19T19:28:31.787 に答える
18

少なくとも 6 年間、私は非常に単純な概念である射影に基づく独自の ORM を使用してきました。各テーブルはクラスに投影され、SQL はクラス定義に基づいてオンザフライで生成されます。それでも SQL の知識が必要ですが、90% の単純な CRUD を処理し、接続などを管理する必要はありませんでした。また、主要な DB ベンダーで機能しています。

私は自分が持っているものに満足しており、それを落とす価値のあるものは何も見つかりませんでした.

于 2009-01-19T19:35:45.143 に答える
12

IMHO、OR/M は、「SQL を抽象化する」、SQL を非表示にする、またはマルチ DBMS サポートを有効にするだけではありません。

退屈な CRUD SQL クエリの作成に費やす時間が減るため、問題のドメインにより集中することができます。一方、適切な OR/M を使用している場合、この OR/M を使用すると、必要に応じて SQL クエリを記述できるようになります。

OR/M は、適切に使用すれば強力なツールになります。遅延読み込み、多態的なクエリ/関連付けを処理できます...
誤解しないでください。プレーン SQL には何の問題もありませんが、(よく考えて正規化された) リレーショナル モデルを表現力豊かな OO/ドメイン モデルに変換することに気を配る必要がある場合は、配管作業に多くの時間を費やしていると思います。

OR/M を使用しても、開発者として SQL の知識がまったくないというわけではありません。その逆は本当です。
SQL を理解し、効率的な SQL クエリを作成する方法を知っていれば、OR/M を適切に使用できるようになります。

また、NHibernate を念頭に置いてこれを書いていることも認めなければなりません。これは私が atm を使用している OR/M であり、Linq to SQL または Linq to entities を (まだ) 使用していません。

于 2009-01-19T22:23:58.283 に答える
10

Linq の設計とエンティティ フレームワークへの linq は、確かに orm ツールとして使用されますが、大きなアイデアは、RDBMS だけでなく、任意のデータ ソースをクエリするための共通 A​​PI として使用されることです。

linq は、明らかに SQL を念頭に置いて設計されていますが、任意のデータ ストアのクエリ言語であることを意図していると読んだことを覚えています。SQL 用の linq クエリを作成できますが、理論的には、ldap、ファイルシステム、交換、Web サービス、および無限を対象とする linq クエリを作成することもできます。これらのプログラムには SQL を使用できません。

また、ほぼすべてのデータ ストアに対して異なる API を学習する必要があります。Linq は、データ アクセス API を作成するための共通のターゲットを全員に提供します。

このビジョンが機能するかどうかはまだわかりませんが、それがアイデアです。システムがますます相互運用することを望んでいるので、l2e の非常に優れた用途を見つけることができると思います。

参考文献を見つけたらまた追加します。

http://laribee.com/blog/2007/03/17/linq-to-entities-vs-nhibernate/

于 2009-01-19T21:18:40.990 に答える
9

100%同意します。これの多くは、手続き型コーディングのスキルと SQL コーディングのスキルが大きく異なるという事実の結果です。そして、この事実は広く認められていません。そのため、その実現が実現するまで、プログラマーは自分のスキルセットをあるドメインから別のドメインに移転できるようにする方法を探します。

うまくいきません。

フェーズ シフトの方法を学ぶ必要があるだけです。アドレス指定するドメインに応じて、コードについて異なる考え方をする方法を学びます。

SQL から LINQ にマップされると、クエリがどれほど複雑で冗長になるかに気付いた人はいますか? たとえば、オンラインのすべての例で?

于 2009-01-19T19:37:53.953 に答える
9

心配するのをやめて、ORM を愛することを学ぶべきです。このような抽象化は、スキルに集中し、この分野で進歩を遂げるのに役立ちます。

獲得した機能的スキルを活用し、アプリケーション層に適用する余地はまだ十分にあります。これは実際、他の ORM に対する LINQ to SQL の強みの 1 つです。

私は他のコメントの多くに同意することしかできません。節約した時間で、ドメイン モデルの改良とより優れたアプリケーションの作成に集中できます。そして、ボトルネックを特定したら、最適化された SQL を作成するために使用します。

すぐにはわからないかもしれませんが、ORM には多くの優れた機能が備わっているということです。何度もアイテムをロードするのを避けるのに役立つ ID マップ、遅延ロードは少ない配管でドメインを表現するのに役立ち、作業単位は変更を追跡してデータベース書き込みを最適化するのに役立ちます。

于 2009-01-19T19:54:53.107 に答える
7

Dmitriyが指摘したように、開発者は SQL を知りません。より正確には、大多数はSQLを知っていますが、理解していませんし、明らかに好きではないので、魔法の弾丸を探す傾向があり、Linqのようなものが彼らが持っていない幻想(ええと、抽象化)を作るための需要を生み出しています.最愛のクラス以外のものを使用しないでください。

漏れやすい抽象化の法則は常に成り立つため、これは非常に悪いことです。

一部の ORM ソリューション (JPA/Hibernate など) は間違いなく優れていますが、それらを使用すると SQL について心配する必要がないからではありません。実際、JPA を効果的に使用するには、DB 全般、特にクエリ機能について非常に深い理解が必要です。良い点は、データベース全体をゼロから自動生成するまで、マシンに退屈な作業を行わせることです。

私が思うに、Linq to SQL は実際の問題を解決しません。それは一種の別のプレゼンテーションであり、それ以上のものではありません。すでに複雑な言語を過度に複雑にしますが、それは良いことかもしれません。一方、Linq to Objects は、コレクションに対して SQL クエリを実行するようなものなので、非常に興味深い概念です。

于 2009-01-20T05:14:41.510 に答える
6

歴史的視点。

コッドら。アル。もともとリレーショナル データベースの理論と実装に取り​​組んでいましたが、まったく別の問題の 1 つは、「これらのクエリをどのように実行するか」でした。さまざまな長所と短所を備えた多くの戦略と構文が提案されました。それらの候補の 1 つは SQL (明らかに最も初期の形式) でした。もう 1 つは QBE (Query By Example) でした。もう1つは「quel」と呼ばれていたと思います。他にもいくつかありました。SQL は他のすべてのものよりも優れていると評価されていたので、SQL が支配的になったわけではありません。残念ながら、他のものはほとんど姿を消し、私たち全員が貧困に陥っています (同じデータで同時に使用できるため)。

マイクロソフトがこれらの他の言語のいずれかを復活させている、または価値のある追加を発明したという良い話がある場合は、耳を傾けることをお勧めします. しかし、これまでのところ、「One Ring To Rule Them All」をもう 1 つ見ただけです。

SQL の背後には、非常に多くの考えと厳密さがあり、多くの実証済みの耐久性があります。マイクロソフトには、明らかにトップグレードの開発組織が、集合的な制度的記憶を含め、私たちの残りの部分を凌駕できると信じてきた一定の歴史があります。そのように機能することはあまりないようです。リレーショナル データ ストアに縛られている限り、同等またはそれ以上のパフォーマンスが約束されているベア メタルから遠ざかるスーパーセットの抽象化パラダイムについてよく考える必要があります。

于 2009-01-19T19:51:52.223 に答える
5

私自身 ORM プロジェクトの作成者であるため、このような質問に対する私の回答は少し偏りがちであることを認めざるを得ません。質問を読む前に、答えについて自分の考えをいくつか展開しているので、すでにある程度固定されています。

私が ORM を開発した理由は、SQL と命令型プログラミングの間の「インピーダンスの不一致」のためではなく、データベースプラットフォームにとらわれないようにするためだけだったと言えます。永続性を管理するためにより多くのコードを書かなければならないという以前の問題は小さなハードルであり、1 つのデータベース ベンダーのみを使用する場合は簡単に解決できます。データベース プラットフォームにとらわれないようにすることは、はるかに困難な問題であり、imo は、私のように他の人にソフトウェアを販売することを計画している (社内で使用するだけではない) と仮定すると、ビジネスの収益性に大きな影響を与えます。

数年前に ORM ツールに取り組み始めたとき、そのコンセプトは私の好みの言語では非現実的でした。私が話したほとんどの人は、なぜ私が ORM ツールに取り組んでいるのかを理解していませんでした。業界誌では、私がすでに行ったことは不可能であるだけでなく、望ましくないと述べています。同じ理由のいくつかが挙げられました - 複雑すぎる、制限がある、オーバーヘッドが追加されるなどです。今日、同じコミュニティには、少なくとも 3 つの一般的なデータベース抽象化ツールがあります (ただし、ORM という用語の定義については議論があります)。これについて言及する理由は、私がこれらのツールに取り組み始めたとき、当初の反対意見が現在よりもはるかに重要だったからです。ハードウェアとソフトウェアの両方の基盤となるテクノロジは、これらのツールを長期的により実用的なものにするために、その間に変更されました。私の傾向は、ソフトウェアを長い目で見て、まだ実用的ではないかもしれないがすぐに実用化されるソリューションに取り組むことです。そのため、LINQ to Entities を特定の問題の優れた解決策として数えることはしません。

また、選択肢を減らすよりも増やすことを好む傾向があります。したがって、私は LINQ to Entities の開発の背後にあるアイデアを支持するかもしれませんが、LINQ to SQL が利用可能になったという理由だけで LINQ to SQL を廃止することを支持する傾向はあまりありません。オブジェクトは、オブジェクトが行うことを行うのに最適です。それについては疑問の余地はありません...私の(再び偏った)意見では、人々が特定のツールまたはソフトウェアのパラダイムを「魔法の弾丸」と見なし、すべてのことを主張したいという点で問題が発生しますそうでなければなりません。リレーショナル データベースが特定の他のタスクを処理するのに非常に優れていることはよく知られています。レポートはその良い例です。したがって、私の意見では、すべてがエンティティでなければならないと主張するのは、自分自身を傷つけているようなものです。なぜなら、仕事のために非効率的なツールを使用することを余儀なくされているからです。特にレポートに関しては抽象反転アンチパターン。

したがって、私の答えの概要は次のとおりだと思います。問題が釘の場合はハンマーを使用し、問題がネジの場合はドライバーを使用します。

于 2009-01-19T21:07:11.557 に答える
5

開発者が SQL を好まないという Dmitry の声明には多くの真実があるかもしれませんが、解決策は ORM だけではありません。解決策は、開発チームの一員として開発 DBA を雇うことです。私の会社では、私の .net 開発チームには優れた Oracle DBA がいて、本番 DBA の仕事はまったくしていません。私たちのチームでの彼の役割は、データ モデリング、物理データベースの設計、ストアド プロシージャの作成、データ分析などです。すべての DB アクセスは、ストアド プロシージャを介して行われます。

開発 DBA とは何ですか? http://www.simple-talk.com/sql/database-administration/what-use-is-a-development-dba/

于 2009-01-25T02:28:25.277 に答える
4

データベースを拡張時に実行する場合は、データベースリレーショナルモデルのベストプラクティスに従って設計および正規化する必要があります。

オブジェクトモデルとORMにデータモデルを指示させると、正規化されていないか、オブジェクトモデルからのアーティファクトが含まれている貧弱なデータモデルになってしまいます。

1テーブル=1クラスは悪い考えです。

まず、多対多または多対1のリンクテーブルを表すクラスはありません。これらはオブジェクトモデルの子コレクションに対応します。リンク自体はオブジェクトではありません。

データベースをテーブルとして扱い、オブジェクトを行に保持するだけで(1つの一般的なアプローチ)、アプリケーションにテーブルへの直接アクセスを許可すると、データベースが保護に使用できるデータベースサービスのインターフェイスレイヤーを定義することのすべての利点が失われます。その周囲。

ORMにはその場所がありますが、オブジェクトモデルで設計されたとおりにオブジェクトを単純に永続化するために使用する場合、データベースはリレーショナルデータベースではなく、ETL、レポート、リファクタリングなど。

于 2009-01-25T01:57:26.273 に答える
4

私はデータベースと分散アプリケーション プログラミング (Web およびコンパイル済み) の両方を行っており、ストアド プロシージャ ベースのデータ アクセス レイヤーの開発に時間をかけることは、時間の無駄だと感じています。個人的には、データ モデリングを行い、開発プロセスの早い段階で必要なプロシージャを特定することを好みます... 設計/インターフェイス ロジック/構造の問題を明らかにするのに役立つようです。

私はインライン データベース プログラミングの大ファンではありません (SQL コードが手作業で生成されたものであれ、機械で生成されたものであれ)。データベースはアプリケーションの基盤であり、時間をかけてストアド プロシージャを手作業でコーディングすることには価値があると私は信じています。

そうは言っても、私は OODBMS の概念に興味をそそられており、いつか実稼働環境でいくつかの作業を行えるようになることを望んでいます。

于 2009-01-19T20:55:02.863 に答える
3

ORM 全般について尋ねる別の質問がここにありました。インピーダンスの不一致がそれほど大きな問題であるかどうかについての詳細な議論については、それをチェックしてください.

于 2009-01-19T19:37:41.287 に答える
3

彼らが必要としていた本当の解決策は、SQL リテラルのようなものだったと思います。VB.Net 9.0 はXML リテラルをサポートしています。これにより、XML をコードに正しく記述し、検証済みで DTD を満たしていることを確認できます。同様に優れた機能として、.Net コードにインライン SQL コードを記述し、IDE で検証できるようにする SQL リテラルがあります。データベースに対して情報を検証するには、ある種のプラグイン アーキテクチャが必要ですが、それは一般的なデータベース エンジン用に簡単に作成できます。これは、最適ではない解決策に頼ることなく、彼らが解決しようとしていた問題に対する本当の解決策であると私が考えるものを提供するでしょう.

于 2009-01-19T19:37:44.343 に答える
3

現在の解決策はどれも好きではありませんが、選択肢が少ないよりも選択肢が多いほうが好きです ;-)

私はずっと前にプロジェクトで OODBMS を使用しましたが、それはそれを正しくするのに最も近かったです (残念なことに、製品にはいくつかの凶悪なバグとひどい技術サポートがありました) - オブジェクトの永続性はほとんど目に見えず、舞台裏で処理され (プリプロセッサコードジェネレータを介して) 制御されていました。非常に単純な Update、Delete、および Find メソッドと単純なコンテナーによって。

ネイティブのマルチオブジェクト クエリ言語として OCL (オブジェクト制約言語) を使用して、これをもう一度見たいです (おそらく、一部のオブジェクト エンティティ モデルは既にこれをうまく行っています)。

于 2009-01-19T19:31:12.920 に答える
3

これらの背後にあるロジックは、フレームワーク層で SQL ステートメントを構築して実行するオーバーヘッドが、システムの他の部分のオーバーヘッドと比較して取るに足らないということだと思います (たとえば、HTTP 要求の往復は桁違いに長くなります)。

利点 - 迅速な開発、エスケープされた文字列ではなく言語に適合するクエリなどは、多くの場合、欠点を上回ります。パフォーマンスが問題になる場合は、後で最適化できます。

「SQLを知らなくてもいい」というのは、要因ではないと思います。まともな開発者は、開発のある時点で SQL を知る必要があります。データベース抽象化レイヤーのアイデアは、データベース クエリのボイラープレート コードを生成する労力を取り除くことです。

実際、私たちの Java のシステムでは、注釈付きのクラスを取得して完全な CRUD API を生成し、時間の経過とともに拾ってきた風変わりなものをすべて処理するコード ジェネレーター ユーティリティを作成しました。DAO の作成に苦労するよりも、モデルを作成して注釈を付ける方がはるかに簡単です。このようなツールをスケールアップすると、LINQ や Hibernate、またはその他の無数の ORM DB ソリューションが完成します。

于 2009-01-19T19:36:45.703 に答える
3

Codemonkey は非常に優れた点を指摘しています。ストアド プロシージャは、より複雑な ORM モデルの約束の一部を満たす抽象化のレベルを提供します。これは一見直感的ではありませんが、自分のコードから例を思いつくことができます。十数近くのテーブルにアクセスする「チェックイン」sproc があります (この ID は誰のものですか? 彼らはメンバーシップを持っていますか? メッセージはありますか? このチェックインでポイントを獲得しますか? など)。

これを C# でモデル化することは、データ モデルがどれほど洗練されていても、データをチェックしてさまざまなテーブルを更新するために「ネットワーク経由で」何度も移動する必要があるため、決して良い考えではありません。Linq やその他の ORMS で sproc を処理できるのは事実ですが、必要なのは、標準の C# パラメーターを使用して sproc を呼び出すことができるラッパー クラスだけです。実際、これは私にとって非常に差し迫った必要性であり、そのようなラッパーを作成するために T-SQL でコード ジェネレーターを作成しました。

于 2009-01-20T00:29:00.463 に答える
2

ORM ツールの急増は、主に SQL の記述、使用しなければならない DB ドライバーの処理、DB 間の内部抽象化 (Oracle と SQL Server、コードの再利用性のためのもの)、およびデータ型の変換の煩わしさから生じていることに同意する必要があります。 .

理想的な解決策?間違いなく!ただし、これは、アプリケーションをデータ ストアとより適切にマージするプロセスの繰り返しだと思います。結局のところ、ほとんどの場合、どの言語で記述されたアプリケーションにもアクセスせずに DB を使用することは、実際には役に立ちません。(本当に oracle をインストールするだけで、すべての従業員が SQLPlus で直接作業することを期待できますか?)

そのため、データ ストアとアプリケーションは、アプリケーション開発者がデータ ストアをより簡単に操作できるように、一緒に動いているだけだと思います。

特に .NET の場合、Linq の代わりに見たいのは、クラス定義を基になるデータ ソースに基になるデータ ストアにマップし、すべての配管を機能させる組み込みの方法です。

つまり、「Employee.Name = 'rally25rs';」と言えます。オブジェクトのプロパティが変更され、その下でデータ ストア自体に永続化されます。Linq to SQL のように 1/2 の道を行くのではなく、SQL を完全に捨ててください。

もちろん、そのようなソリューションは、パフォーマンス、トランザクション処理などの問題を引き起こします.

プログラミング言語とリレーショナル データベースの概念全体を再考し、再調整する必要があるのではないでしょうか? 本質的に、それらは完全に分離されたばらばらのエンティティです。たぶん、「リレーショナルSQL対応データベース」を捨てて、次のものを構築する時が来たのかもしれません。コード行を実行すると、データベース上で直接動作します。

于 2009-01-19T20:11:07.507 に答える
1

linq には問題はありませんが、それを使用して「舞台裏」で何が起こっているかを無視する人には問題ありません。

私は今でも、SQL で手を汚すことを好みます。少なくとも、何が起こっているか正確に知ることができます。

于 2009-01-19T19:43:29.370 に答える
1

私はちょうどこの質問を発見しました。今ではほとんどプレイ済みだと思いますが、とにかく 2 セントを投入します...

明らかでないことだけをコードで書きたい。

CRUD コードは明らかです。書きたくない。したがって、ORM は良い考えです。

これは、ORM に問題がないという意味ではありませんが、問題は意図ではなく実行にあります。ORM が成熟するにつれて、問題は減少し、単純なシナリオですでに得られている生産性の向上は、最終的には複雑なシナリオにも拡大します。

LINQ も良いアイデアです。他の人は多くの利点について言及していますが、列の数を事前に知らなかった LINQ で初めてピボットを実行しようとしたときのことを考えてみてください。DataViewまたは、何かを並べ替えたりフィルタリングしたりするたびに新しいものを作成する必要がないことに初めて気付きました。LINQ を使用すると、SQL と C# の間で作業を分割する方法を理解する必要がなくなり、C# でデータを処理したいことをすべて実行できるようになります。

そうです、ORM、LINQ、およびその他の新しいテクノロジは次善のソリューションですが、重要な点を見逃すことはありません。

于 2010-02-02T07:02:37.457 に答える
1

ほとんどの人は重要な点を見落としています。ほとんどの場合、SQL よりも LINQ でクエリを実行した方が生産性が大幅に向上します。その理由について記事を書きました

LINQPad チャレンジを設定したとき、冗談ではありませんでした。ほとんどのクエリは、SQL よりも LINQ の方がすばやく確実に記述できるため、ほぼすべてのアドホック クエリを LINQ で実行しています。また、LINQ to SQL を使用して大規模なビジネス アプリケーションを設計および開発した経験もあり、生産性が大幅に向上しました。これは「アーキテクチャ宇宙飛行士」のようなものではありません。LINQ to SQL は、まさにこのサイトを推進する生産的で実用的なテクノロジです。

LINQ の最大の障害は、LINQ を適切に学習できないことです。これを裏付けるために、SQL クエリをひどく音訳した LINQ クエリをたくさん見てきました。SQL の知識だけを使用して LINQ クエリを記述した場合、最終結果は SQL と同じか、それよりも悪くなります。

于 2009-05-05T10:24:21.653 に答える
1

Ted Neward は、この主題に関する彼の見解について素晴らしいエッセイを書きました - ORM はコンピュータ サイエンスの「ベトナム」です...

http://blogs.tedneward.com/2006/06/26/The+Vietnam+Of+Computer+Science.aspx

于 2009-01-19T22:04:06.607 に答える
0

これを@SquareCogの返信への返信としてここに書きたかったのですが、-1836文字が残っていると言われました。だからここでnoobは、私がこれを間違ってやった場合はお詫びします。


18世紀には、レジャーの紳士が科学を勉強していました。当時、科学全体はそれほど大きな主題ではなかったので、適度に知的な人はそれをすべて理解することができませんでした。つまり、1人の学んだ仲間が、当時の科学的思考全体を理解できたということです。

時が経つにつれ、何百もの新しい科学分野が発見され、それぞれが研究されて、最近では、単一の完全な科学分野全体を理解できる人はほとんどいません。

つまり、プログラミングです。

最近のプログラミング言語の分野は十分に大きく、急速に成長しているため、開発者が自分の専門言語全体を知ることは合理的に期待できます。熟練したコーダーがデータベース設計、ネイティブSQLのニュアンス、さまざまなデータベースでの動作方法、それらのデータベースの管理など、データベースフィールド全体を理解することも期待されるため、少し多くのことを求めている可能性があります。

ここでの回答者の中には、大規模なパフォーマンスの高いエンタープライズレベルのデータベースを開発する際の複雑さのいくつかを理解している人もいると思います。そのため、ほとんどの大規模なソフトウェアハウスにはデータベース開発者の専用チームがあります。Stroustrupが言うように、「分割統治」は、大規模なソフトウェアプロジェクトの開発と管理に固有の複雑さに効果的に対処する唯一の方法です。

開発者は、SQLを使用することを嫌いではありません。なぜなら、SQLは怠惰であるため、または「不快」に感じるためです。彼らは賢いのでSQLでの作業を嫌います。彼らは、SQLを専門とする人だけが最高品質のデータベース機能を提供し、彼らが「あらゆる業界のジャック」開発者になる立場に立つことは、次善の開発戦略であることを誰よりもよく知っています。

于 2011-05-25T22:10:41.680 に答える