4

コンテンツページのブレッドクラムを作成できるようにしたいのですが、コンテンツの一部が含まれるカテゴリの深さは無制限である可能性があるため、各カテゴリを1つずつ取得せずにそれを実行する方法がわかりません。親を取得するなど。もっと簡単な方法のようですが、理解できません。

記事の表があります

article_id
article_name
article_cat_id

カテゴリテーブルもあります

cat_id
cat_name
cat_parent

猫の親は、カテゴリが子である別のカテゴリのIDです。

このようなブレッドクラムを作成する必要があると私が言える限り、5つのカテゴリの深さの記事を想像してみてください(サンプルコードは明らかに入力をエスケープする必要がありますなど)

<?php
$breadcrumbs = array(
    'Category 5',
    'Content Item'
);
$cat_parent = 4;

while($cat_parent != 0) {
    $query = mysql_query('SELECT * FROM categories WHERE cat_id = '.$cat_parent);
    $result = mysql_fetch_array($query, MYSQL_ASSOC);
    array_unshift($breadcrumbs, $result['cat_name']);
    $cat_parent = $result['cat_parent'];
}
?>

これは私に

array(
'Category 1',
'Category 2',
'Category 3',
'Category 4',
'Category 5',
'Content Item'
)

これはパンくずリストに使用できますが、5回のクエリで実行できますが、これはあまり好ましくありません。

誰かがより良い解決策を提案できますか?

4

2 に答える 2

3

簡単な順にいくつかの簡単なオプションを次に示します。

  1. 現在の設計に固執し、再帰的/反復的なアプローチを使用して、コードが単純であることの利点を享受してください。本当に、これはあなたをかなり遠くまで連れて行ってくれます。おまけとして、より複雑なセットアップからよりも、ここからよりパフォーマンスの高いものに移行する方が簡単です。

  2. カテゴリの数がそれほど多くない場合は、それらすべてを選択して、PHP で階層を構築できます。ページサイズが原因で、1 行をフェッチするのに必要な作業量と、大量の行 (たとえば数百行) をフェッチするのに必要な作業量はほとんど同じです。これにより、クエリ/ネットワーク トリップの数が最小限に抑えられますが、ケーブルを介して転送されるデータの量が増加します。測定!

  3. 階層をキャッシュし、X 単位時間ごとに、またはカテゴリが追加/変更/削除されるたびに完全に再読み込みします。最も単純な形式では、キャッシュは、ノードの単純なインデックスとともに、カテゴリ階層全体を含むネストされた変数構造を持つ PHP ファイルです。

  4. ネストされたセット、パス列挙、クロージャ テーブルなどを使用して、何らかの方法で階層をフラット化した追加のテーブルを作成します。テーブルは、カテゴリ テーブルのトリガーを使用して維持されます。

近い将来、毎秒数ユーザーの持続的な負荷がかかることがかなり確実でない限り、私は (1) を選びます。(1 秒あたり 1 人のユーザーが 1 か月に 250 万回アクセスします)。

シンプルなコードで問題ありません。目立たないスピードアップのためにコードを複雑にするのは間違っています。

于 2011-04-05T21:44:59.360 に答える
2

リレーショナル データベースで階層データを処理する一般的な方法として、隣接リスト モデルネスト セット モデルの 2 つがあります。ここでのスキーマは現在、隣接リスト モデルに従っています。クエリの例については、このページをご覧ください。こちらのSOの質問も参照してください。多くの良い情報があります。

于 2011-04-05T21:10:33.980 に答える