7

在 MySQL 中,我以这种方式存储类别:

类别: - category_id - category_name - parent_category_id

为给定的 category_id 生成跟踪/面包屑的最有效方法是什么?

例如面包屑(category_id):General > Sub 1 > Sub 2

理论上可能有无限的层次。我正在使用 php。

更新:我看到了这篇关于嵌套集模型的文章 ( http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ )。看起来很有趣,但是您以前会如何动态管理类别?它在纸上看起来更容易,比如当您提前知道类别时,但当用户可以即时创建/删除/编辑类别时则不然……您怎么看?

4

3 回答 3

1

我喜欢使用物化路径方法,因为它本质上包含您的面包屑路径,并且可以轻松地执行诸如选择节点的所有后代之类的操作,而无需使用递归查询。

物化路径模型

物化路径模型的想法是将层次结构中的每个节点与其在树中的位置链接起来。这是通过所有节点祖先的串联列表完成的。此列表通常存储在分隔字符串中。请注意下面的“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
于 2009-09-30T00:06:10.023 回答
0

从传统的父模型生成它(无论你喜欢什么)并缓存它。动态生成它太昂贵了,而且层次结构的更改通常比其他更改的频率低几个数量级。我不会为嵌套集模型而烦恼,因为层次结构会发生变化,然后你必须去玩弄左右手。(请注意,这篇文章只包括了添加和删除的方法——而不是重新养育——这在父模型中非常简单)。

于 2009-09-29T23:43:56.713 回答
0

嵌套集的美妙之处在于,您只需几个简单的 SQL 语句就可以轻松地从图中添加/删除节点。它真的不是那么贵,而且可以很快编码。

如果您碰巧使用 PHP(或者即使您不使用),您可以查看此代码以了解将节点添加到嵌套集模型archive.org 备份)的相当直接的实现。移除(甚至移动)同样简单。

于 2009-09-30T00:17:46.957 回答