数据库 – 如何使用嵌套集合模型对存储的树进行排序?

前端之家收集整理的这篇文章主要介绍了数据库 – 如何使用嵌套集合模型对存储的树进行排序?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
当我提到嵌套集模型,我的意思是描述 here.

我需要在用户定义的层次结构中建立一个新的系统来存储“类别”(我不能想到更好的词)。由于嵌套集合模型是针对读取而不是写入进行优化的,所以我决定使用它。不幸的是,在研究和测试嵌套集时,遇到了如何用排序节点显示分层树的问题。例如,如果我有层次结构:

root
    finances
        budgeting
            fy08
    projects
        research
        fabrication
        release
    trash

我想要将其排序,使其显示为:

root
    finances
        budgeting
            fy08
    projects
        fabrication
        release
        research
    trash

请注意,制造在研究之前出现。

无论如何,经过长时间的搜索,我看到了答案,例如“将树存储在多维数组中并对其进行排序”,并将“将树序列化为嵌套集模型”(我正在进行…)。无论哪种方式,第一个解决方案是对RAM和cpu的可怕浪费,这两者都是非常有限的资源…第二个解决方案看起来像很多痛苦的代码

无论如何,我能够弄清楚如何(使用嵌套集模型):

>在sql中启动一个新树
>将一个节点作为另一个节点的子节点插入树中
>在树中的兄弟节点之后插入一个节点
>使用层次结构从sql中拉取整个树
>从具有或不具有深度限制的层次结构中的特定节点(包括根)拉取子树
>查找树中任何节点的父节点

所以我想到#5和#6可以用来做我想要的排序,它也可以用来重新排序顺序的树。

然而,现在我已经看了所有这些我学会了的事情,我看到#3,#5和#6可以一起使用来执行排序插入。如果我做了排序插入,它总是排序。但是,如果我更改了排序条件,或者我想要一个不同的排序顺序,我回到了一个平方。

这可能只是嵌套集模型的局限性吗?它的使用抑制输出查询排序?

解决方法

我认为这是嵌套集模型的限制。因为结构集的顺序对于重建树结构是至关重要的,所以不能轻易地对它们各自的父节点内的子节点进行排序。

我认为这是插入,更新或删除节点时保持树分类的最佳方法。这甚至使查询速度非常快,这是该数据结构的主要目标之一。如果您为所有操作实施存储过程,则使用起来非常简单。

您还可以反转预分类树的排序顺序。你只需要使用ORDER BY node.rgt DESC而不是ORDER BY node.lft ASC。

如果您真的需要支持另一种排序标准,则可以通过向每个节点添加一个第二个lft和rgt索引来实现,并在每次插入/更新/删除时按其他条件进行排序。

原文链接:https://www.f2er.com/mssql/84664.html

猜你在找的MsSQL相关文章