SQLを記述する必要はまだありますか?


12

最新のほとんどの言語用の非常に多くのORMツールがありますが、それらをサポートする言語/環境で、プログラムでSQLを記述および実行するためのユースケースはまだありますか?もしそうなら、なぜですか?

わかりやすくするために、プログラマがSQLを知る必要があるかどうか、またはデスクトップにSQLツールを用意する必要があるかどうかについては質問していません。ORMではなく、コード(または構成など)に含める理由を具体的に尋ねています


ORMは動的クエリを処理できますか?ほとんどのORMでは、問題なくwhere句を変更できることを知っています。しかし、SQLステートメント全体をその場で変更できるものはありますか?私はそれが無力であり、生のSQLがおそらくより扱いやすい場所でいくつかの用途を知っています。
トニー

短い答え、はい。
ガベ。

回答:


35
  • 手続き型コードを書くよりも、データをクエリするSQLの方が快適です。
  • ORMは見た目は美しいですが、いくつかの重要な領域で恐ろしく遅いSQLを生成します。
  • ORMを介して利用できない/利用できないRDBMSによって公開される機能を利用する必要があります。
  • 入力するたびにSELECT * FROM...、神は子猫を殺します。そして、あなた子猫が嫌いです。
  • ORM、OOP、または最新の言語を使用していません。

8
すべての正当な理由。しかし、効率は私のナンバーワンです。特定の状況では、ORMが言ったように、手で最適化して微調整できるSQLを生成します。
クリス

20
私がすでに英語で言いたいことを知っているなら、なぜフランス語を書き、それを英語に翻訳するブラックボックスに通すのですか?正しい英語を作成することを期待して、フランス語を操作するのではなく、自分で雄弁に書きたいと思います。
マイクM.

8
キティ死ぬ!
jellyfishtree

3
私はフランス語と英語をネイティブで話します。類推は非常に良いです:あなたはメインメッセージを運ぶことができますが、微妙なニュアンスは失われます。微妙なニュアンスは、ボディーランゲージのように振る舞い、暗黙の位置を示すため、より重要な場合があります。私はSQLを書くことを好みます。
クリストファー

2
漏れやすい抽象化はさておき、ほとんどのORMにはプレーンSQLクエリよりも多くの利点があることを忘れているようです:1次および2次キャッシュ、遅延読み込み(N + 1の問題を回避するためのオプションである積極的な読み込み)ほんの数...名前を付けるために、(インメモリデータベースのDBMSを切り替えることにより)データアクセス層を-test
rsenna

15

複雑なSQLの作成

ORMは基本的なものに最適です。ただし、複雑な状況では、SQLを作成する必要があります。

つまり、要するに、SQLの必要性は最も確かであり、常にそうであり続けるでしょう。


1
私は最近、同僚のプロジェクトを書き直しました。彼のC#プロジェクト(2つのデータアクセスレイヤーを含む)の9つを、単一の150行のSQLスクリプトに置き換えました。プロジェクト(SchemaLogicからSharePoint 2010のマネージドメタデータサービスにデータをインポートした)の実行には、15分ではなく3分かかります。
アント

百パーセントは同意します。大規模な機関の実際のビジネスアプリケーションでは、常に複雑な状況が発生します。
リックヘンダーソン

10
  • 視聴回数
  • トリガー
  • 制約
  • パッケージ(SSIS、DTSなど)
  • 実行フローを正確に制御する必要があるときはいつでも

ORMは、データベースの構築、調整、自動化を支援しません。すべてのことを行ったら、データベースと対話する代替方法を提供します。


私は同意しますが、質問は、DB作業を行う必要があるかどうかではなく、C#(たとえば)コードにSQLが必要かどうかです。ORMは、これらのほとんどを覆います。
C.ロス

@c。rossはい、それは確かに一般的なケースではありません。私のキャリアのある時点で、これらのすべてをコードを通して構築/変更/解析する理由がありました。コードでこれらのことを行う理由がない場合は、そうしませんが、スキーマ操作で非常に良い仕事をするORMを知りません。実行フローの正確な制御は、ほとんどの人にとってより一般的なケースですが、それが必要でない場合もあります。また、ORMを最上位に置くこともできます。ORMを怒らせるほどスキーマを変更しない限り、これらの多くの場合に当てはまると思います。
ビル

4

