1

いくつかのツリーを含むデータベースがあります。これらのツリーは、「プレオーダー ツリー トラバーサル」の原則を使用して構築されます。これはツリーを作成する非常に強力な方法ですが、一度に複数のノードを追加するという大きな欠点が 1 つあります。

ツリーにコピー関数を作成する必要があります。単一の (最下位レベルの) ノードをコピーするのは非常に簡単です。これは 1 回の呼び出しで実行できます。しかし今、フォルダ全体を一度にコピーしたいと考えています。ストアド プロシージャを使用して .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 をフォルダ 6 の下にコピーできるようにしたいので、すべてのアイテムと一緒に子をコピーする必要があります。そして、すべての左右を適切に調整する必要があります。何かが失敗した場合は、完全なロールバックが必要です。これが今より明確になることを願っています。

EDIT2:

このためのストアド プロシージャを作成しました。誰かがそれを望んでいるなら、私は今日この質問に戻ってきます。ご希望があれば掲載します。

4

2 に答える 2

1

ツリー全体をトラバースして、それを新しいバイナリ ツリーに挿入することはできませんか? 結合する必要がある複数のデータ セットがある場合は、各データ セットを任意の順序でトラバースし、ツリー自体を再構築することができます。

フォルダの意味について詳しく教えてください。

この質問に完全に答えるには、さらに情報が必要だと思います。

トランザクションが機能することを確認するには、本番環境ではないデータベースでテストしてください!

于 2009-02-23T10:19:19.387 に答える
1

「左と右」への言及から、ツリーのネストされたセット表現について話していると推測しています。その場合、ブランチ全体を複製することは、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)

ツリーは別のテーブルにあり、フォルダー 3 をフォルダー 6 の下にレプリケートするためのコードは、下のブロックにあります。UPDATE ... FROM ... のような SQL 構造の一部は、環境によって構文が少し異なる場合があります。以下は PostgreSQL で使用されているものです。MSSQL では、更新されるテーブルが FROM 句に含まれている必要があると思います。

-- このポイントより下の項目を、新しいブランチに対応するのに必要な分だけシーケンスの下に押し込みます (この場合は必須ではありませんが、完全を期すためにここにあります)。
UPDATE tree2 SET leftsequence = leftsequence + (tree.rightsequence - tree.leftsequence), rightsequence = rightsequence + (tree.rightsequence - tree.leftsequence)
 FROM ツリー
 WHERE tree2.leftsequence > 2 AND tree2.rightsequence = 3
  AND tree.leftsequence = 15;

-- ノードをコピーします
INSERT INTO tree2 (ラベル、左シーケンス、右シーケンス)
 SELECT ラベル、左シーケンス - (15 - 2) + 1、右シーケンス - (15 - 2) + 1
  FROM ツリー
  WHERE leftsequence BETWEEN 15 AND 26;

于 2009-02-23T13:37:51.097 に答える