Как сделать функцию комментирования-цитаты? - PullRequest
1 голос
/ 05 февраля 2010

Мы разрешаем комментировать на нашем сайте (например, блог).Теперь мы хотим изменить это, чтобы люди могли комментировать другие комментарии.

Наша таблица выглядит примерно так:

ID    |    CommentID    |    Comment     |    User     |     Date
-------------------------------------------------------------------------
1001  |        1        |    Nice site   |     Me      |     20.01.2010
1001  |        2        |    Thx!        |     You     |     21.01.2010

Я предложил два варианта:

1) Создайте ParentCommentID и с этим решите, как будут перечислены комментарии изсверху вниз.

2) Сохраните комментарий, который вы комментируете, вместе с вашим собственным комментарием с некоторыми [QUOTE] -метками или чем-то подобным.

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

Ответы [ 5 ]

2 голосов
/ 05 февраля 2010

Я бы пошел с ParentCommentID, который действует как внешний ключ назад к CommentID этой таблицы. Это обеспечит ссылочную целостность, и вы избежите некоторого дублирования.

Если комментарий цитируют десять человек, он дублируется десять раз с вариантом 2. В первом варианте у вас есть только десять FK.

Чем больше символов вы разрешите в одном комментарии, тем больше будет дублирования в цитате с опцией 2.

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

2 голосов
/ 05 февраля 2010

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

Мое личное мнение заключается в том, что я бы сохранил комментарий с цитатой внутри него, так как это мешает людям изменять то, что они уже написали (редактирование ниндзя), чтобы запутать аргументы / обсуждения;)

1 голос
/ 05 февраля 2010

Звучит так, будто нам нужно сначала собрать больше требований!

  • Какой тип базы данных вы используете (MySQL, MSSQL и т. Д.)? Какая версия? Например, в SQL Server 2008 есть встроенный тип иерархии для таких вещей.
  • Хотите ли вы поддерживать более одного уровня вложенных комментариев (т. Е. Полные иерархические деревья ответов)?
  • Какие у вас требования к производительности? Насколько масштабируемым и надежным это должно быть?
  • Вам когда-нибудь нужно будет сообщать об ответах, или ответ будет строго частью контента? Например, vBulletin имеет простые цитируемые ответы, которые являются лишь частью сообщения, тогда как некоторые системы комментирования блогов будут предупреждать вас, когда вы получите ответ, и вы сможете просматривать ответы на свои комментарии отдельно.
0 голосов
/ 05 февраля 2010

Если идентификатор комментария не отображается на странице, вы всегда можете просто применить схему нумерации, например, IP-адрес или версию приложения. То есть CommentID 2.1 - это первый комментарий ко второму комментарию, а 2.2 - второй комментарий ко второму комментарию. Поскольку для признания CommentID 3.1.7 не потребуется большая часть строкового токена, это седьмой комментарий к первому комментарию ко второму комментарию поста. Сортировка становится легкой, когда вы разбиваете ее на целые числа.

0 голосов
/ 05 февраля 2010

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

...