Cattus Nocturnus пишет:
Узел от которого считается глубина множества подузлов задаётся
динамически во время запроса, нет нкакой возможности угадать этот
самый <<заданный>> узел, в момент вставки. Единственный способ ---
хранить глубину относительно каждого родительского узла. Но если узел
перемещается, приходится всё пересчитывать.
Его не надо угадывать. Уровень считается от корня. Для всех и каждого.
Если узел перемещается, то естественно уровень может меняться. В этом
случае в триггере на обновление узла вызываем обновление всех его
потомков в цикле, те в свою очередь сделают то же самое со своими
потомками и т.д. Таким образом обходим рекурсию.
Кстати я так и не понял, что надо считать? Разницу в уровнях или длину
пути? И вообще дерево двоичное или нет? Дерево вообще одно или там целый
сад? Я тут уже замучился намекать на то, что условия задачи неполны. :)
З.Ы. Если же речь идёт о длине пути от заданного узла, тогда нужно
хранить кодированный путь от корня до каждого узла и иметь функцию,
Не катит, так ка узел относительно которого задётся поиск выбирается
произвольно.
[см. выше]
Вычисление пути при вставке/обновлении узла также элементарно: берём
префикс родителя, добавляем идентификатор вставляемого узла.
Возможно затык в производитльности, узлов на данный момент более
15000, местами образуются длинные <<списки>>.
тем, что при такой глубине вложенности может просто не хватить
varchar'а.
Не хватает, и опять же производительность.
корень -+- 0 -+- 00
| +- 01 -+- 010
| +- 011
+- 1 -+- 10
+- 11
[при просмотре схемы включить courier new :)]
Как найти длину пути от 00 до 011? У них общий предок 0. Отбрасываем
этот 0, получаем 0 и 11, то есть от первого узла до общего предка 1
переход, от второго - 2. Итого: 3! Всё. Никакого списка, две строковых
последовательности, функция нахождения совпадающего префикса, функции
выделения подстроки и функция вычисления длины строки.
С разъяснительным уважением,
Денис Редозубов.
З.Ы. Эк меня зацепило. Это всё потому, что не люблю я рекурсию. Хотя
готовить её умею. :)