Мне тоже пришлось реализовать рекурсивные комментарии.
Я сломал голову вложенной моделью, позвольте мне объяснить, почему:
Допустим, вы хотите комментарии к статье.
Давайте назовем корневые комментарии комментариями, непосредственно прикрепленными к этой статье.
Давайте звоним, отвечаем, комментируем комментарии, которые являются ответом на другой комментарий.
Я заметил (к сожалению), что хочу, чтобы корневые комментарии были упорядочены по дате,
НО я хотел, чтобы ответные комментарии были заказаны, дата asc !!
Парадоксал !!
Таким образом, вложенная модель не помогла мне уменьшить количество запросов.
Вот мое решение:
Создать таблицу комментариев со следующими полями:
ID
article_id
parent_id (обнуляемый)
date_creation
электронная почта
whateverYouLike
последовательность
глубина
3 ключевых поля этой реализации: parent_id, sequence и глубина.
parent_id и глубина помогают вставлять новые узлы.
Последовательность - это поле реального ключа, это своего рода эмуляция вложенной модели.
Каждый раз, когда вы вставляете новый корневой комментарий, он кратен x.
Я выбираю x = 1000, что в основном означает, что я могу иметь максимум 1000 вложенных комментариев (это единственный недостаток, который я нашел
для этой системы, но этот предел можно легко изменить, этого достаточно для моих нужд).
Самый последний корневой комментарий должен быть с наибольшим порядковым номером.
Теперь ответьте на комментарии:
у нас есть два случая:
ответить для корневого комментария или ответить для ответного комментария.
В обоих случаях алгоритм одинаков:
возьмите последовательность родителей и найдите ее, чтобы получить ваш порядковый номер.
Затем вы должны обновить номера последовательностей, которые находятся ниже родительской последовательности и выше базовой последовательности,
это последовательность корневого комментария чуть ниже соответствующего корневого комментария.
Я не ожидаю, что вы все это поймете, так как я не очень хороший объяснитель,
но я надеюсь, что это может дать вам новые идеи.
(По крайней мере, это сработало для меня лучше, чем вложенная модель = меньше запросов, что является настоящей целью).