Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP; DLE_Comments has a deprecated constructor in /var/www/dlefaq/data/www/dle-faq.ru/engine/classes/comments.class.php on line 21 Nested Sets :: DLE FAQ

Технический сбой

Сайт временно работает в режиме только для чтения, идут восстановительные работы. Приносим свои извинения за неудобства.

Nested Sets


     nested sets, parent_id    Все вопросы » Общие вопросы по PHP    3792

вопрос
Чем лучше Nested Sets обычного parent_id?


Nested sets вызывает нагрузку при добалении элемента в дерево, а parent_id - при выводе дерева из БД.
Соответственно при большом и ветвистом дереве, например комментов лучше nested sets, а при построении списка категорий в админке (именнт так там и есть), лучше parent_id так как добавление комментария происходит реже чем просмотр страницы с комментариями, а категории в админке вообще после настройки редко смотрят.

UPD by Sander
Рассмотрим пример работы с parent_id.
Первый запрос, перебираем все комментарии к новости с parent_id равным нулю, т.е:
WHERE post_id={$post_id} AND parent_id=0

Внутри обработчика шаблона КАЖДОГО комментария делается еще один запрос за поиск подкомментариев, т.е. получаем цикл внутри цикла:
WHERE post_id={$post_id} AND parent_id={$row['id']}


Для наглядности, например имеем древовидную структуру комментариев:
  • первый комм
    • ответ на первый комм
  • второй комм
    • ответ на второй комм 1
      • ответ на ответ на второй 1 комм 1
      • ответ на ответ на второй 1 комм 2
    • ответ на второй комм 2
  • третий комм
    • ответ на третий комм 1
      • ответ на ответ на третий 1 комм
    • ответ на третий комм 2
      • ответ на ответ на третий 2 комм
  • четвертый комм

В nested sets это займет 1 запрос, в parent_id (что я видел) на это ушло бы 14 запросов. Общий запрос, плюс по 1 запросу на каждый комментарий.
Представили себе нагрузку при выводе 50, 100 комментариев?
Почему так много запросов? Потому что в каждом комментарии выполняется запрос на проверку существования комментариев с parent_id равным id обрабатываемого комментария.
Отредактировал 30-08-2011, 12:15 - nowheremany
Причина: Ответ не полный

11 комментариев

white-master
Юзер

white-master - -

Смотря где, оба варианта имеют право на жизнь, а вам где юзать собственно?

ПафНутиЙ
Админ

ПафНутиЙ - -

Чтото какойто глюк.... не показывает заголовок с ответившим на вопрос...

Каков вопрос - таков и ответ. Просто помните об этом.

white-master
Юзер

white-master - -

А я сижу и пытаюсь понять что и как здесь.

ПафНутиЙ
Админ

ПафНутиЙ - -

Обычно, если нет ответа н вопрос, имеет место быть кнопка "ответить" )) при нажатии на которую выходит форма ответа.

Каков вопрос - таков и ответ. Просто помните об этом.

nowheremany
Эксперт

nowheremany - -

C какого хера то надо делать запрос в цикле?

1. Получаем все коменты.
2. Создаём массив и туда пихаем в parents все подчинённые сообщений.
3. Выводим массив.

Я делал в стандартном классе от ДЛЕ. Там изменения 10 строчек.

Нагрузки 0. вообще никакой.
Просто нужно подумать как сделать проще и лучше, а не гнаться за псевдо новинками.

ОТ себя могу сказать Nested Sets лучше при удалении дерева. и больше ничего.

Благодарность принимаю тут Связь

ПафНутиЙ
Админ

ПафНутиЙ - -

Это так через одно место у меня в блоге сделано дерево, Sander его видел, когда делал конвертер с parent_id на nested sets smile поэтому у него и осталось такое впечатление от parent_id

Каков вопрос - таков и ответ. Просто помните об этом.

Sander
PHP-developer

Sander - -

Не совсем понял технологию...
Т.е. все комментарии представляются в виде массива и потом с элементами массива уже работать?

SanDev.pro - мой блог.

Telegram: @sandev
Skype: Sander8804

nowheremany
Эксперт

nowheremany - -

А сейчас то ты как работаешь?

Смотри:
1. Есть у Нас $row, где вся фигня находится и выше есть получение данных с бд
2. Делаем доработку, где получаем данные массив, далее его сортируем, видоизменяем, а в то место где мы брали с бд, вставляем foreach c нашим массивом. В итоги минимум изменений и нагрузка не изменилась.

Благодарность принимаю тут Связь

Sander
PHP-developer

Sander - -

Я спросил, чтобы уточнить.
Мне кажется - это не лучшиий вариант засовывать комментарий в массив. Тяжеловат получится общий массив комментариев...

SanDev.pro - мой блог.

Telegram: @sandev
Skype: Sander8804

nowheremany
Эксперт

nowheremany - -

Он нужен для вывода, потом чиститься.

Благодарность принимаю тут Связь

nowheremany
Эксперт

nowheremany - -

ПС в 9.6 используется вывод через массив комментариев

Благодарность принимаю тут Связь

[related-news]

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

{related-news} [/related-news]
наверх