Screjet, я немного подумал над твоим вторым вариантом, и вдруг пришла в голову такая структура:
id, path_element, distance
где distance - число шагов (разность уровней вложенности) нода id и "старшего" нода path_element, через который проходит маршрут к данному ноду.
При distance=1, получим из этой схемы обычный adjacency list. Выбрав все path_element для данного id и отсортировав по убыванию distance, сразу получим полный путь. Так же элементарно находятся как все потомки, так и только непосредственные. Плюс, в отличие от nested sets не надо переписывать всю таблицу при добавлении/удалении/перемещении нода...
Вот только "космическое" число записей... оно, конечно, да... хотя для реального сайта даже при ~10E+4 нодов и средней глубине вложенности ~10E+1... в общем, обычного INT хватит надолго, а поиск по одним числовым полям должен быть шустрым... Разве такая структура не самодостаточна?