Решая очередную головоломку, начал понимать, что nested set далеко не панацея в построении деревьев. Старый добрый метод id->parent_id тоже имеет право жить. Сегодня я, потомственный садовод, расскажу вам о видах деревьев, а точнее сравню их.
Nested Set
Данный вид деревьев на первый взгляд очень симпатичен и интересен. В нём можно искать пути, с лёгкостью определять дочерние элементы или родительские, а можно даже найти от одной ветви всех потомков, до самого последнего уровня. Но вот беда - данный вид деревьев очень прихотливы. Чтобы переместить пару разноуровнеых узлов - придётся перестроить всё дерево. Всем функционалом на одной странице особо не побалуешься - запросов на вас посыпется не мало, собирать устанете.
В большинстве случаев готовые решения работают с основными полями, но увы, приспосабливать их так, чтобы уменьшить запросы придётся именно вам. А дополнительных полей там может быть огого.
Данное решение замечательно если вы, по большей части, отображаете дерево полностью (или хотя бы его обширные ветви) или если поиск пути по ветвям поможет сохранить время (например, строка состояния древовидного каталога).
id->parent_id
Замечательное и неприхотливое дерево. При перемещении ветвей много не требует и перестраиваться даже не подумает. Но вот большие уровни вложенности для него втягость. Точнее они будут втягость более для вашего языка программирования. Простроить в нём ветвь "от и до" так просто не выйдет - придётся немного напрячь мозги и создать рекурсивную функцию для этого. Для тех кому лень думать - ряд рекурсивных запросов (при слове рекурсия уже хочется бежать подальше, плохое это удобрение).
Уровни тоже придётся считать самим и их просчёт не лучше поиска пути. Вобщем, всех прелестей лёгкого получения информации, рассчитанной более чем на 2 уровня дерева, не выйдет.
Рекомендуется использовать в простеньких решениях, где реально - 2 уровня отображени - это просто предел.
Гибрид
Данное дерево совмещает в себе оба варианта. Но, на самом деле, не даёт идеального решения. В итоге это всё тот же nested_set, просто некоторые функции (например получения родителя) становятся попроще.
Итог: выбирайте деревья с умом! Работайте с ещё большим умом и не забывайте окучивать! Помните - это лишь в абстракции деревья. Работать с этими конструкциями стоит не более чем с простым хэшем. Они ведь и хранятся как обычный список. Не стоит городить из деревьев в БД деревья в массивах.
Удачи вам в выращивании яблоневого-грушевого сада!