承知しました:

  • 通常、ORMは多くをカプセル化しますが、最終的には舞台裏で何が起こるかを知っておく必要があります。これは、パフォーマンスとスケーラビリティにとって重要です。アプリケーション内ではあまりSQLを記述しませんが、SQLまたはDDLがどのように見えるかは大体知っています。
  • 多くの場合、直接SQLは読み取り専用クエリを作成するのに適しています。ORMクエリ言語で作成する方がはるかに簡単で、結果セットを制限することもできます(たとえば、「select id from .....」)。
  • ORMは、SQLからユーザーを遠ざけるべきではありません。DBクライアント(mysqlクライアントなど)でアドホッククエリに直接SQLを使用します。非常に優れた統一されたインターフェイスとグループ化機能を提供します。

4

ORMは、一般的なリレーショナルDB実装とOO言語機能間のインピーダンスの不一致により存在します。それらは単なる橋ですが、ほとんどの人はSQLを冷蔵庫の中のリンブルガーチーズのように扱います。

SQL /ストアドプロシージャ/ビューをファーストクラスのインターフェイスとして扱うのではなく、常にORMまたは他の抽象化されたデータアクセスレイヤーを使用するという正当な理由がある場合は、SQLに触れずに済ませた方がよいでしょう。

実際には、最終検証のためにデータベースを照会するために少なくともSQLを必要としないpure-ORMプロジェクトを見たことはありません。


3

ORMは、プログラマツールボックスのツールです。彼らには独自の問題があります。以下に例を示します。

  • SQLを制御できません
  • n + 1の問題に苦しむ

2
「N + 1の問題」とは何ですか?私は慣れていないんだ...
RationalGeek

:私は、このことだと思うstackoverflow.com/questions/97197/...
アックス

2
同意しません。優れたORMを使用すると、必要に応じて生のSQLを実行できます。N+ 1の問題は通常、ルーキーの間違い(レイジーロードされたコレクションのネストループなど)であり、簡単に回避できます。
richeym

@richeym:私の頭の中に最初に浮かんだもの。他の答えは私の背中があります。つまり、ORMは単なるツールであり、生のsqlが好まれる場合があります。
トニー

3

自分が何をしているのかわかっている場合、ORMを効果的に使用して、CRUDタイプコードの多くを置き換えることができます。ただし、複雑なものにはそれほど効果的ではなく、パフォーマンスチューニングが難しく(パフォーマンスはオブジェクトをエミュレートするのではなく、データベース設計の重要な部分の1つであることは知っています)、それらはまったく恐ろしく、危険な人の手にありますSQL自体を理解したり記述したりしないでください。

また、ORMを使用して複雑なレポートを効果的に行うのは簡単ではないことも指摘したいと思います。さらに、簡単な粗雑なもので単純なSQLを学ばない場合、レポート用の複雑なSQLを作成できるポイントにどのように到達しますか?レポートの必要性がなく、多くの場合非常に複雑なものが必要なアプリケーションで作業したことはありません。

ORMは、ほとんどの場合BIまたはETLプロセスに役立ちません。また、データベース管理クエリや監査テーブル内の情報を検索したり、特定のデータベース変更セットを元に戻したりするのにも役立ちません。SQLで最も効果的に行われている多くのことがあります。データベースを照会するアプリケーションは、エンタープライズ環境でデータベースを照会する必要があるもののごく一部です。

また、ORMを使用して何かを行う方法については、ポスターがSQLで行う方法をすでに知っている多くの質問もあります。新しいことを学ぶのは良いことですが、元の方法よりも実際の利益が得られずに余分な時間と労力を費やしている場合(そしてしばしばパフォーマンスの実際の損失)、それらを現在「ファッショナブル」である以外に使用しているのはなぜですか?


2

クライアントは、レポート、エクスポート、データダンプなどのデータを返すための迅速で簡単なクエリを望み、プログラム全体が開発されるのを待ちたい場合があります。

また、優秀なSQLプログラマーは、私が使用したどのORMよりも、より高速で効率的なSQLを常に記述できます。また、多くの人がORMがストアドプロシージャを指しているだけであることがわかりました。ORMの利点を実際に無視すると、ORMは複雑なプロセスには向いていません。

また、Oracleのようなデータベースを非常にリッチで強力なプロシージャ言語で使用すると、「プログラム」を必要とせずに多くのことができます。Oracle上のPL / SQLは、非常に高速で効率的です。


1
PL / SLQは「手続き型言語/構造化照会言語」の略です。「プログラム」ではないのはどうしてですか。
クリストファーマーハン

クリストファー・マハン:そのとおりです。私が働いた会社の主な製品は、Javaコード(LOC)の約5倍のPL / SQLコードで構成されています。
user281377

0

データベースを自分で使用したい場合は、はい。私が使用しようとしたORMのほとんどは、十分ではなかったか、データベースをカバーしていませんでした。また、カバーされていないカスタムクエリをどのようにトラブルシューティングまたは記述しますか?


0

