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


50

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

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


14
老いを感じる。SQLは十分に抽象化されているため、この質問に真剣に取り組むことができます。
マーク

11
@マーク:おそらく真剣に質問することができますが、答えは同じです。
アダムロビンソン

30
計算機を使用できる場合、算術を知ることは依然として重要ですか?
スティーブンA.ロウ

4
SQLプロファイラの知識がなくても、どのように使用することにその腹をくすぐるJOINを、データベースサーバー用に起こるのを待って、パフォーマンスのジハードであるNHibernateは
クリス・S

2
Dreamweaverを使用できる場合、HTMLを知っている必要がありますか?
Tulainsコルドバ

回答:


63

これは多くのプログラマーに説明するのは難しいです。なぜなら、基本的な SQL しか知らないなら、ORMの松葉杖よりも実際に多くの利点を与えないからです。より高度なSQLの概念は、しかし、ちょうどそのアプリケーションとの間の差の重要な一部であり、作業している対アプリケーションの高品質(特に、高速かつ信頼性の高いです)。

他の誰かがあなたのためにデータベースを設計していると思います。なぜなら、SQLを知らずにそれを行うことは、見た目を超えているからです。しかし、それらに対してのみ開発している場合でも、ORMがまだ不十分であるか、まったくしない傾向があるすべてのことの一部のリストを以下に示します。

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

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

ORMは、本当に退屈な SQLコードの高速化に非常に優れています。つまり、すべての反復CRUDとマッピング、およびその他の配管コードです。したがって、ORMを使用することはまったく恥ずかしくなく、悪意のある人の話を聞かないでください。しかし、あなたは間違いなく学ぶ必要があります。もちろん、マスター SQL でさえも、ORMがその重みを引いていないときに、生のDBコマンド/クエリにドロップダウンする準備ができています。


私はあなたのポイントの大部分に同意しますが、外部結合に関しては、はい、OOPにうまくマッピングされませんが、OOPの同等物(たとえばGroupJoinLINQ)ははるかに優れていると思います。
svick

@svick:用途はありますが、同じものではありません。で完全な外部結合をエミュレートしてみてくださいGroupJoin
アーロンノート

はい、同じものではありません。そして、私はあなたがほとんどの時間を必要とするものが実際にあると思いGroupJoinます SQLに慣れている人は、そうした場合にすぐに外部結合を考え、それをLINQに変換する方法を尋ねるだけです。それは正しいアプローチではありません。SQLをLINQに翻訳するのではなく、必要なものを直接翻訳する必要があります。
-svick

@svick:ヒントをありがとう。プルランクにヘイトが、年間の中断の後、私はまだ両方のためのトップの貢献者の一人ですSQLLINQの私はので、スタックオーバーフロー上のかなり確か私はアプローチの違いを理解しています。完全な結合はまれですが、実際には必要なものであり、Linqにはアナログがありません。構造化方法に関係なく、同じ結果セットを取得するのは非常に面倒で非効率です。
アーロンノート

私たちは実際に同意しているようです。ほとんどの場合、実際には外部結合は必要ありません。しかし、あなたがそうするとき、それをLINQに翻訳するのは難しいです。
svick

90

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


6
確かに。たとえば、さまざまな結合ステートメントの影響と、それがパフォーマンスにどのように影響するかを知る必要があります。
Chiron

15
+1無料ランチなし!無知は大丈夫かどうかを基本的に尋ねるすべての質問は何ですか?
ベンザド

7
@benzado:SQLに正当であるとは思いませんが、いくつかのことについて無知を選択する必要があります。本当にすべてを知るにはあまりにも多くのテクノロジーがあります(良いものであっても!)。だから、「Yを本当によく知っているのか、ZをしているのかXは不要なのか」と尋ねるのは問題ないと思う。
クレイグウォーカー

2
@Craig学ぶには余りにも多くあることに同意しますが、プログラマーは実際に自分が働いているレベル以下の基本的な知識を持つべきです。
ベンザド

2
@Craig Walkerデータベースは、ほとんどのビジネスアプリケーションにとって重要な知識です。
HLGEM

25

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


14

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


1
LINQの仕組みを知っている人なら誰でも、1日で基本的なSQLを学ぶことができます。これは、SQLを学習するためのひどい議論です。
ボリスヤンコフ

6

SQLデータベースとやり取りする場合は、ORMが生成しているSQLを理解する必要があります。SQLデータベースに固有の概念を理解する必要があり、ORMができないことを理解する必要があります。ORMは生活を楽にします(そして、そうではなく、多くの場合あなたは恐竜であるとみなされます)。

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


SQLを知ることは基本的に必須ですが、SQLを知ることは非常に有用であることに同意しますが、あなたの理由には同意しません。その理由では、プログラムを書く前にASMとCPUアーキテクチャを知る必要があります。なぜなら、高レベルの言語は物事を簡単にするが、それらは(物事を抽象化するための)ツールであるため、プロセッサの命令とアーキテクチャを学ぶことを拒否する場合、ビジネスを使用していないからですコンピュータ。<---意味がありません。あなたがそれを必要とする本当の理由は、ORMツールがまだ初期段階にあるということです。5〜10年後にSQLの知識が必要
なくなった

