web-dev-qa-db-ja.com

ORMフレームワークをよく知っている場合、SQLは重要ですか?

私はSQLに真面目な経験がなく、LINQの代わりにSQLを書くことさえ嫌いです。 ORMには十分満足しています。

雇用主とセクターの観点から、SQLを知ることは重要ですか?私はそれを習得する必要がありますか? ORMフレームワークよりも純粋なSQLを好む企業は、プログラミングの世界では「恐竜」ですか?

51
AnyOne

basicSQLしか知らない場合、実際にはしないので、これは多くのプログラマーに説明するのは困難です。 tは、ORMの松葉杖よりもはるかに優れています。ただし、より高度なSQLの概念は、で機能するアプリケーションで機能するアプリケーションの違いの重要な部分です。 =)高品質(特に、高速で信頼性の高い)。

他の誰かがdesignsデータベースを想定しているのは、thatSQLを知らなくても、見劣りするだけです。しかし、それらに対してのみ開発している場合でも、ORMが依然としてうまく機能しないか、まったく機能しない傾向があるすべての部分的なリストを次に示します。

  • 再帰的および/または階層的クエリ
  • オプションのパラメーター(特にそれらを範囲述語に変換する)
  • ユーザー定義のデータ型
  • プラットフォーム固有のタイプ(SQL階層IDとTVP、Oracle配列およびネストされたテーブルなど)
  • バッチ挿入/更新/アップサート/削除
  • インデックスのヒント
  • ロックヒント(特に更新ロックとダーティリード)
  • エラー処理
  • 外部結合-その結果セットはOOP=モデルにうまくマッピングされていません。多くのORMは独自のクエリ言語を持っていますが、SQL自体を知ることに似ています。
  • ストアドプロシージャとUDF、特にインラインUDFとCROSS APPLYクエリによるモジュール化
  • データを複数のテーブルにステージングするためのOUTPUT/RETURNINGの使用
  • 効率的ページングクエリ
  • ウィンドウ関数(行番号、ランク、パーティション)に基づくクエリ

リストはどんどん続きます-これらの多くは、初心者のDBAがやらなければならないことや、初心者の開発者が聞いたこともないことですが、大規模なアプリでは非常に重要です。

ORMは本当に退屈なSQLコードの高速化に非常に優れています-つまり、すべての反復的なCRUDとマッピングおよびその他の配管コードなので、絶対にありません。それらを使用することを恥じ、彼らが悪だと言う人の言うことを聞かないでください。 master SQLでさえ、確実に学習する必要があります。ORMが重要な役割を果たさない場合は、生のDBコマンド/クエリにドロップダウンする準備をしてください。

63
Aaronaught

絶対に! SQLは依然としてデータベースの共通語であり、ORMで多くのことを行うことができますが、ORMが行う決定とそれらが生成するSQLを理解するには、SQLを理解する必要があります。また、カスタムSQLやストアドプロシージャについても、まだ多くのことを行う必要があります。申し訳ありませんが、無料のランチはありません。

90
Otávio Décio

はい、SQLを知る必要があります。 ORMは 非常に漏れやすい抽象化 であり、SQLのすべての機能へのアクセスを提供しません。 toyアプリケーションの場合、SQLの知識は限られています。エンタープライズアプリケーションの場合、ORMから適切なパフォーマンスを得るには、データベースを理解する必要があります。また、SQLを使用すると、アプリケーション言語を使用するよりもはるかに簡単に実行できる非常に多くのタスクがあります。私はJavaプログラマーがSQLで1時間でコーディングできる何かをするためにコードを書くのに何日も費やすことを知っています。SQLの知識は、リレーショナルデータベースを使用するアプリケーションを書く人にとって非常に貴重です。

25
kevin cline

SQLスキルは、今日のITに欠かせないスキルです。 LINQはMicrosoftのみのテクノロジです。 SQLの使用法は、Webおよびクライアント/サーバーアプリケーションの開発を超えています。 SQLが苦手な場合は、データベースをモデル化してETLを実行することはできません。 OracleおよびSQL ServerでData Warehous製品に使用されているSQL方言を習得する必要はないかもしれませんが、標準SQLを知っている必要があります。 SQLの基本は単純で、始めるための資料がたくさんあります。

14
NoChance

