0

私は隣接リストモデルを使用して、私のウェブサイト内のサブカテゴリを探しています。私はすべてのカテゴリとサブカテゴリを見つけるためにPHPコードを使用していますが、現在はナビゲーションシステムを作成するためにどのように使用するのか把握できません。ここでは、サイトがどのように機能するかは非常に基本的なものです:隣接リストモデル+ウェブサイトナビゲーション

URL文字列 レベル

のindex.phpに続いてメインカテゴリ、がありますカテゴリ=カテゴリ名&レベル1 =サブ?カテゴリ& LEVEL2 =別のサブカテゴリー& LEVEL3 =コンテンツ・アイテム

その後、私はSEOフレンドリーリンクを作成します。レベル1は、サブカテゴリー とコンテンツ・アイテム

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

URLですノーサブカテゴリー

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

ここ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); 

     } 

    } 
+0

それはすべて素晴らしいですが、正確に何が問題なのですか? – bububaba

+0

@bububaba問題は、コンテンツにリンクするにはどうすればいいですか?私のデータベースに「コンテンツ」というテーブルがあります。そのテーブルには、カテゴリIDが「3」の行があります。 '3'が' 2'の子で、 '2'が' 1'の子で、 '1'が親であれば、カテゴリとサブカテゴリに関連してコンテンツを適切に表示するシステムをどうすれば作成できますか?だから、ホームページから '1'をクリックして' 2'を表示し、 '2'をクリックして' 3'を表示し、 '3'をクリックすると'コンテンツ 'を表示します。最終結果は '1 => 2 => 3 =>コンテンツページ'となります。それが意味をなさないかどうかは分かりませんが、うまくいけばそれがあります。ありがとう。 –

+0

また、 'content'テーブルはそのサブカテゴリのカテゴリIDだけを知っています。親があるかどうかを各カテゴリに伝えるために 'categories'という別のテーブルがあります。 –

答えて

0

options on how to represent hierarchical data in a databaseについて最初にこの質問を参照してください。

隣接リストは簡単ですし、変更が簡単ですが、上の関数などの再帰的なコードが実際にロードされているため、ひどいことがあります。最適なアプローチは、データモデルを変更することなく、using MySQL session variables to retrieve the entire hierarchy in one queryです。これは、1回のデータベース呼び出しで必要なすべてのデータを取り戻します。しかし、この場合でも、負荷の下でパフォーマンスが低下します。再帰的な機能に比べてパフォーマンスは劣りますが、それでもなお良いわけではありません。経験から書いています:)。

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