2012-01-13 8 views
2

2つのテーブルがある場合、blog_categoryとblogと言うと、それぞれの "blog"は特定のカテゴリにしか属していないので、 "blog_category_id" 。それは$カテゴリの大きさに応じて、DBの呼び出しの面で非常に高価終わる可能性のように、これは思える私にデータベース呼び出しを減らすか、PHPでマージするMysqlの親子テーブル

//Loop through categories such as 
foreach($categories as $cat): 
//then for each category create an array of all its posts 
$posts = $cat->getPosts(); // This would be another DB call to get all posts for the cat 
//do stuff with posts 
endforeach; 

は今、私のコードでは、私のような何かをするだろう。これはこれを行うにはまだ最高の解決策でしょうか?あるいは、コード内で何かを行い、最初にすべてのカテゴリを取得してから、すべてのブログを取得して、idを介して対応するカテゴリにマップすることができますか?これは理論的には2つのコールをDBにするだけですが、コール2(ブログ)の結果セットは確かにサイズが大きくなりますが、実際のDBコールは高価になるでしょうか?

私は通常、最初のオプションを選択しますが、これに近づくより良い方法があるのだろうか、それともPHPの余分な処理がパフォーマンス面でより高価になる可能性が高いのでしょうか?また、MVCの観点からは、モデルがカテゴリを返すが、そのカテゴリの対応するブログも返さなければならないと、モデルをすべてのデータを返すべきではないと私の理解から、ビューに必要ですか?

または、最初のクエリで内部結合を使用してすべてのカテゴリとブログを選択して、これを必要とする出力を作成する方が良いでしょうか?おそらく、多次元配列を使用することによって?

おかげ

答えて

1

次のようにすべてのカテゴリや投稿を取得するには、単純なSQLクエリを使用することができます。

SELECT * 
FROM posts p 
JOIN categories c ON c.id = p.blog_category_id 
ORDER BY c.category_name ASC, 
     p.posted_date DESC 

を次にあなたが返されたレコードをループ変数に現在のカテゴリIDを割り当てるときに、これを使用して次のレコードカテゴリと比較することができます。カテゴリが異なる場合は、レコードを印刷する前にカテゴリのタイトルを印刷します。これが機能するには、最初にカテゴリ別に投稿順を取得してから、同じカテゴリのすべての投稿をまとめて投稿する必要があることに注意してください。例えばので

$category_id = null; 
foreach($posts as $post) { 
    if($post['blog_category_id'] != $category_id) { 
     $category_id = $post['blog_category_id']; 
     echo '<h2>' . $post['category_name'] . '</h2>'; 
    } 
    echo '<h3>' . $post['post_title'] . '</h3>'; 
    echo $post['blog_content']; 
} 

注:私は見ることが期待されるものに類似している列名を補うために、私が持っていたこの2つのテーブルのスキーマを投稿していないようこのようなコード。したがって、上記のコードは、これを考慮して調整することなくコードでは動作しません。

+0

こんにちは、私は結合を行う方法を知っていますが、具体的には、MVC構造体を使用してこれを行うための最良の方法が、最高のパフォーマンスを誇るものとバランスを取るべきであるというアドバイスを探していました – TommyBs

+0

実際にこのコードに何らかの影響を与えます。 MVCは全体的な構造であり、データベース設計を指示しません。 MVCの 'M'はDBとは話していないかもしれませんが、APIなどを使っている可能性があります。テンプレートコードも含めて私の答えを更新しました。 – Treffynnon

+0

こんにちは、返信いただきありがとうございます。私は擬似コードを使用して、私が望むものを説明するための例を単純化しました。私はそれが実際にDBの設計を指示しないことを知っていましたが、コードをどのように構造化するか、それが私のやり方に応じてパフォーマンス上の利点があるかどうか(または、これがMVCプロジェクト構造体でなければなりません)。答えをもっと記入してくれてありがとう、私はMVCを初めて使い、サンプル構造を示すチュートリアルを中心に、構造化の方法に関する詳細なチュートリアルは実際には見つけられていません。私は遊びをして質問を更新します – TommyBs

1

最適な解決策は、データを使って何を行うかによって異なります。あなたがそれを必要

遅延ロード

データをロードします。これは、例えば20のカテゴリーがあり、2つのカテゴリーだけをポストしたときの良い解決策です。しかし、すべての記事を読み込む必要がある場合、効率的ではありません。これはn + 1個のクエリと呼ばれます(実際は悪いです)。一方

イーガーロード

あなたは、ほぼすべての投稿のへのアクセスを持っている場合、あなたは熱心なロードを行う必要があります。

-- Load all your data in a query 
SELECT * 
FROM categories c 
INNER JOIN posts p ON c.id = p.category_id; 

// Basic example in JSON of how to format your result 
{ 
    'cat1': ['post1', 'post2'], 
    'cat2': ['post5', 'post4', 'post5'], 
    ... 
} 

どうすればよいですか?

あなたのケースでは、ループ内のすべてをロードするため、私は熱心な負荷がかかると言います。しかし、ほとんどのデータにアクセスできない場合は、ビューがアクセスしようとしたときに特定のカテゴリのポストをロードするSQLクエリーが実際に実行されるように、モデルを再設計してレイジーローディングを実行する必要がありますそれら。

あなたはどう思いますか?