トリガーとストアドプロシージャの作成には引き続き必要です。ストアドプロシージャは、現在のところ好まれないかもしれませんが、状況によっては非常に便利です。SQLは、特に毛深い複数テーブルの結合にも必要になる場合があります。


0

はい、SQLの記述を避けることができます。しかし、代わりにHQL(またはLinq、またはDQL ...)を書くことになります!

真剣に、私はORMの大ファンであり、ほとんどの場合、純粋なSQLの使用を避けることができると思います。しかし、ORMは1つの大きな抽象化であり、すべての大きな抽象化がリークすることを覚えておく必要があります...

(ただし、N + 1の問題については、これは遅延読み込みに関連するものであり、ほとんどのORMツールにはeager-loadingを要求する方法があるため、その特定の問題を回避できます。)


0

ORMは、特定のポイントにのみ到達します。しかし、複雑な結合、サブクエリ、ユニオン、マイナス、分析関数など、非常に複雑なクエリを実行する必要がある場合があります。それがSQLを必要とするときです。しかし、すべての単純なクエリをORMに任せる場合、どのように複雑なクエリを記述することになっていますか?


0

コードに記述しなくても、データベースサーバーへのターミナルアクセスがあるときに使用できると便利です。

また、プログラミングを困難にしているもののほとんどは、私たち設定している制限内で働くことです-私たちしばしば古いコードや古いバージョンのデータベースで作業しており、私たちがどんな言語でも最新のORMライブラリをインストールする機会がありません一緒に働く。そのような状況では、任意のツールが必要になります。

残りの時間は、CRUDにSQLを必要としないかもしれませんが、SQLには、単純なSELECT、INSERT、UPDATE、および基本的なJOINクエリよりもはるかに多くのことがあります。それを使って非常に賢いことをすることができ、頻繁に使用することはないかもしれませんが、それらが何であるかを知ることは有用です。

ますます、ポストSQLの世界にいると思いますが、クラウドサービスのほとんどは非SQLテーブルストレージを使用しており、単純なCRUDタイプの作業にはSQLの全機能は不要です。しかし、それはそれを理解することに価値がないという意味ではありません。

また、もちろん、現在のものがあまり大きくない場合、誰かがより良いORMシステムを書くのに十分な知識が必要です。彼らがSQLを知っていればそれは彼らを助けるでしょう...


まさに:Oracleデータウェアハウス環境からレポートエンジンと派手なレポートを書いたので、SQLを知ることはORMの使用方法を知ることと同じではないことを強調できます。
クリストファー・マーハン

0

大規模なWebアプリケーションを構築することは完全に不要であり、必要以上にストレスと時間の浪費を引き起こす可能性があります。その理由は、大規模なアプリでは、メモリの永続化レイヤー(RAM内)を使用する必要があるためです。このレイヤーは、頻繁に使用されるDBのメモリキャッシング部分です。

動作するメモリがあまりないモバイルデバイスなどで処理する必要がある場合、プログラムされているアプリケーションがモバイルデバイス、タブレットなどで「クライアント」またはスタンドアロンアプリとして実行されている場合SQLを使用するようなことは今でも一般的であり、重要です。なぜなら、デバイスのメモリは非常に小さく、多くのことをメモリにキャッシュできないからです。


2
「大規模なアプリでは、メモリの永続化レイヤー(RAM内)を使用する必要があります。これは、頻繁に使用されるDBのメモリキャッシング部分です。-まともなデータベースもこれを行うでしょう。
マシューフレデリック

AndroidとiPhoneOSはどちらも、SQL-92準拠のデータベースシステムであるSQLiteを使用します。stackoverflow.com/questions/2011724/…を
クリストファー・マーハン

0

私が書くSQLの複雑さと量は、ORMフレームワークを適切にフックするのに十分ではありません。

(もしそうなら、月に一回SQLを書く)


0

私は、ORMツールを使用する開発者を積極的に恐れるDBAを持つ多くの大企業に出会いました。

チューニングとパフォーマンスに関与しているのはDBAです。

そして、はい、ORMツールはこのようなことを行うことができますが、ストアドプロシージャ(SQL Server)のみを受け入れ、その中で何をしているのかを質問する場所を見てきました。

また、ORMツールはひどく乱用され、SQLを自分で記述するのと同じくらい貧弱なSQLを生成する可能性があります。


ORMを使用する開発者を心配しているDBAは、コードを記述できるツールを与えられたアナリスト/マネージャー/顧客を心配している開発者に似ていると思います!
gbjbaanb

0

特筆すべき点は、DDLとデータベースの移行です。既存のものを壊さずに物事を更新するには、そのようなものを手縫いする必要がある場合があります。

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