2009-09-29 64 views
5

在MySQL類別的麪包屑,我存儲類是這樣的:生成存儲在MySQL

類別: - CATEGORY_ID - CATEGORY_NAME - parent_category_id

什麼是最有效的方式來生成蹤跡/給定category_id的breadcrumb?

例如 麪包屑(CATEGORY_ID): 常規>子1>子2

有可能是在理論無限水平。 我使用的是PHP。

更新: 我看到了關於嵌套集模型的文章(http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/)。 它看起來很有趣,但你會如何動態管理類別? 在紙上看起來更容易,比如當你知道分類的時候,但不是當用戶可以隨時創建/刪除/編輯類別時... 你覺得呢?

+1

MySQL中的分層查詢:http://explainextended.com/2009/03/17/hierarchical-queries-in-mysql/ – 2009-09-30 00:02:53

回答

0

從傳統的父模型生成它(然而你喜歡)並緩存它。在飛行中生成它太昂貴,並且層次結構的變化通常比其他變化少幾個數量級。我不會爲嵌套集模型而煩惱,因爲層次結構將會發生變化,然後你必須與左派和權利混在一起。 (請注意,該文章僅包含用於添加和刪除的食譜 - 不是重新父母 - 在父母模型中非常簡單)。

1

我喜歡使用Materialized Path方法,因爲它基本上包含了您的麪包屑痕跡,並且可以輕鬆地執行諸如選擇節點的所有後代而不使用遞歸查詢。

物化路徑模型

與物化路徑模型的想法是每個節點在層次結構與其在樹中的位置聯繫起來。這是通過所有節點祖先的連接列表完成的。該列表通常存儲在分隔字符串中。請注意下面的「Linage」字段。 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 
+0

鏈接已死亡 – lapin 2018-03-01 10:01:55

+0

@lapin適合我,內容添加上面 – RedFilter 2018-03-01 23:29:03

0

的嵌套組的好處是,你可以很容易地從圖中添加/刪除節點,只需幾個簡單的SQL語句。它並不是那麼昂貴,而且可以很快編碼。

如果您碰巧在使用PHP(或者即使您不使用PHP),也可以查看此代碼以查看adding nodes to a nested set modelarchive.org backup)的相當直接的實現。刪除(或甚至移動)同樣很簡單。

+0

鏈接已死 – lapin 2018-03-01 10:01:48

+0

@lapin - 添加了死鏈接的archive.org鏈接。 – timdev 2018-03-01 19:03:41