Не нравятся результаты поиска? Попробуйте другой поиск!

Nested Sets


     29.08.2011    Общие вопросы по PHP    2385

вопрос
Чем лучше 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
2

18 | 16

white-master - 29 августа 2011 23:13 - Юзер

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

ПафНутиЙ
1065

3396 | 2434

ПафНутиЙ - 29 августа 2011 23:20 - Админ

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

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

white-master
2

18 | 16

white-master - 29 августа 2011 23:21 - Юзер

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

ПафНутиЙ
1065

3396 | 2434

ПафНутиЙ - 29 августа 2011 23:24 - Админ

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

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

nowheremany
192

1659 | 1292

nowheremany - 30 августа 2011 10:12 - Эксперт

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

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

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

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

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

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

ПафНутиЙ
1065

3396 | 2434

ПафНутиЙ - 30 августа 2011 10:24 - Админ

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

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

Sander
1126

1637 | 1204

Sander - 31 августа 2011 02:11 - Эксперт

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

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

ICQ: 404-037-556
Skype: Sander8804

nowheremany
192

1659 | 1292

nowheremany - 31 августа 2011 06:29 - Эксперт

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

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

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

Sander
1126

1637 | 1204

Sander - 31 августа 2011 13:50 - Эксперт

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

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

ICQ: 404-037-556
Skype: Sander8804

nowheremany
192

1659 | 1292

nowheremany - 31 августа 2011 15:34 - Эксперт

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

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

nowheremany
192

1659 | 1292

nowheremany - 25 июля 2012 14:37 - Эксперт

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

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

Чтобы комментировать - войдите или зарегистрируйтесь на сайте
[related-news]

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

{related-news} [/related-news]