Предзаказ дерева обхода копия папки - PullRequest
1 голос
/ 23 февраля 2009

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

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

Кто-нибудь, кто может мне помочь с этим? Любую информацию о 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:

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

Ответы [ 2 ]

1 голос
/ 23 февраля 2009

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

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

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

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;

1 голос
/ 23 февраля 2009

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

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

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

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

...