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

StackOverflow https://stackoverflow.com/questions/582315

Вопрос

Я разрабатываю потоковое отображение сообщений для приложения PHP/MySQL, например комментариев на Slashdot или Youtube, и мне интересно, как мне следует упорядочивать комментарии и разделять их на страницы, чтобы на странице можно было, скажем, разместить 20 комментариев. но они все равно вложены.

Комментарии в моем приложении могут быть вложены на неограниченном уровне, и эта структура представлена ​​с использованием, как мне кажется, таблицы отношений смежности, отдельной таблицы, содержащей строку для каждой пары, которая имеет какие-либо отношения восходящего/нисходящего характера.В этой таблице отношений есть CHILDID, PARENTID и LEVEL, где уровень 2 означает «прадедушка» и так далее.

Мой вопрос касается как удобства использования для конечного пользователя, так и практичности построения эффективного запроса к БД.Я рассмотрел такие варианты:

  • Разделение результатов на страницы по дате, независимо от положения в дереве, чтобы все комментарии в определенном диапазоне дат отображались вместе, даже если они не отображаются у своих родителей.Любой комментарий, который был опубликован в то же время, что и его родительский элемент, появится на той же странице, и в этих случаях мы можем отображать их «вложенными», но будут комментарии, которые остались без родителей.Это, вероятно, приемлемо - так это делается в комментариях на YouTube - комментарий, сделанный намного позже, чем его родительский элемент, не появится на той же странице, что и его родительский элемент (если родительский элемент не находится на последней странице), а вместо этого появится с другие новейшие комментарии.

  • Получение узлов в том же порядке, как при обходе дерева.При этом приоритет отдается древовидной структуре, а не дате, хотя одноуровневые элементы по-прежнему можно сортировать по дате.Преимущество этого заключается в том, что ответы всегда размещаются вместе с их родительским элементом (комментарием, на который они отвечают), даже если этот родительский элемент находится на нескольких страницах от самых последних комментариев.Именно так все и делается в таких приложениях, как блог icanhascheezburger.Мне не нравятся некоторые вещи в этом, например, то, что каждый испытывает искушение добавить ответ на самую большую ветку дерева.

  • Третий вариант — поступить так же, как Slashdot, где он не разделяет комментарии на страницы, а имеет одно большое дерево — чтобы сохранить управляемый размер страницы, вместо этого он начинает отбирать комментарии с низким рейтингом.

Я думаю, что первым будет самый простой запрос к БД с учетом моей таблицы отношений, но он будет открыт для других идей.

Некоторые такие системы всех трех типов каким-то образом ограничивают уровень вложенности — это достаточно легко сделать, поскольку после рекурсии по уровням X все остальное можно объединить вместе, как если бы они были одноуровневыми.Например, комментарии YouTube отображаются только на одном уровне.Другие системы иногда сообщают: «Уровень вложенности превышен» примерно через 5 уровней.

Это было полезно?

Решение

Я предполагаю, что причина, по которой вам вообще нужны вложенные комментарии, заключается в том, что ваши пользователи, как правило, хотят читать одну интересующую цепочку за раз.То есть у вас есть основания полагать, что пользователи будут создавать цепочки последовательных мыслей и/или то, что обсуждается в одной теме, заинтересует одних пользователей, но не других.

Если это так, то я не знаю, почему вам может понадобиться произвольно разделить ветку на страницы по дате (вариант 1).Использование одной страницы с отсеиванием комментариев с низким рейтингом (вариант 3) кажется немного суровым и может отбить у пользователей желание оставлять комментарии.Это может быть хорошо, если у вас такая масса аудитории, как SlashDot, но это может быть нежелательно для сайтов с более типичным уровнем посещаемости.

Возможно, у вас может быть что-то вроде варианта 2, когда все темы находятся на одной странице, но если цепочка становится слишком длинной, она сворачивается в одну ссылку, которая переводит пользователя на страницу, посвященную этой теме.Альтернативно, длинные темы можно сократить, чтобы просто отображать их темы и авторов, каждый из которых, в свою очередь, ссылается на соответствующее место на специальной странице для обсуждения.

Я подозреваю, что тенденция пользователей оставлять не относящиеся к делу комментарии в самой большой ветке вызвана тем, что пользователи не хотят утруждать себя прокруткой, чтобы найти конец ветки или найти более подходящую ветку.Автоматически сжимая длинные цепочки, оставляя корень всех тредов на одной странице управляемой длины, пользователи могут легко сканировать интересующую цепочку и добавлять к ней при желании.

Другие советы

Я думаю, что вам нужно хранить иерархические данные в базе данных.Начать стоит с этих статей:Статья на сайте Статья на сайте MySQL

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top