2

私は、MVC フレームワークを使用するいくつかの PHP プロジェクトに取り組んでいます。それらはすべて、データベースからオブジェクトを取得するさまざまな方法を持っていますが、速度と数の削減に関しては、手動で SQL クエリを記述することに勝るものはないように常に思えます。クエリ。

たとえば、私の Web プロジェクト (若手開発者が作成) の 1 つは、ホームページをロードするためだけに 100 を超えるクエリを実行します。その理由は、ある場所ではメソッドがオブジェクトをロードしますが、コードの後半で、最初のオブジェクトに関連する他のオブジェクトをロードするからです。

これは、コードの一部でいくつかの列の値のみを必要とし、別の部分で何か他のものを必要とするテーブルがある状況で、人々は何をしているのかという質問の別の部分につながります。現在 (同じプロジェクト内)、オブジェクトごとに 1 つの get() メソッドがあり、「SELECT *」を実行する (またはテーブル内のすべての列を明示的にリストする) ため、何らかの理由でいつでもオブジェクトが必要になります。あなたはすべてを手に入れます。

つまり、 SELECT * がいかに悪いかという話をよく耳にしますが、フレームワークに付属の ORM クラスを使用しようとすると、通常はそれを実行しようとします。SELECT * を使用して ORM を選択するのではなく、特定の SQL クエリを手動で作成することにこだわっていますか? 便利さと効率の間で立ち往生しているように思えます。クエリを手書きすると、列を追加すると、コードのいくつかの場所に追加する必要が生じる可能性が高くなります。

長い質問で申し訳ありませんが、特定の解決策ではなく、他の開発者からいくつかの考え方を得るための背景を説明しています。Memcached のようなものをいつでも使用できることはわかっていますが、その前にできることを最適化したいと思います。

アイデアをありがとう。

4

4 に答える 4

2

まず、SQL とスキーマの設計に習熟していると仮定すると、SQL ステートメントからユーザーを除外する抽象化レイヤーが、手動で SQL を作成する効率を超えることはほとんどありません。多くの場合、最適ではないデータ アクセスが発生します。

1 つの Web ページを生成するためだけに 100 のクエリを実行する言い訳はありません。

第 2 に、PHP のオブジェクト指向機能を使用している場合は、オブジェクトのコレクションと、SQL 結合にマップされる種類の拡張プロパティを適切に抽象化できます。ただし、覚えておくべき重要なことは、SQL 戦略に関係なく、できるだけ抽象化されたオブジェクトを作成することです。

この方法で PHP コードを作成すると、スキーマが適切でクラスが適切であれば、各 Web ページのデータ要件を非常に少数の非常に効率的な SQL クエリにマッピングできることが常にわかります。それだけでなく、私の経験では、これが最も簡単で最速の実装方法です。フレームワークを PHP クラスと適切なシン DAL (注: SQL や dbms の呼び出しではないことに注意) の中間に配置することは、「漏れやすい抽象化」の概念を説明するために考えられる最良の例です。

于 2009-04-09T20:01:51.513 に答える
0

あなたの質問で少し迷ってしまいましたが、データベースにアクセスする方法を探しているなら、いくつかの方法があります。MVC は、データベース アクセスの抽象化に付属する Zend フレームワークを使用できます。それを使用できます。

また、データベース内で競合が発生しないようにシステムを適切に設計する必要があることにも注意してください。クエリはすべて php ページに散らばっており、テーブルがロックされる可能性があるため、Web アプリケーション全体のパフォーマンスが低下し、時間の経過とともに遅くなる可能性があります。

そのため、ストアド プロシージャは 1 か所にあり、必要に応じて調整できるため、ストアド プロシージャを使用する方が好ましい場合もありますが、クエリ ステートメントがフロントエンドにある方がデバッグが容易であると主張する人もいるかもしれません。

于 2009-04-09T20:03:15.507 に答える
0

ORM フレームワークは、速度の点で手書きの SQL に近づくことさえできませんが、たとえ ORM フレームワークの作成者にコードを書いてもらったとしても、100 個のクエリは非現実的であるように見えます (そして、少し誇張しているかもしれません)。古き良き SQL の速度。

私のアドバイスは、速度だけでなく全体像を見てください。

  • フレームワークはコードの可読性を向上させますか?

  • あなたのチームは、SQL を記述し、それをコードと組み合わせることに慣れていますか?

  • フレームワークのクエリを最適化する方法を本当に理解していますか? (各オブジェクトの get() は、それらを取得する最適な方法ではないと思います)

  • フレームワークのクエリ (最適化後) がボトルネックになっていますか?

私はPHPで何かを開発したことはありませんが、両方のアプローチ(ORMとプレーンSQL)を混在させることができると思います.おそらくアプリの徹底的なプロファイリングの後、実際のボトルネックを特定し、そのORMコードを手書きのSQLに置き換えることできます. (通常、Ruby では ActiveRecord を使用し、アプリケーションを新しい遺物としてプロファイリングし、最後に複雑な AR クエリがある場合は、それを一部の SQL に置き換えます)

よろしく

于 2009-04-09T20:22:52.680 に答える