2011-07-10 14 views
0

OOPをPHPでデータベースと一緒に使用する場合のパフォーマンスに関する質問があります。たとえば、クラスfooがあるテーブルの行を表しているとします。今、私はWebアプリケーション上の5つの異なるページでfooを使用する必要があると仮定します。PHP、OOP、データベース - パフォーマンスに関する質問

5つのページのそれぞれに、異なる列のデータを使用するというキャッチがあります。 (つまり、最初のページはcolumn1とcolumn2を使用し、2番目のページはcolumn3とcolumn4などを使用します)。

OOPのアプローチ(私が見る限り)は、特定の行のfooを初期化すると私は接続し、その行のすべての列を取得し、私のオブジェクトを構築します。私は自分のロジックを進め、必要なデータを使用することができます。

私がこれまでに持っていた問題は、手続き的なアプローチ(ウェブの場合には慣れていました)では、クエリが特別に調整されているので不要な列をダウンロードするためのリソースが無駄にならないことです特定のページの必要性(つまり、最初のページのイムは、私が必要としているのでcolumn1とcolumn2をダウンロードするだけです)。

OOPのアプローチが間違っているか、一般的には必要のないデータをダウンロードしますか?

これは既にカバーされている場合は、私はそれが面白い話題だろうと思って申し訳ありません! :)

エリック

さらに明確化:

クラスは次のようである:

class foo 
{ 
    $column1; 
    $column2; 
    $column3; 
    $column4; 

    public function _construct($id) 
    { 
    //get column 1,2,3 and 4 from database where table_id = $id 
    } 
} 

問題は、私が唯一のカラム1 1 1ページが必要な場合は私がcolumn2,3と4をダウンロードすることです何もない。手続き的なアプローチでは、そうしないでしょう。私のOOPモデルが悪いのですか、これは大丈夫ですか?

+0

サンプルコードを入力しますか?どのように到達したいのですか? –

+0

データベースを使用している場合、クエリは必要な行だけを返すことができます。 – Ibu

答えて

1

は、あなたはまだ建設時に、またはつかむクエリを処理するために、パブリッククラスのメソッドを使用してつかむために列の配列のいずれかを使用してOOPクラスの内部で選択クエリを組み込むことができます。コンストラクタの

例:あなたが$this->resultを設定する代わりに結果を返すことができ除い

<?php 

class Foo{ 
    public function __construct($column) { 

     if(is_array($column)){ 
      if(count($column) > 1){ 
       $result = mysql_query('SELECT `'.implode('`,`', $column).'` FROM `table`;'); 
      }else{ 
       $result = mysql_query('SELECT `'.$column[0].'` FROM `table`;'); 
      } 
     }else{ 
      $result = mysql_query('SELECT `'.$column.'` FROM `table`;'); 
     } 

     $this->result = mysql_result($result, 0); 
    } 
} 
?> 

パブリック関数法は、それと同一です。

+0

これは非常に意味があります。削除を初期化する場合に備えて、空の構成を追加することもできます。私はそれほど多くの最適化されておらず、ひどく書かれたコードを見て、それが普通だと思ったと思います! – Erik

+0

それは私たちの最高に起こります。率直に言って、私が投稿したコードは - 私にとって - ひどく書かれ、最適化されていません。個人的には、Zendのデータベース機能を実装するか、手動でmysqliに拡張してデータベースオブジェクトの設定全体を作成するまでは行っていますが、実際はプロジェクトのスコープに依存します。プロジェクト私は現在、100%OOPをしている傾向がありますが、古いWebサイトを手続き型からOOPに変換しています。これは、独自のコードの組み合わせを作成します。 –

1

私はあなたの質問をよく理解していません。

A)あなたがオブジェクトを構築し、その後、スクリプト全体でそのオブジェクトに含まれるデータを使用しようとしている:私はあなたがこの問題にアプローチする方法に適用することができると思う三つのことがあります。 B)PDOスタイルのデータベースプルを使用しています。 C)PHPs SPLを使用して、データベースから情報を取得するメソッドを含むオブジェクトに対して反復処理を行っています。

私はちょうどそれがここに入門...私は間違っていると私はすべてであなたの知識を過小評価しようとしているわけではない場合はご容赦くださいあなたはオプションAを使用していることを今のものとします。

OOPのアプローチは、すべてのデータをプルダウンしてスクリプト全体で利用できるようにすることではありません。データの集合ではなく関数の集合と考えることができますが、どちらか一方または両方になることは容易です。 OOPなしで関数を書くのと同じように、クラスメソッドを記述します。唯一の違いは、対象がはっきりあなたの質問に答えるために

...あなたはそれが必要な回数にわたりスクリプトとの通信に使用することができますされて、私は私が必要以上のデータを引っ張ることはありません。セキュリティとパフォーマンスの両方の理由から。プロシージャスタイルを使用するのと同じように、クラスを使用する必要があります。あなたは、(コンストラクタメソッドを使用して)クラスをインスタンス化する際にスクリプトに必要なすべてのデータ引き出しを行うことができますが、必要なデータだけであることを確認してください。

----追加

class foo{ 

    function getData($page){ 
     //Query to get the results you want based on the page number entered... 
     //Process it as you normally would into a result set, array, or whatever. 
     return $results;  
    } 

} 

その後

$foo = new Foo(); 
$page = "The page or the column that you want to pull"; 
$data = $foo->getData($page); 

あなたはまだ手続きすべてをやったが、今あなたがようで送るものに基づいてデータを引き出すことができる動的な機能を持っていることを呼び出しますこの場合、コンストラクタを使用する理由はありません。ゲッターメソッドのみです。

これは役に立ちますか?

+0

私は私のポストに少しの説明を加えました。私は瞬間にPHPの100%手続きを行い、それ以来、私はPHPで始まったので、それをやったので、私は尋ねています。しかし、私はオブジェクトを使って特定の行からすべてのデータをフェッチするだけで、クラス内のdeleteメソッドにアクセスできるようにすることができます。私にとってこれは奇妙に思えました、この種のおかしいモデルは間違っています、あなたは何をお勧めしますか? – Erik

+0

そうです、私はあなたの言うことに基づいて、少し間違ったアプローチだと思います。私はどのようにすればよいかを示すコードを追加しました... – espradley

+0

ええ、私はこれに似たものを考えていましたが、オブジェクトに格納されたデータを持たないことでOOPを逃してしまいます。トラビスが提案したクラス変数の動的な設定は、私が探していたものよりも多分かもしれないと思います。ありがとうtho! – Erik

0

一般的なアプローチは、あなたが foo->db->tablename->select('all', where date = $date)を必要とする列のみを選択するようになります。 cakephpやsymfonyなどのフレームワークを見てみると、それが一般的にどのように行われているかを知るのに役立ちます。

0

私の2セントです。これは、多くのものと、それがアプリケーション全体にどのように影響するかによって異なります。データベース要求、レコードごとにサイズ、行セットのサイズの#など

私は個人的に私が遅いリクエストや高メモリ使用量を経験したときにボトルネックを探すために、すべての列とプロファイルをロードします。ボトルネックがある場合は、その時点で必要な列だけを読み込み遅延ロードすることを検討します。