在闭包表模型中有多个根?

时间:2015-12-22 11:43:59

标签: mysql sql

如您所知,分类模型中的类别将如下所示。

Books             Electronic Devices
>Programming       >Apple
>>C++              >>MacBook pro
>Cars              >Samsung
>Cocking           >Asus

等...
我创建了一个categories表,其中包含category_closure表 所以我有这两个表:

'For category_closure table:'
id, parent_id, title, etc...
"parent_id is null by default"

And for category_closure table:
ancestor, descendant, depth

我看过很多关于闭包表模型的文章,但是他们没有展示如何获得具有多个带有null值的parent_id的表的完整树路径,或者简单地说,有多个根

1 个答案:

答案 0 :(得分:0)

几年前我不得不解决类似的问题,最后我基于this article by Mike Hillyer on the Nested Set Model创建了一个混合解决方案。我不知道这是否与你的桌面模型兼容,但至少它应该是一个有趣和信息丰富的阅读。基本思路是:

目前,您正在使用称为邻接列表模型的模型,其中每个节点都包含对其父级的引用。这对于浅层次结构很有用,在这种层次结构中,您只有几个级别的数据,或者只需要获取特定节点的直接子级。

如果您希望能够获取特定节点的所有后代(例如,获取所有主题的书籍列表),则邻接列表模型会变得有点笨拙。对于这些实例,我建议使用嵌套集模型。嵌套集模型为每个节点提供一个“左”值和一个“右”值,基于它在层次结构中的位置(文章将指导您如何分配这些值的更多细节,而不是希望在我的答案中复制)。因此,如果要选择节点的所有后代,只需查找其左(或右,无关)值的节点是目标节点左右值的节点。

在我的特定解决方案中,我在表格中实现了两个模型,并根据我所需的数据最方便的模型进行选择。这确实增加了少量的开销来更新我的数据中的操作,但对于我正在处理的应用程序来说这是一个可接受的权衡。

我希望有所帮助!