2009-02-23 90 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

難道你不能遍歷整個樹並插入到一個新的二叉樹嗎?如果您有多個需要組合的數據集,您可以按任意順序遍歷每個數據集並讓樹自身重建。

你能否提供更多關於你對文件夾的含義的信息?

我認爲這個問題需要更多的信息才能得到充分的回答。

至於確保事務能夠正常工作,請在未生產的數據庫上進行測試!