【问题标题】:Preorder tree traversal copy folder前序树遍历复制文件夹
【发布时间】:2010-10-09 06:58:36
【问题描述】:

我们有一个包含几棵树的数据库。 这些树是使用“前序树遍历”原则构建的。这是一种非常强大的创建树的方法,但它有一个很大的缺点,即一次添加多个节点。

我们必须在树中创建一个复制函数,复制单个(最低级别)节点非常容易,您可以一次调用。 但现在我们想一次复制整个文件夹。 我们想知道是否应该在.net 中使用存储过程来执行此操作。 我们必须确保事务正常工作,如果出现任何问题,都必须回滚,否则树会损坏。

谁能帮我解决这个问题? 任何关于 PTT 的信息都可以在这里找到:http://en.wikipedia.org/wiki/Tree_traversal

编辑:

显然需要更多信息。 我有 2 棵树:

Root
Folder 1
    Item 
    Item
    Item
Folder 2
    Item
    Item
Folder 3
    Folder 4
        Item
        Item
    Folder 5
        Item

Root 2
    Folder 6

我希望能够在文件夹 6 下复制文件夹 3。 soo 孩子们需要与所有项目一起复制。 并且所有的左右都需要适当调整。如果某事失败,则需要完全回滚。希望这现在更清楚了。

EDIT2:

我为此编写了一个存储过程。 如果有人想要它只是问我会在今天晚些时候回到这个问题。 如果你愿意,我会发布它。

【问题讨论】:

    标签: c# sql tree copy directory


    【解决方案1】:

    我从您提到的“左右”中猜测您是在谈论一棵树的 nested set representation 。在这种情况下,复制整个分支与添加一个节点并没有什么不同,过程基本上是:

    • 在左右序列中为新节点打开一个空格
    • 插入具有正确序列的新节点

    所以,如果你的树的编号如下:

    根 (1, 27) 文件夹 1 (2, 8) 项目 (3, 4) 项目 (5, 6) 项目 (6, 7) 文件夹 2 (9, 14) 项目 (10, 11) 项目 (12, 13) 文件夹 3 (15, 26) 文件夹 4 (16, 21) 项目 (17, 18) 项目 (19, 20) 文件夹 5 (22, 25) 项目 (23, 24) 根 2 (1, 4) 文件夹 6 (2, 3)

    并且树在不同的表中,复制文件夹 6 下的文件夹 3 的代码在下面的块中。某些 SQL 结构,如 UPDATE ... FROM ... 在您的环境中可能在语法上略有不同,以下与 PostgreSQL 中使用的相同。我相信 MSSQL 要求正在更新的表包含在 FROM 子句中。

    -- 将低于这一点的项目按顺序向下推,以适应新分支(在这种情况下不需要,但为了完整起见) UPDATE tree2 SET leftsequence = leftsequence + (tree.rightsequence - tree.leftsequence),rightsequence = rightsequence + (tree.rightsequence - tree.leftsequence) 从树 其中 tree2.leftsequence > 2 AND tree2.rightsequence = 3 AND tree.leftsequence = 15; -- 复制节点 INSERT INTO tree2(标签、左序列、右序列) 选择标签,左序列 - (15 - 2) + 1,右序列 - (15 - 2) + 1 从树 WHERE leftsequence BETWEEN 15 AND 26;

    【讨论】:

    • 我认为文件夹1的第二项之后节点左/右值是错误的(6出现两次)。因此,所有大于 6 的左/右值(文件夹 1 的第二项的右除外)都应递增 1。
    【解决方案2】:

    你能不能遍历整个树并将其插入到一个新的二叉树中?如果您有多个需要组合的数据集,您可以按任意顺序遍历每个数据集并让树自行重建。

    您能否提供更多关于文件夹含义的信息?

    我认为这个问题需要更多信息才能完全回答。

    至于确保事务有效,请在未投入生产的数据库上进行测试!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-25
      • 2021-03-08
      • 1970-01-01
      • 1970-01-01
      • 2017-03-14
      • 1970-01-01
      • 1970-01-01
      • 2023-01-09
      相关资源
      最近更新 更多