Какова лучшая практика для извлечения дерева узлов из базы данных для дальнейшей визуализации?
Допустим, у нас есть таблица с комментариями пользователей. Комментарии первого уровня имеют ссылку на статью, к которой они прикреплены. Комментарии более глубокого уровня не имеют этой ссылки по конструкции, но они имеют ссылку на родительский комментарий.
Для этой структуры базы данных - какой будет наиболее эффективный способ получить все комментарии для данной статьи и затем отобразить ее в формате html? (Предположим, что у нас есть около 200 комментариев первого уровня и самый глубокий уровень 20)
2 ответа
Я обычно рекомендую дизайн под названием Closure Table.
См. Пример в моем ответе на вопрос " Какой самый эффективный / элегантный способ разбить плоский стол на дерево?".
Я также разработал эту презентацию: Модели для иерархических данных с SQL и PHP. Я разработал PHP-приложение, которое рендерит дерево за 0,3 секунды из коллекции иерархических данных с 490 тыс. Узлов.
Я писал о Closure Table здесь: Рендеринг деревьев с помощью Closure Table.
Я написал главу о различных стратегиях для иерархических данных в моей книге " Антипаттерны SQL: предотвращение ловушек программирования баз данных".
Для наиболее эффективного способа Quassnoi написал серию статей на эту тему.
- Иерархические запросы в MySQL
- Иерархические запросы в MySQL: уровень добавления
- Иерархические запросы в MySQL: добавление цепочек предков.
- Иерархические запросы в MySQL: поиск листьев
- Иерархические запросы в MySQL: поиск циклов
Я предлагаю вам прочитать первую статью и адаптировать примеры для работы с вашей конкретной таблицей, но суть заключается в том, чтобы сделать функцию, которая может проходить по строкам, которые необходимо извлечь. Вы, вероятно, также хотите уровень (глубина в иерархии), поэтому вторая статья, вероятно, также актуальна.
Другие статьи могут быть полезны, если вам нужно выполнить другие типы запросов к вашим данным. У него также есть статья Список смежности против вложенных множеств: MySQL, в которой он сравнивает высокооптимизированные запросы как для модели смежности, так и для модели вложенных множеств.