Какова лучшая практика для выборки дерева узлов от базы данных для дальнейшего рендеринга?

Скажем, у нас есть таблица с комментариями пользователей. Комментарии первого уровня имеют ссылку на статью, к которой они присоединены. Комментарии более глубокого уровня не имеют этой ссылки дизайном, но у них есть ссылка на, он - родительский комментарий.

Для этой структуры базы данных - каков был бы самый эффективный способ выбрать все комментарии для данной статьи и затем представить его в формате HTML? (Давайте предположим, что у нас есть приблизительно 200 комментариев первого уровня и deepiest уровня 20),

6
задан Bill Karwin 26 July 2010 в 18:56
поделиться

2 ответа

Я обычно рекомендую дизайн под названием Closure Table .

См. Пример в моем ответе на Какой самый эффективный / элегантный способ преобразовать плоскую таблицу в дерево?

Я также разработал эту презентацию: Модели для иерархических данных с SQL и PHP . Я разработал приложение PHP, которое визуализирует дерево за 0,3 секунды из набора иерархических данных с 490 тыс. Узлов.

Я писал о Closure Table здесь: Рендеринг деревьев с Closure Table .

Я написал главу о различных стратегиях для иерархических данных в своей книге SQL-антипаттерны: избегая ловушек программирования баз данных .

10
ответ дан 8 December 2019 в 15:58
поделиться

Для наиболее эффективного способа Quassnoi написал серию статей на эту тему.

Я предлагаю вам прочитать первую статью и адаптировать примеры для работы с вашей конкретной таблицей, но суть в том, чтобы сделать функцию, которая может перебирать строки, которые вам нужно получить. Вероятно, вам также нужен уровень (глубина в иерархии), поэтому вторая статья, вероятно, тоже актуальна.

Другие статьи могут быть полезны, если вам нужно сделать другие типы запросов к вашим данным. У него также есть статья Adjacency list vs. nested sets: MySQL, в которой он сравнивает высоко оптимизированные запросы как для модели смежности, так и для модели вложенных множеств.

5
ответ дан 8 December 2019 в 15:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: