Дерево: NestedSets vs CTreeView

Коллеги!

Стою перед выбором. Что лучше использовать из сабжа. Имеющийся классификатор пока представлен в виде совершенно произвольном, все равно придется городить идеологию с нуля.

То ли строить таблицу в стиле id-parent_id-name, то ли id-left-right-name.

Какие особенности в реализации? Какие подводные камни? Как быстрее и проще?

Не люблю это говорить, но… почему бы не спросить у гугла? :) Таких обсуждений сотни а то и больше (сравнения со схемами, диаграммами и т.д.). Если кратко - то всё зависит от задачи. Кстати, есть еще вариант:




id | path | name

1  | NULL | a

2  | 1    | b

3  | 1/2  | c



И у этого варианта тоже есть несколько вариантов :)

Да спрашивал у гугла, но потянуло спросить именно здесь, именно в отношении yii: насколько удобно использовать ту или иную модель.

А вот вариант, предложенный вами, с путем, он тоже реализован в yii? Это уже факультативный интерес, достаточно нетривиальный подход всё-таки.

В расширениях есть компоненты, позволяющие работать с обоими типами хранения деревьев. Так что не вижу никаких проблем. Сам только что сделал обычное дерево (id, parent), вложенные узлы подгружаются ajax’ом по необходимости. Так как нет особой надобности выводить полное дерево (поддерево) и полные пути при каждом запросе, то этот способ оправдывает себя. В противном случае стоит задуматься о других вариантах.

То, что я описал с path, не является нетривиальным подходом. Здесь многие операции выглядят очень просто (особенно если добавить поле, содержащее непосредственного родителя). Ограничение, очевидно, на длину поля path.

Стоит помнить одно: идеального варианта хранения деревьев в реляционной базе данных быть не может :) Разве что взять какую-нибудь СУБД, где есть хорошая встроенная поддержка деревьев…

Я всегда пользуюсь Nested Sets, т.к. в ней удобней к примеру менять порядок записей, проверять ветки на параллельность и элементарно выбрать всех родителей. В общем всё зависит от задачи.

Кстати Nested sets чаще использует 3 поля (leftKey, rightKey, level) + изредка добавляют поле parent_id.

Задача как раз такая, что изменять дерево придется нечасто, а больше читать. Я так понимаю, Nested Sets для этого случая - самое то.

Целиком зависит от задачи. Сам использую Nested Sets, т.к. с parent_id когда вложенность больше двух уровней сложную выборку не сделаешь по-человечески.

В репозитории расширений YiiExt есть behavior для работы с Nested Sets, рекомендую.

Я использую ENestedSetBehavior.

Подскажите как подготовить TreeStructuru для отображения в cTreeView?

Должно получиться вот так:




$tree = array(

    array(

        'text'     => 'Node 1',

            'children' => array(

                 array(

                    'text'     => 'Node 1.1',

                        'children' => array(

                             array(

                                'text' => 'Node 1.1.1',

                             ),             

                        )

                 ),    

                 array(

                    'text'     => 'Node 1.2',

                        'children' => array(

                             array(

                                'text' => 'Node 1.2.1',

                             ),             

                        )

                 ),           

            )

    ),

);