SQLデータベースを操作する場合は、ORMが生成するSQLを理解する必要があります。 SQLデータベースに固有の概念を理解する必要があります。また、ORMでは何ができないかを理解する必要があります。 ORMは生活を楽にします(そして、はい、私は多くの場合、人なしで働くと恐竜と見なされます)が、彼らは(あなたが知っていることを抽象化する)ツールであり、松葉杖(あなたが学習するのを防ぐ)ではありません。

SQLの学習を拒否した場合は、ORMの有無にかかわらず、SQLデータベースを操作するビジネスはまったくなく、別のタイプの作業を見つける必要があります。

6

ORMが作成している複雑なものを最適化する必要があるときが来ます。その時点で、通常、分解する非常に複雑なクエリがあります。基本を学んだことがない場合、高度な知識でSQLの学習を開始するにはどうすればよいでしょうか。開始するのに十分理解していません。 SQLを理解している人の手にあるORM-優れたツール。 SQLをまったく知らない人の手にあるORM-災害の発生を待っています。

SQLがデータベースの理解に不可欠である理由の1つは、アプリケーションプログラマーがデータセットの観点から自然に考えていないことです。しかし、データベースがまったく効率的に動作する唯一の方法は、セットによる方法です。 ORMを使用する前に、セットで考える方法を学ぶ必要があります。

4
HLGEM

私は熱心なORMファンであり、長年ORMの利点を説教してきており、ORMがSQLを打ち負かす理由について多くのことを述べてきました。

だが...

SQLは現実世界で完全かつ完全に必要とされていることを認めなければなりません。すべての開発者はSQLを十分に理解している必要があります。

ほとんどの場合、SQLプロシージャはORMよりも高速です。ほとんどの場合、ORM出力を楽観的にすることもできますが、SQLプロシージャのすぐ近くにあります。

場合によっては、必要な結果を得るためにいくつかのヘビーデューティーSQLが必要になります。これらのモンスタークエリは、SQLプロシージャで作成する方が簡単で高速です。

ちょうど私の2つのビット。

4
SetiSeeker

質問をする前に、最初に少し紹介します。 ORMが大好きです。そして私はSQLが嫌いです。 ORMは、SQLのようなユーザーに不便な混乱を隠し、データベースを扱うための言語統合された素晴らしい方法を提供するので、大好きです。

ただし、SQLには多くの利点があることを認めなければなりません。クエリを実行するだけで、基になるデータベーススキーマの詳細な知識がなくても、SQLクエリの複雑さについてはほとんど議論できます。したがって、SQLを使用するときは常に警戒心があり、コンポーネントの複雑さがどこに向かっているかを常に直感しています。

一方、ORMを使用する場合、データベースの統合の容易さに圧倒され、文字通りデータベースさえも忘れてしまいます。これは何度も私を悩ませてきました。過去に何度も、私は無邪気に見えるORMメソッドを呼び出しました。舞台裏では、パフォーマンスを破壊する巨大で恐ろしいデータベース結合が呼び出されます。

それが私にとって真実がその中間にある理由です。私はORMの使用が大好きで、これからも使用しますが、より注意深く、常にORMメソッド呼び出しの影響(SQLレベルで)を研究する必要があります。抽象化レイヤーの意味を知ることは、このビジネスでは純粋な金であり、抽象化の使用を正当化します。それ以外は、足で自分を撃つようなものです。

ORMフレームワークでクエリを手動で強制することがよくあります。そして、ほとんどが独自のクエリ言語を持っていますが、それらはすべてsqlに触発されており、コードはsqlに変換されます。問題が発生した場合(発生した場合ではなく)、そのsqlを読み取ることで、発生している問題を理解する必要があります。
SQLを直接記述していない場合でも、SQLを基本的なレベルを超えて理解します(ただし、これからやるのであれば、ストアドプロシージャ、トリガーなどの記述について学ぶ必要はないでしょう)。データベースへのアクセスです)、生成されたコードを理解し、必要に応じて微調整するのに十分な言語を知っている必要があります。

3
jwenting

作成するアプリケーションだけがデータベースとやり取りする必要がある場合は、おそらく必要ありません。一部の小規模な企業や開発チームでは、いくつかのサポートが必要になる場合があります。クライアントのデータベースに接続し、いくつかのSQLステートメントを実行して、データで何が行われているのかを確認する方がはるかに簡単です。

