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

1

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

Нам нужно создать функцию копирования в нашем дереве, скопировать один (самый низкий уровень) node очень просто, вы можете сделать это за один вызов. Но теперь мы хотим скопировать всю папку сразу. Нам было интересно, следует ли делать это в .net с хранимой процедурой. Мы должны убедиться, что транзакция работает, если что-то пойдет не так, все должно быть отменено, потому что otherweise дерево будет повреждено.

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

EDIT2:

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

Теги:
copy
folder
tree

2 ответа

1
Лучший ответ

Я предполагаю из вашей ссылки на "left and rights", что вы говорите о вложенном представлении множества дерева. В этом случае репликация всей ветки не так уж отличается от добавления одного node, процесс в основном:

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

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

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;

  • 0
    Я думаю, что значения узла влево / вправо неверны после второго элемента в папке 1 (6 появляется дважды). Как следствие, все левые / правые значения> 6 (кроме правого для второго элемента папки 1) должны быть увеличены на единицу.
1

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню