>>Я бы посоветовал преобразование делать не средствами БД, а отдельной программкой. Просто
>>считать имеющуюся таблицу в виде дерава в память, расставить левые и
>>правые маркеры и сохранить.
>те триггер написать, который в случае добавления-удаления узлов должен запускаться?
Не, если надо существуешее дерево из одного формата в другой перегнать, то это проще чем-то внешним сделать: java, perl, еще_чего_по_вкусу.
>
>>Только там есть еще одна засада, про которую автор скромно умолчал -
>>попробуйте добавить новый узел.
>
>А что будет? можно ведь в этом случае просто опять пересчитать все
>с 0
>Или еще какие-то подводные камни?
Можно. Подводный камень в обновлении всей таблицы. Т.е. если это, к примеру, описание меню какой-то программы или структура филиалов организации - то можно, меняется редко и размер не большой.
А если это чего-то совсем развесистое и бысто меняющееся - то лучше потратить нескольно запросов на чтение в классическом формате, чем каждый раз обновлять все записи.
Алгоритм добавления, кстати, будет очень простой:
Пусть мы решили, что надо добавить новый узел в узлу с id=123, причем последним дитем. Тогда:
-- сдвинуть все следующие ветки
update treetable set left=left+2,right=right+2
where right > (select right from treetable where id=123);
-- расширить нашего родителя
update treetable set right=right+2 where id=123;
-- вставить новый узел
insert into treetable (title, left, right) value
('новый ребенок',
(select right-2 from treetable where id=123),
(select right-1 from treetable where id=123));
Это же можно использовать и для импортирования старой таблицы - просто пройти рекурсивно по старому дереву.
>>И это решается только для деревьев с
>>ограниченной высотой и ограниченным количеством веток у узла.
>Вот! можно об этом поподробнее?
Надо представить себе максимально возможное дерево при наших ограничениях и проставить левые/правые маркеры у всех его узлов. И потом выкинуть те, которые сейчас не нужны. Получатся индексы с дырками. Причем эти дырки будут точно соотвествовать вставляемым в будущем узлам.
Минусы "дырявой" нумерации описаны в статье - некоторые трюки не будут работать, но основные фичи останутся.