Программирование древовидного меню

При программировании меню с неограниченной вложенностью категорий возникают проблемы

№1 - как вывести ресурс, когда названия у страниц совпадают

Первое решение заключается в добавлении уникального id для страницы, как например сделано в DLE.

Второе решение - при сохранении страницы в дополнительное поле в базе данных сразу записывать полный путь и уже проверять именно его.

Третий вариант - рекурсивный поиск, т.е. /категория1/категория2/категория3/категория4/товар раскладываем url на составляющие и ищем в базе данных вначале товар - если он уникален, поиск закончен, если нет, то проверяем дальше категорию 4, потом 3 и т.п.

№2 - как быть с дублями страниц, когда товар добавлен в несколько категорий

Решение 1 - не обращать внимание и выводить как есть, это худший вариант.

Решение 2 - выделить главную категорию, оставшиеся страницы запрещать к индексированию метатегом.

Решение 3 - отказаться от чпу для товаров и страниц и выводить их отдельно на уникальной странице для каждого.

Решение 4 - отказаться от размещения в несколько категорий

№3 - как выводить категории

Когда для категорий создана отдельная таблица, проблем как правило не возникает.

Когда записи сами могут являться категориями, возникает вопрос, как отличить где категория, а где просто запись. В CMS MODX данную проблему решили добавлением логического значения, если галочка стоит, то в дереве отображать как категорию, иначе как страницу.