2009-09-29 67 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