Cattus Nocturnus пишет:

Узел от которого считается глубина множества подузлов задаётся
динамически во время запроса, нет нкакой возможности угадать этот
самый <<заданный>> узел, в момент вставки. Единственный способ ---
хранить глубину относительно каждого родительского узла. Но если узел
перемещается, приходится всё пересчитывать.
Его не надо угадывать. Уровень считается от корня. Для всех и каждого.
Если узел перемещается, то естественно уровень может меняться. В этом
случае в триггере на обновление узла вызываем обновление всех его потомков в цикле, те в свою очередь сделают то же самое со своими
потомками и т.д. Таким образом обходим рекурсию.

Кстати я так и не понял, что надо считать? Разницу в уровнях или длину
пути? И вообще дерево двоичное или нет? Дерево вообще одно или там целый
сад? Я тут уже замучился намекать на то, что условия задачи неполны. :)

З.Ы. Если же речь идёт о длине пути от заданного узла, тогда нужно
хранить кодированный путь от корня до каждого узла и иметь функцию,
Не катит, так ка узел относительно которого задётся поиск выбирается
произвольно.
[см. выше]
Вычисление пути при вставке/обновлении узла также элементарно: берём
префикс родителя, добавляем идентификатор вставляемого узла.

Возможно затык в производитльности, узлов на данный момент более
15000, местами образуются длинные <<списки>>.
тем, что при такой глубине вложенности может просто не хватить
varchar'а.
Не хватает, и опять же производительность.

корень -+- 0 -+- 00
        |     +- 01 -+- 010
        |            +- 011
        +- 1 -+- 10
              +- 11

[при просмотре схемы включить courier new :)]

Как найти длину пути от 00 до 011? У них общий предок 0. Отбрасываем
этот 0, получаем 0 и 11, то есть от первого узла до общего предка 1
переход, от второго - 2. Итого: 3! Всё. Никакого списка, две строковых
последовательности, функция нахождения совпадающего префикса, функции
выделения подстроки и функция вычисления длины строки.

С разъяснительным уважением,
Денис Редозубов.

З.Ы. Эк меня зацепило. Это всё потому, что не люблю я рекурсию. Хотя
готовить её умею. :)

Ответить