预订树遍历复制文件夹

时间:2009-02-23 10:01:18

标签: c# sql tree copy directory

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

我们必须在树中创建一个复制功能,复制一个(最低级别)节点非常容易,你可以在一次调用中完成。 但现在我们想要一次复制整个文件夹。 我们想知道是否应该使用存储过程在.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

我希望能够复制文件夹3 underneith文件夹6。 所以孩子们需要与所有物品一起复制。 所有左派和权利都需要适当调整。如果出现故障,则需要完全回滚。希望现在更清楚了。

EDIT2:

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

2 个答案:

答案 0 :(得分:1)

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

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

我认为这个问题需要更多的信息才能得到充分的回答。

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

答案 1 :(得分:1)

我猜你在提到“左派和权利”时,你正在谈论一棵树的 nested set representation 。在这种情况下,复制整个分支与添加一个节点没有什么不同,该过程基本上是:

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

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

Root (1, 27)
Folder 1 (2, 8)
        Item (3, 4)
        Item (5, 6)
        Item (6, 7)
Folder 2 (9, 14)
        Item (10, 11)
        Item (12, 13)
Folder 3 (15, 26)
        Folder 4 (16, 21)
                Item (17, 18)
                Item (19, 20)
        Folder 5 (22, 25)
                Item (23, 24)

Root 2 (1, 4)
    Folder 6 (2, 3)

树木在不同的表格中,复制文件夹6下面的文件夹3的代码位于下面的块中。一些像UPDATE ... FROM ...这样的SQL结构在你的环境中可能在语法上有点不同,下面那些在PostgreSQL中使用。我相信MSSQL要求更新的表包含在FROM子句中。

-- Push the items below this point down the sequence by as much as is required to accomadate the new branch (Not required in this case, but here for completeness)
UPDATE tree2 SET leftsequence = leftsequence + (tree.rightsequence - tree.leftsequence), rightsequence = rightsequence + (tree.rightsequence - tree.leftsequence)
 FROM tree
 WHERE tree2.leftsequence > 2 AND tree2.rightsequence = 3
  AND tree.leftsequence = 15;

-- Copy the nodes
INSERT INTO tree2 (label, leftsequence, rightsequence)
 SELECT label, leftsequence - (15 - 2) + 1, rightsequence - (15 - 2) + 1
  FROM tree
  WHERE leftsequence BETWEEN 15 AND 26;