Перемещение с дочерними узлами:
В классических вложенных наборах whe re «left» и «right» values находятся в смежном блоке с 0..n * 2 значениями, будет ряд строк, которые перемещают либо «x» места влево, либо «x» вправо справа когда поддерево перемещается, где «x» - количество перемещаемых левых/правых значений. например.
A: 1,6
B: 2,3
C: 4,5
D: 7,8
E: 9,10
Если вы переехали «A» с потомками до между «D» и «Е», все справа от «A», но левее «Е» должен иметь свои влево/вправо индексов снижается на 6 (размер «A» с потомками):
UPDATE things
SET nsl=nsl+(
IF nsl BETWEEN 1 AND 6 THEN 6 -- A-C go forward 6
ELSE -6 -- D goes back 6
), nsr=nsr+( -- same again
IF nsl BETWEEN 1 AND 6 THEN 6
ELSE -6
)
WHERE
nsl BETWEEN 1 AND 6 -- select A-C
OR nsl BETWEEN 7 AND 8 -- select D
Перемещение без дочерних узлов является более сложным. Содержащиеся узлы должны вернуться назад, узлы после удалённого узла должны вернуться назад, а затем узлы после новой точки вставки должны идти вперед, чтобы освободить место.
Пока вы можете сделать это в том же стиле, как и выше, начинает становиться очень запутанными, и вы хотели бы рассмотреть альтернативные подходы, такие как перезапись всех/вправо значений левых вручную или с помощью другого типа схемы что упрощает эти виды операций, например, отношение полного смещения предков и потомков.
Я считал это, но если я удалю определенный узел и его дочерние узлы только для его повторного добавления, не означает ли это, что мне нужно будет хранить удаленные строки в таблице temp? Это заключение, к которому я пришел, и решил, что я слишком усложняю, поэтому я спросил. – 2009-04-11 02:28:55