高水準言語は、基礎となるアーキテクチャについて知る必要がないように構築されています。ドメインは基盤となるアーキテクチャと通約可能であるため、これが可能です。ただし、ORMは別の問題です。私はORMの大ファンですが、SQL(または基盤となるDBが使用するもの)を知らなくても使用できる日が来るとは思いません。オブジェクトモデルとリレーショナルモデルは基本的に通約不可能であり、一方から他方に翻訳されない概念は常に存在すると思います。ほかに、私は将来、今日のオームズではない話している
Marnen Laibow-Koser

3
+1:「SQLの学習を拒否する場合、ORMの有無にかかわらず、SQLデータベースに触れるビジネスはまったくありません。別のタイプの作業を見つける必要があります。」
ベクトル

2
できれば、これを何百万回も支持します。彼らは、彼らの一般的な無能さと彼らがしていることに対する理解の欠如のために、SQlデータベースに触れるビジネスを持っていないあまりにも多くの人々です。彼らは、パフォーマンスの悪夢を作成し、データベースを排除するための名誉のバッジのようにSQlに無知であることに気づかずに結果を損なうレポートを書く(実際のビジネス上の意思決定が行われている)どこにでも大混乱を引き起こすそれは彼らのアプリケーションにとって重要です。
HLGEM

1
「松葉杖ではなく、ツール(あなたが知っていることを抽象化するためのツール)」の+1。
-sholsinger

4

私は非常に頑固なORMファンであり、ORMの利点を長年説教しており、ORMがSQLに勝る理由について多くのことを述べてきました。

しかし...

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

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

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

ほんの2ビットです。


4

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

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


3

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


3

質問についてお話しする前に、最初に少し紹介します。ORMが大好きです。そして、私はSQLが嫌いです。ORMが大好きなのは、SQLが持つユーザーフレンドリーではない混乱を隠し、データベースを扱うための優れた言語統合された方法を提供するからです。

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

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

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


3
また、データセットが返されたからといって、それが正しいデータセットであるとは限らないことを人々が忘れてしまうこともあると思います(通常のSQLであっても)。とにかくそれが何をしたのか本当に理解していないので、正しいことをしたと仮定すると、ORMでこれを忘れやすくなると思います。
HLGEM

ORMがSQLほど複雑ではないことに同意しません。SQLを使用すると、プログラミングなしでデータを取得できます。SQLはプログラミング言語ではなく宣言型言語なので、while、for、if-then構造はありません。
Tulainsコルドバ

1
宣言型プログラミング言語は、依然としてプログラミング言語です。SQLは特別な目的のプログラミング言語であり、はい、それは大部分が宣言的です。あなたのコメントの内容に関しては、わかりません。SQLは汎用プログラミング言語ではありませんが、依然として言語です。あなたはまだ構文、その制限と欠陥を知る必要があります。
チャラランボスパスチャリデス

2

ビルドしているアプリケーションを介してのみデータベースと対話することが必要な場合は、おそらく必要ないでしょう。一部の小規模企業または開発チームでは、サポートが必要になる場合があります。クライアントのデータベースに接続し、いくつかのsqlステートメントを実行して、データで何が起こっているかを確認する方がはるかに簡単です。


誰が彼/彼女が構築しているアプリケーションを通してのみデータベースと対話する必要があるのですか
Tulainsコルドバ

2

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


1

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

しかし、物事を効率的に行う方法に気付いていない、または学ぶ意欲がないため、物事を効率的に行わないというtrapに陥らないことが重要です。

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

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

これを行うためにORMを使用して小さなスクリプトを記述する場合、非常に非効率的です。非常に単純なSQLクエリで十分です。

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


2
私は同意します。SQLを知らない場合、多くの場合、1行のSQLクエリで実行できることを行うために数十行のコードを記述します。
ベンザド

2
re "最初に必要なときに学習":ro-che.info/ccc/11.html
MatrixFrog

1

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

「古い」何かがどういうわけか考慮に値しないという仮定にジャンプしないでください。いわゆる「レガシー」テクノロジーとは、時の試練に耐えた後もまだ存在しているテクノロジーです。私たちは王のコンピューターを「レガシー」とは呼ばず、失敗し、なくなった。

あなたが私に尋ねると、私の銀行はおそらくメインフレームでIBMを使用しているのでしょうか、それともIBM iですか?絶対ではありません。これらは、堅実で実績のある真のテクノロジーです。推測すると、彼らは主にDB2 SQLを使用しています。今月のファッショナブルな言語で開発されたソフトウェアよりも、そこでお金を信頼するほうがずっと幸せです。

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


0

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

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

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