Столкнулся с проблемой реализации древовидных комментариев на одном проекте, в этой заметке выкладываю своё решение.
Описание задачи
- Хранение иерархических данных (древовидных комментариев) в реляционной БД MySQL
- Простое добавление узлов/ветвей
- Выборка всего дерева одним запросом, с отсортированными в нужном порядке ветвями
В принципе, задача классическая, и сначала я её решил с помощью объединения Adjacency List и Materialized Path. Другими словами, в таблице добавлены колонки
id INT(11)
parentid INT(11)
mpath VARCHAR(255)
В mpath хранился полный путь ветки в дереве, например /1/3/4/5/8/9, где через знак "/" перечислялись ID комментария.
При таком подходе очень легко добавлять новые комментарии практически любого уровня вложенности. Выборка при этом производилась запросом:
SELECT *
FROM messages
WHERE postid=$postid
ORDER BY mpath ASC
Проблема возникла при росте числа комментариев. Читать полностью »