2

私はMVCフレームワークを使用するいくつかのPHPプロジェクトに取り組んでいますが、それらはすべてデータベースからオブジェクトを取得する方法が異なりますが、SQLクエリを手作業で作成し、クエリの数。効率的なデータアクセスを得るためにMVCモデルのバランスが良いのは何ですか?

たとえば、自分のWebプロジェクト(ジュニア開発者が作成)は、ホームページを読み込むために100以上のクエリを実行します。その理由は、ある場所ではメソッドがオブジェクトをロードしますが、コードの深いところで、最初のオブジェクトに関連する他のオブジェクトをロードするためです。

これは、コードの一部ではいくつかの列の値しか必要とせず、別の部分には別のものが必要なテーブルがある場合に、人々が何をしているのかという疑問につながります。現在、同じプロジェクトでは、各オブジェクトに1つのget()メソッドがあり、何らかの理由でオブジェクトが必要なときにいつでも "SELECT *"(またはテーブルのすべての列を明示的にリストする)あなたはすべてを得る。

つまり、SELECT *がどのように悪いのかについての話がすべて聞こえますが、フレームワークに付属するORMクラスを使用しようとすると、通常はその処理をしたいと考えています。特定のSQLクエリを手作業で書いてSELECT *を使ってORMを選択することに固執していますか?私は利便性と効率の間にこだわりがあるように思えます。私が手書きでクエリを書くと、列を追加するとコードのいくつかの場所に追加する必要があります。

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

ありがとうございます。

+0

ありがとうございました!それは、私がすでに考えていたことをかなり確認しました.ORMは、高速化のために設計されたものではなく、使いやすさのために...プログラミング言語のプログラミングをダンピングし、より良いプログラマを期待しています。 :) – Poldon

答えて

2

まず、SQLとスキーマ設計に堪能であると仮定すると、SQL文からあなたを削除する抽象化層がSQLを手作業で書く効率を上回る場合はほとんどありません。多くの場合、最適ではないデータへのアクセスが可能になります。

1つのWebページを生成するだけで100問の言い訳はありません。

第2に、PHPのオブジェクト指向の機能を使用している場合は、オブジェクトの収集に適した抽象概念と、SQL結合にマップされる拡張プロパティの種類があります。しかし、重要なのは、SQL戦略に関係なく、できる限り抽象的なオブジェクトを作成することです。

PHPコードをこのように書くと、スキーマが適切でクラスが適切であれば、各Webページのデータ要件を非常に効率的なSQLクエリにマップできます。それだけでなく、私の経験では、これは実装するのが最も簡単で最速の方法です。フレームワークをPHPクラスと良い固体の薄いDAL(注:組み込みSQLやdbms呼び出しではない)の中間に置くことは、「漏れ抽象」の概念を説明するための最良の例です。

0

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

クエリーがPHPページ全体に分散しているため、テーブルがロックされて全体的なWebアプリケーションのパフォーマンスが低下し、パフォーマンスが低下するため、データベースに競合がないようにシステムを適切に設計する必要があります時間とともに。

これは、ある時点でストアドプロシージャを使用することが推奨され、必要なときにチューニングできる場合があるためです。クエリステートメントがフロントエンドにある場合、デバッグが容易であると主張するかもしれません。 100のクエリは非現実的に見える(そして多分あなたは少し誇張されている)が、

0

ませORMフレームワークでも、あなたがコードを書くORMフレームワークの作成者を持っている場合でも、スピードの観点で書かれたSQLを手に近づけませんそれは常に良い古いSQLの速度から遠くなるでしょう。フレームワークは、コードの可読性を向上してい

  • 私のアドバイスは、全体像だけでなく、スピードを見て、ありますか?

  • あなたのチームは、SQLを書いてコードと混ぜることに満足していますか?

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

  • フレームワークのクエリにはボトルネックがありますか?

は、私はPHPを使って何を開発したことがありませんが、私はあなたが本当のボトルネックとを決定することができ多分アプリの徹底プロファイリングた後、両方のアプローチ(ORM、プレーンSQL)を混ぜてできたと思います唯一の場合は手書きのSQLのORMコードを置き換えます(通常はRubyではActiveRecordを使用し、新しい遺物としてアプリケーションをプロファイリングし、複雑なARクエリを使用するとSQLを置き換えます)

Regads

0

あなたの経験を信頼してください。

あなた自身のSQLで単純なモデル関数を書くことができます。これは私がずっとやっていることであり、私はそれに満足しています。

"便利な"ものの多くは、魔法が必要な人のために書かれています。手でやることができない、または経験がないからです。

結局のところ、それはスタイルの問題です。

独自のレイヤーを追加したり、レイヤーを独自のものに拡張したり、拡張することをためらってください。それをきれいに保ち、良いデザインといくつかの文書を作って、後で戻ったときに家にいると感じるようにしてください。