在MySQL中,我这样存储类别:
分类:- category_id - category_name - parent_category_id
为给定的category_id生成路径/面包屑最有效的方法是什么?
例如,面包屑(Category_id):常规>子1>子2
理论上可能有无限的水平。我正在使用php。
更新:我看到了这篇关于嵌套设置模型的文章(http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/)。它看起来很有趣,但是你是如何动态管理类别的呢?它在纸面上看起来更容易,比如当你提前知道类别时,但当用户可以动态创建/删除/编辑类别时就不是这样了……你认为如何?
发布于 2009-09-30 00:06:10
我喜欢使用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发布于 2009-09-29 23:43:57
从传统的父模型生成它(无论您喜欢什么),并将其缓存。动态生成它的成本太高,而且对层次结构的更改通常比其他更改少几个数量级。我不会为嵌套的集合模型而烦恼,因为层次结构会发生变化,然后你就不得不去摆弄左边和右边的东西了。(请注意,这篇文章只包括添加和删除的食谱-而不是重新为人父母-这在父模型中非常简单)。
发布于 2009-09-30 00:17:47
嵌套集的美妙之处在于,只需几个简单的SQL语句,您就可以轻松地在图中添加/删除节点。它真的不是那么昂贵,而且可以很快地进行编码。
如果您碰巧正在使用PHP (或者不使用PHP),那么您可以查看这段代码来了解一个相当简单的adding nodes to a nested set model (archive.org backup)实现。移除(甚至移动)也同样简单。
https://stackoverflow.com/questions/1495460
复制相似问题