23.06.2011 20:58, Vlad Khorsun пишет: >>> Пиши процедуры для таких задач. По-хорошему советую :) >> EB вполне устраивает. > Он не будет рекурсивным. Этому есть какие-то причины теоретического плана или технического?
>> Но без возможности рекурсии работа с деревом из него сильно ограничена. > Таки есть более другие инстурменты. По факту единственным универсальным инструментом для работы с деревьями на сервере остаются рекурсивные сохранёнки. :( Либо тащить всё на клиента. >> Даже с применением СТЕ еще удаление решается, а копирование и слияние >> уже нет. > Чёй-та ? (ц) Про удаление мы вроде бы выяснили: delete from ... where id in (with recursive...) отвалится, если связь без каскадного удаления, т. к. невозможно задать порядок удаления. Так же в СТЕ невозможно указать порядок детей. Т. е. в случае его важности придётся применять рекурсивную процедуру. Нельзя сделать поиск по путям. Опять же, такой запрос как посчитать количество дочек для каждого узла в указанной ветке будет отставать по скорости примерно на степень от прямой рекурсивной реализации (как O(n) от O(n^2) или больше). Т. е. даже простые вычисления на дереве с использованием СТЕ использовать не получится. :( Так же нет возможности организовать копирование веток, их слияние - т. е. модификацию дерева. В сухом остатке получается, что СТЕ - это базовый, но очень ограниченный механизм. Для нормальной работы придётся либо использовать сохранёнки на каждый чих, либо проделывать все манипуляции на клиенте... Да есть вроде ещё один путь: использовать ЕБ и реализовать рекурсию руками, используя GTT как стек (пока не пробовал). Но всё же было бы удобнее/проще/надёжнее/производительнее если бы рекурсию в ЕБ можно было использовать напрямую. П. С. Ну а если бы механизм СТЕ развился, чтобы покрывать хотя бы часть этих задач, было бы просто нереально круто! :) -- Александр Замараев

