Стою перед выбором. Что лучше использовать из сабжа. Имеющийся классификатор пока представлен в виде совершенно произвольном, все равно придется городить идеологию с нуля.
То ли строить таблицу в стиле id-parent_id-name, то ли id-left-right-name.
Какие особенности в реализации? Какие подводные камни? Как быстрее и проще?
Не люблю это говорить, но… почему бы не спросить у гугла? Таких обсуждений сотни а то и больше (сравнения со схемами, диаграммами и т.д.). Если кратко - то всё зависит от задачи. Кстати, есть еще вариант:
id | path | name
1 | NULL | a
2 | 1 | b
3 | 1/2 | c
В расширениях есть компоненты, позволяющие работать с обоими типами хранения деревьев. Так что не вижу никаких проблем. Сам только что сделал обычное дерево (id, parent), вложенные узлы подгружаются ajax’ом по необходимости. Так как нет особой надобности выводить полное дерево (поддерево) и полные пути при каждом запросе, то этот способ оправдывает себя. В противном случае стоит задуматься о других вариантах.
То, что я описал с path, не является нетривиальным подходом. Здесь многие операции выглядят очень просто (особенно если добавить поле, содержащее непосредственного родителя). Ограничение, очевидно, на длину поля path.
Стоит помнить одно: идеального варианта хранения деревьев в реляционной базе данных быть не может Разве что взять какую-нибудь СУБД, где есть хорошая встроенная поддержка деревьев…
Я всегда пользуюсь Nested Sets, т.к. в ней удобней к примеру менять порядок записей, проверять ветки на параллельность и элементарно выбрать всех родителей. В общем всё зависит от задачи.
Кстати Nested sets чаще использует 3 поля (leftKey, rightKey, level) + изредка добавляют поле parent_id.
Целиком зависит от задачи. Сам использую Nested Sets, т.к. с parent_id когда вложенность больше двух уровней сложную выборку не сделаешь по-человечески.
В репозитории расширений YiiExt есть behavior для работы с Nested Sets, рекомендую.