7

MySQL では、次の方法でカテゴリを保存します。

カテゴリ: - カテゴリ ID - カテゴリ名 - 親カテゴリ ID

特定の category_id のトレイル/ブレッドクラムを生成する最も効率的な方法は何ですか?

たとえば、breadcrumbs(category_id): General > Sub 1 > Sub 2

理論的には無制限のレベルが存在する可能性があります。私はphpを使用しています。

更新:ネストされたセット モデルに関するこの記事 ( http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ ) を見ました。面白そうに見えますが、カテゴリを動的に管理することについてどう思いますか? 事前にカテゴリを知っている場合のように、紙の上では簡単に見えますが、ユーザーがその場でカテゴリを作成/削除/編集できる場合はそうではありません...どう思いますか?

4

3 に答える 3

1

マテリアライズド パスメソッドを使用するのが好きです。これには本質的にブレッドクラム トレイルが含まれており、再帰クエリを使用せずにノードのすべての子孫を選択するなどの操作を簡単に実行できるからです。

マテリアライズド パス モデル

マテリアライズド パス モデルのアイデアは、階層内の各ノードをツリー内の位置にリンクすることです。これは、すべてのノードの祖先の連結リストで行われます。このリストは通常​​、区切られた文字列に格納されます。下の「系統」フィールドに注意してください。 CAT_ID NAME CAT_PARENT Lineage 1 Home . 2 product 1 .1 3 CD’s 2 .1.2 4 LP’s 2 .1.2 5 Artists 1 .1 6 Genre 5 .1. 5 7 R&B 6 .1. 5.6 8 Rock 6 .1. 5.6 9 About Us 1 .1

テーブルのトラバース

Select lpad('-',length(t1.lineage))||t1.name listing
From category t1, category t2
Where t1.lineage like t2.lineage ||'%'
    And t2.name = 'Home';
Order by t1.lineage;

上場

Home
-product
–CD’s
–LP’s
-Artists
–Genre
—R&B
—Rock
-About Us
于 2009-09-30T00:06:10.023 に答える
0

従来の親モデルから(好きなように)生成し、キャッシュします。その場で生成するにはコストがかかりすぎ、階層の変更は通常、他の変更よりも数桁少なくなります。階層が変更されるため、入れ子集合モデルを気にする必要はありません。その後、左と右をいじくり回す必要があります。(この記事には、親モデルでは非常に単純な、追加と削除のレシピのみが含まれていることに注意してください。親の再作成は含まれていません)。

于 2009-09-29T23:43:56.713 に答える
0

ネストされたセットの利点は、いくつかの単純な SQL ステートメントだけで、グラフからノードを簡単に追加/削除できることです。それほど高価ではなく、かなり迅速にコーディングできます。

PHP を使用している場合 (または使用していない場合でも)、このコードを見て、ネストされたセット モデル( archive.org バックアップ) にノードを追加するかなり単純な実装を確認できます。削除 (または移動) も同様に簡単です。

于 2009-09-30T00:17:46.957 に答える