2
JeffO

優れた成熟したORMを使用している場合でも、生成されたSQLで何が起こっているのかを理解することができれば、非効率なSQLが発生し、生活が非常に楽になる状況に遭遇することは避けられません。そうは言っても、ORMに非常に精通していて、選択したDBにプロファイラーを使用する方法を知っている場合は、「簡単にできるまで」偽造することができます。

2
user29776

これらすべてのタイプの質問に対する答え(「Xを知る必要がありますか?」)は、「初めて必要になったときに、必要に応じて学習する」ことです。

しかし、物事を効率的に行う方法を知らない、または学ぶ気がないので、物事をより効率的に行うという罠に陥らないことが重要です。

たとえば、この特定のケースでは、プログラムにバグがあり、ユーザーテーブルのPostCountフィールドが不正確になることがあるとわかった場合、どうしますか。

バグを修正し、すべてのユーザーのPostCountを更新する必要があります。どうやってやるの?

これを行うためにORMを使用して小さなスクリプトを書くと、非常に非効率になります。非常に単純なSQLクエリで十分です。

これらの状況はかなり一般的であるため、上記のトラップに陥ることを恐れています!

1
Thomas Bonini

はい、まだSQLが必要です。

「古い」ものはどういうわけか検討に値しないという仮定にジャンプしないでください。いわゆる「レガシー」テクノロジーとは、時の試練に耐えた後もまだ残っているテクノロジーです。私たちは王のコンピュータを「レガシー」とは呼びません、彼らは失敗し、なくなっています。

私の銀行がおそらくメインフレームまたはIBM iでCOBOLを使用しているのではないかと私に尋ねたら、 Absolutleyではありません。これらは、堅実で実証済みの真のテクノロジーです。彼らは主にDB2 SQLを使用しています。今月の流行の言語で開発されたソフトウェアよりも、私はそこでお金を信頼するほうがずっと幸せです。

恐竜は、この地球上で私たち人間が存在していたよりもずっと長く続いた。そして、あなたがジュラシックパークを読んだら(そう、本は映画よりも優れています)、私はあなたに尋ねます、あなたは本当にあきらめない超賢いヴェロキラプターのパックに直面したいですか? 「恐竜」を過小評価して噛まれないでください。 ;-)

1
WarrenT

私が経験したことのないゲームや(主に統計的な)研究は別として、データベースへのアクセスと操作は、間違った判断が非常に大きなパフォーマンスヒットにつながる数少ない分野の1つであるようです。私はコードでのより強力なデータベース抽象化を強く信じています。また、linqは、データベース操作をプログラミング言語に結び付け、言語のすべてのツール(型チェック、構文チェック、好きなものすべて)を提供します。あなたのプログラミング言語)あなたが望むことをするためにあなたに十分な力を与えている間、それは絶対に素晴らしいです。残念ながら、それでもまだ機能するとは限りません。つまり、抽象化レイヤーの最適化が間違っていて、結果がマイクロ秒ではなく数秒、または秒ではなく数分待機している場合があります。これらは非常に目立つ時間なので、最適化する必要があります。そうしないと、アプリケーションが「機能」しなくなります。パフォーマンスがアプリケーションの最大の問題になります。つまり、金属に近づき、手作業で最適化する必要があります。

大規模なデータセットの操作に、たとえば手作業で3ミリ秒、抽象化レイヤーで処理させると100ミリ秒かかるという点に達したときは、必ず抽象化層で処理してください。 30倍遅くなりますが、(おそらく、ほとんどのアプリケーションでは)十分な速度です。ただし、200 msの応答時間がある最適化されたソリューションを手で見ていて、抽象化レイヤーがそれを処理する場合、アルゴリズムは10倍のパフォーマンスヒットを「ちょうど」取るという状況が現実です。 2秒の遅延、それからあなたはそれがそれほど速くないから痛々しく遅くなるので、あなたは多くのことを気にします。 リレーショナルデータベースソリューションは適切に拡張されない を見て、これは2、3年で解決されるとは思いません。これは、大規模なデータベースになると、かなり長い間、ベアメタルに取り掛かる必要があることを意味します。そうしないと、アプリケーションが非常に遅くなり、競合他社に対抗できなくなります。

0
Martijn