0

隣接リスト モデルを使用して、Web サイト内のサブ カテゴリを検索しています。すべてのカテゴリとサブカテゴリを見つけるために PHP コードを使用していますが、それを使用してナビゲーション システムを作成する方法がわかりません。非常に基本的なサイトの仕組みは次のとおりです。

URL 文字列 メイン カテゴリがあり、その後にレベルが続きます

index.php?category=カテゴリ名&level1=サブカテゴリ&level2=別のサブカテゴリ&level3=コンテンツ項目

後で、SEO に適したリンクを作成します。

サブカテゴリのない URL レベル 1 がコンテンツ アイテムである場合

www.website.com/category/content-item/

レベル 1、2、3 などがサブ カテゴリであり、最終レベルがコンテンツ アイテムであるサブ カテゴリを含む URL

www.website.com/category/sub-category/sub-category-2/content-item/

カテゴリとサブカテゴリを見つけるために使用しているコードは次のとおりです。現在、すべてのカテゴリとサブカテゴリのリストと、各子供のレベルの番号を出力するだけです。これが役立つかどうかはわかりませんが、リストを作成するだけです。

    function display_children($ParentCategoryID, $Level) {

        // retrieve all children of parent

        if ($ParentCategoryID == ''){
            $Result = mysql_query('SELECT * FROM categories WHERE parent_category_id IS null');
        }
        else{
            $Result = mysql_query('SELECT * FROM categories WHERE parent_category_id="'.$ParentCategoryID.'";');
        }

        // display each child
        while ($Row = mysql_fetch_array($Result)) {

            echo str_repeat('-',$Level)."[".$Level."]".$Row['category_name']."<br />";

            display_children($Row['category_id'], $Level + 1);

        }

    }
4

1 に答える 1

0

データベースで階層データを表現する方法のオプションについては、まずこの質問を参照してください。

隣接リストはシンプルで優れており、簡単に変更できますが、実際には上記の関数のような再帰的なコードにつながるため、負荷がかかるとパフォーマンスが低下するため、ひどい場合があります。データ モデルを変更しない場合の最善の方法は、MySQL セッション変数を使用して 1 回のクエリで階層全体を取得することです。これにより、1 回のデータベース呼び出しで必要なすべてのデータが返されます。これでも、負荷がかかるとパフォーマンスが低下しますが、再帰関数ほどではありませんが、それでも良くありません。そして、私は経験から書いています:)。

私だったら、ネストされたセット、隣接リストをブリッジ テーブルやフラット テーブルなどの非正規化と組み合わせて使用​​するか、系統テーブルのみを使用します。実際には、データが変更される頻度と、それらの変更を簡単に行う必要があるかどうかによって異なります。これらのオプションはすべて、親子 ID 列だけに頼るのではなく、はるかに高速に動作するはずです。

于 2012-01-27T10:44:08.543 に答える