1

データベースに5つのテーブルがあります。それらの最小化されたバージョンは次のようになります。

+------------+ +--------------+ +---------------+ +-------------+ +-------------+
|    Blog    | |     Feed     | |   Category    | | SubCategory | | Blog_Subcat |
+------------+ +--------------+ +---------------+ +-------------+ +-------------+
| blog_id    | | feed_id      | | category_id   | | subcat_id   | | blog_id     |
| blog_title | | blog_id      | | category_name | | subcat_name | | subcat_id   |
| blog_blog  | | feed_content | +---------------+ | category_id | +-------------+
+------------+ +--------------+                   +-------------+

ほとんどの場合、1つのブログを1つ以上のサブカテゴリに含めることができます。1つのサブカテゴリは、1つのカテゴリの一部にしかなれません。

特定のカテゴリに対応するブログのフィードを表示したい。次の形式のURLがありますhttp://www.example.com/category_name

私がしていることは:

category_nameを取得します。カテゴリテーブルでcategory_idを検索します。
Sub-Categoryテーブルで、そのcategory_idを持つすべてのサブカテゴリを調べます。

次に、blog_id WHERE category_id IN(サブカテゴリの配列)のFeedテーブルとBlog_Subcatテーブルを結合するクエリを作成します。

その後、そのカテゴリに含まれるすべてのフィードを取得します。

現在は機能していますが、私のテーブルにはたった1か月で約30,000のフィードがあるため、このプロセスは少し遅いと感じています。

私の最後のクエリは次のようになります。

public static function findLastPosts($subcategories=false){
    $table = new self;

    $query = $table->select()->setIntegrityCheck(false);
    $query->from('feeds', array('feeds.blog_id', 'feeds.feed_id', 'feeds.feed_content'));       
    $query->join(
        'blog_subcat', 
        'blog_subcat.blog_id = feeds.blog_id', 
        array('blog_subcat.blog_id')
    );

    $query->where('blog_subcat.category IN (?)', $subcategories);           
    $query->where('feeds.date_created <= NOW()');               
    $query->order('ati_feeds.date_created DESC');
     //rest of my code...
}

このプロジェクトではZendFrameworkを使用しています。知りたいのですが、一部のカテゴリの読み込みに少し時間がかかりすぎるため、フィードを取得するためのより良い方法があるかどうかを確認します。

4

1 に答える 1

0

これを試して:

$columns = array(
    // whatever columns you ultimately want to select in this array
    // example: 'title' => 'blogs.title' queries 'blogs.title AS title'
);
$select  = $db->select(); // where $db is your Zend_Db_Adapter instance
$select -> from('feeds as f',$columns);
$select -> join('blogs as b','b.id = f.blog_id',array());
$select -> join('blog_subcat as bs','bs.blog_id = f.blog_id',array());
$select -> join('subcategories as s','s.id = bs.subcat_id',array());
$select -> join('categories as c','c.id = s.cat_id',array());
$select -> where('c.name = ?',$categoryName);
$select -> order('f.date_created DESC');
$select -> group('f.id');
$select -> limit($count,$pageNumber - 1);
$results = $db->fetchAll($select);
// and then whatever you do to populate view models

データベースが最適化できるクエリを1つ持つと、同じものをつなぎ合わせるために複数のクエリよりもパフォーマンスが向上すると思います。特にリモートMySQLサーバーを使用する場合...

于 2012-09-16T20:08:25.220 に答える