0

非常に理論的な質問ですが、長期的に発展する上で重要です:

シナリオ A (一般的なケース):

  • クライアント側でクエリを作成し、サーバーに送信します。(PHP、Perl、なんでも)
  • 長所: クエリ文字列はクライアント側でのみ構築され、簡単に変更できるため、開発が迅速化されます (コードはクライアント側で変更する必要があります)。CRUDはOO(オブジェクト指向)で簡単に開発できます。
  • 短所: より大きく、より類似したクエリの場合、長いクエリ文字列を送信する必要があり、繰り返しの場合は、ネットワーク ペイロードを節約するためにそれらを準備する必要があります。(例: 多くの INSERT ステートメントを実行するインポート スクリプト/アプリ)。

シナリオ B:

  • テーブルのデータを取得または作成するためによく使用されるプロシージャをいくつか作成します。これらのプロシージャには、いくつかの一般的な入力パラメータがあり、サーバー側でクエリ文字列を作成します。
  • 長所: 短いクエリ文字列をパラメーターと共にサーバーに送信し、ネットワーク ペイロードを低くします。
  • 短所:開発には明らかに時間がかかり、クエリを一般化するための概念を作成します。クライアントは手順とそのバージョンを認識している必要があります。

意見?私が要約したことは、完全に真/偽ですか?誰かがそれを経験しましたか?

4

3 に答える 3

2

アプリケーションを開発している場合、最終状態では、アプリケーション内の唯一のクエリは、select <list of columns> from view where <whatever>適切なエラー メッセージをアプリケーションに返すストアド プロシージャへの呼び出しだけである必要があると思います。

つまり、アプリケーションの API を開発する必要があります。SQL は API ( insert/ update/ delete) を提供しますが、生の SQL はほとんどのデータベース アプリケーションに適しているとは思いません。

開発中、私ははるかに柔軟です。特定の問題を迅速に解決するには、アプリケーション側に複雑なクエリを配置する必要がある場合があります。それらはデータベースに移行するだけです。

なんで?主な理由は保守性であり、多くの面で。すべてのクエリ アクセスをビューにラップすることで、基になるデータ構造への変更からアプリケーションを保護します。結局のところ、物事は変化し、ユーザーのニーズは大きくなり、データ モデルはこれを反映しなければならない場合があります。

次に、DBA はすべてのクエリを 1 か所で確認できます。これにより、データベースとクエリの改善、統合、簡素化、および最適化の余地が生まれます。

すべてのデータ操作をストアド プロシージャに入れることで、トリガーなしでビジネス ルールを実装できます。ビジネス ルールを実装する複数のテーブル間でカスケード トリガーを使用し始める場合は特に、トリガーは非常に扱いにくい場合があります。これにより、アプリケーション側のロギングと、よりわかりやすいエラー メッセージも可能になります。

また、ビューとストアド プロシージャを使用すると、SQL インジェクションに対するかなり自然な保護が提供されます (完全ではありませんが、多くの場合)。ただし、多くのデータベースでは、ユーザーがテーブルを直接変更できないようにし、ストアド プロシージャを使用して変更アクセスを許可することができます。

于 2013-04-27T22:56:07.433 に答える
0

あなたの最初の仮定には2つの大きな欠点があります。

  1. 実際のところ、すべての HTTP 要求には、最大で数キロバイトの多数の HTTP ヘッダーが含まれています。したがって、クエリはそれほど負担になりません。複数の挿入と同じです。小さな「INSERT INTO t SET」は、どちらの方法でも HTTP リクエストにあるフィールド = 値、フィールド = 値のリテラルペアに対する無視できるオーバーヘッドです。
  2. いずれかのシナリオでセキュリティの問題について考えたことはありますか?

そして、JFYI:

テーブルのデータを取得または作成するために頻繁に使用されるプロシージャをいくつか作成します。これらのプロシージャには、いくつかの一般的な入力パラメータがあり、それらによってサーバー側でクエリ文字列を構築します

これが、少なくとも 99% の php/mysql Web アプリケーション (率直に言って、Web サイト) の仕組みです。彼らは理由でそれをするかもしれません。

于 2013-04-28T06:32:22.467 に答える