1

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

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

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

编辑:

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

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。所以孩子们需要与所有项目一起复制。并且所有的左右都需要适当调整。如果某事失败,则需要完全回滚。希望这现在更清楚了。

编辑2:

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

4

2 回答 2

1

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

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

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

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

于 2009-02-23T10:19:19.387 回答
1

我从您对“左右”的引用中猜测您正在谈论树的嵌套集表示。在这种情况下,复制整个分支与添加一个节点并没有什么不同,过程基本上是:

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

因此,如果您的树编号如下:

根 (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;

于 2009-02-23T13:37:51.097 回答