Модель вложенного набора: вставка узла в конце подузлов - PullRequest
3 голосов
/ 01 февраля 2010

Существующие данные (name, lft, rgt):

Root, 1, 4
Item1, 2, 3

выглядит как:

- Root
--- Item1

Как вставить новый узел (Item2) НИЖЕ Item1? Текущая логика моей системы соответствует большинству примеров, которые я нашел в Интернете, но в результате вы получили Item2 ABOVE Item1.

- Root
--- Item1
--- Item2

Спасибо за помощь.

Ответы [ 3 ]

4 голосов
/ 01 февраля 2010

Думайте о модели вложенных множеств как о файле XML, где lft и rgt - это строки, в которых находятся начальный и конечный теги:

1  <root>
2   <item1>
3   </item1>
4  </root>

Чтобы вставить новый вложенный тег в root, вам нужно сдвинуть вниз все последующие записи:

1  <root>
2   <item1>
3   </item1>
4   <item2>
5   </item2>
6  </root>

Таким образом, вам нужно вычислить item2.lft и item2.rgt (которые являются item2.rgt + 1 и item1.rgt + 2, соответственно), а затем увеличить all lft и rgt из всех предметов, превышающих item1.rgt:

UPDATE  mytable
SET     rgt = rgt + 2
WHERE   rgt > item1.rgt

UPDATE  mytable
SET     lft = lft + 2
WHERE   lft > item1.rgt
2 голосов
/ 11 января 2012

Я не думаю, что «правильный ответ» правильный, что вы должны сделать: set item2.lft = root.rgt (4) set item2.rgt = root.rgt + 1 (5)

ОБНОВЛЕНИЕ mytable SET rgt = rgt + 2 ГДЕ rgt> = root.rgt root.rgt теперь равно 6;

ОБНОВЛЕНИЕ mytable SET lft = lft + 2 ГДЕ lft> root.rgt root.lft остается прежним(1), но у вас есть несколько корней, они будут обновлены.

Вы не можете использовать одноранговую запись для определения значений lft и rgt.

1 голос
/ 01 февраля 2010
Root, 1, 6
Item1, 2, 3
Item2, 4, 5

и используйте ORDER BY ItemName, но, конечно, это работает только для данного набора братьев и сестер.

Как вставить, см. 5-й запрос здесь: http://intelligent -enterprise.informationweek.com / 001020 / celko.jhtml; jsessionid = OOU0L1TIM1IB1QE1GHPSKH4ATMY32JVN

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

...