2009-02-23 111 views
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 

我希望能够复制文件夹3 underneith文件夹6. 洙需要与所有项目一起复制的孩子。 而所有的权利和权利需要适当调整。如果某件事失败,则需要完整的回滚。希望现在更清楚。

EDIT2:

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

回答

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位于下面的块中。一些SQL结构像UPDATE ... FROM ...在你的环境中在语法上可能有点不同,下面的结构在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; 

+0

我认为在文件夹1的第二项(6出现两次)后节点左/右值是错误的。因此,所有左/右值> 6(文件夹1的第二项右侧除外)应增加1。 – zeFrenchy 2011-12-14 17:10:24

1

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

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

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

至于确保事务能够正常工作,请在未生产的数据库上进行测试!