Лучшая практика для структуры базы данных голосования по комментариям

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

  •  03-07-2019
  •  | 
  •  

Вопрос

Я работаю над приложением PHP, в котором есть несколько объектов, которые можно комментировать.За каждый комментарий можно голосовать, а пользователи могут поставить ему +1 или -1 (например, Digg или Reddit).Прямо сейчас я планирую создать таблицу «голосов», в которой будет содержаться user_id и информация об их голосах, которая, похоже, работает нормально.

Дело в том, что каждый объект имеет сотни комментариев, которые хранятся в отдельной таблице комментариев.После загрузки комментариев мне приходится подсчитывать голоса, а затем индивидуально сверять каждый голос с пользователем, чтобы убедиться, что он может проголосовать только один раз.Это работает, но кажется, что это действительно интенсивно использует базу данных - много запросов только для комментариев.

Есть ли более простой способ сделать это, менее интенсивно использующий БД?Является ли моя текущая структура базы данных лучшим вариантом?

Чтобы быть более понятным о текущей структуре базы данных:

Таблица комментариев:

  • ID пользователя
  • object_id
  • total_votes

Таблица голосов:

  • comment_id
  • ID пользователя
  • голосование

Конечная цель:

  • Разрешить пользователю голосовать только один раз за каждый комментарий с наименьшим количеством запросов MySQL (каждый объект имеет несколько комментариев)
Это было полезно?

Решение

Чтобы быть уверенным, что каждый избиратель голосует только один раз, создайте таблицу голосов с этими полями — CommentID, UserID, VoteValue.Сделайте CommentID и UserID первичным ключом, чтобы гарантировать, что один пользователь получит только один голос.Затем, чтобы запросить голоса за комментарий, сделайте что-то вроде этого:

SELECT SUM(VoteValue)
FROM Votes
WHERE CommentID = ?

Это помогает?

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

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

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

Вы можете установить условие соединения sql, которое возвращает все голоса по комментариям, сделанным текущим пользователем для этого объекта. Если вы не получаете строк, пользователь не проголосовал.Это немного отличается от проверки каждого комментария в программе один за другим.

Что касается структуры базы данных, разделение этих вещей кажется совершенно логичным.голосование {user_id, object_id, object_type, voice_info...)

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

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