Папка копирования обхода дерева предзаказа

У нас есть база данных, содержащая несколько деревьев. Эти деревья строятся по принципу «Обход дерева предзаказа». Это очень мощный способ создания деревьев, но у него есть один большой недостаток — одновременное добавление нескольких узлов.

Мы должны создать функцию копирования в нашем дереве, копирование одного (самого низкого уровня) узла очень просто, вы можете сделать это за один вызов. Но теперь мы хотим скопировать сразу всю папку. Нам было интересно, должны ли мы делать это в .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. Так что детей нужно копировать вместе со всеми элементами. И все левое и правое нужно настроить как следует. Если что-то не получается, нужен полный откат. Надеюсь, теперь это намного понятнее.

РЕДАКТИРОВАТЬ2:

Я написал хранимую процедуру для этого. Если кто-то хочет, просто спросите, я вернусь к этому вопросу позже сегодня. Я опубликую это, если вы хотите.


person user29964    schedule 23.02.2009    source источник


Ответы (2)


Из вашей ссылки на «лево и право» я предполагаю, что вы говорите о представление вложенного множества дерева. В этом случае репликация всей ветки ничем не отличается от добавления одного узла, процесс в основном выглядит следующим образом:

  • Откройте пространство в левой и правой последовательностях для новых узлов.
  • Вставьте новые узлы с правильными последовательностями

Итак, если ваши деревья пронумерованы следующим образом:

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)

И деревья находятся в разных таблицах, код для репликации папки 3 ниже папки 6 находится в блоке ниже. Некоторые конструкции 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;

person Bell    schedule 23.02.2009
comment
Я думаю, что значения левого/правого узла неверны после второго элемента папки 1 (6 появляется дважды). Как следствие, все левые/правые значения › 6 (кроме правого для второго элемента папки 1) должны быть увеличены на единицу. - person zeFrenchy; 14.12.2011

Не могли бы вы пройтись по всему дереву и вставить его в новое бинарное дерево? Если у вас есть несколько наборов данных, которые необходимо объединить, вы можете просто просмотреть каждый из них в любом порядке и перестроить дерево.

Не могли бы вы дать больше информации о том, что вы имеете в виду под папкой?

Я думаю, что этот вопрос нуждается в дополнительной информации, прежде чем на него можно будет дать полный ответ.

Чтобы убедиться, что транзакция работает, протестируйте ее на базе данных, которая не находится в рабочей среде!

person X-Istence    schedule 23.02.2009