DeusModus
@DeusModus

Голосование за сущности (когда голосов и сущностей много)

Задался вопрос об оптимальном способе хранения голосования за некоторые сущности. Классический вариант это счетчик у сущности(что-то вроде votes_count) и отдельная таблица votes(user_id, vote).
Однако при таком подходе если оставлять возможность голосовать за все сущности вечно, при количестве, например 500 000 штук, за которые можно голосовать и среднем количестве голосов 3 получаем 1 500 000 тысяч записей в таблице vote.
Вопрос — есть ли лучший способ хранения этих данных? И как вы поступаете в ситуациях с высокопосещаемыми ресурсами и голосовалками за те же комменты?

PS: На хабре вроде нельзя посмотреть в старой теме, что ты голосовал за коммент, соответственно таблица чистится по истечении тайм-аута. Видимо для экономии места и ускорении выборок.
  • Вопрос задан
  • 2917 просмотров
Решения вопроса 1
alekciy
@alekciy
Вёбных дел мастер
1 500 000 это не много.

Вариантов работы с большим количеством данных множество. Зависит от того, какие цифры нужно получить. К примеру, если не нужно помнить кто конкретно за что конкретно голосовал, то можно данные агрегировать. Т.е. взять сущность, посчитать сколько голосов отдано за период Х и запись в базу одной запись, а из таблицы с голосами для данной сущности за этот период голоса удалить.

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

P.S. Можно. Я без проблем нашел свой голос 2-ей давности.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
patashnik
@patashnik
Можно, например, хранить не каждый голос, а какое-то усреднённое значение у самой сущности.
Ответ написан
Комментировать
sergiks
@sergiks Куратор тега Алгоритмы
♬♬
До сих пор поступал именно описанным в вопросе «классическим» способом.

Но для nosql архитектуры, с которой только знакомлюсь на основе Amazon SDB, можно прямо в записи сущности собирать id проголосовавших пользователей. Работает для малого числа голосов за одну сущность — для примера с харбракомментариями. Для +\- варианта придётся в два поля видимо писать id: кто минусует, и кто плюсует. Либо изобретать синтакс типа id+5 или id-3 для +5 или -3 баллов соотв.

Хорошо бы представлять себе реальное использование этих баллов, и предполагаемые рамки использования.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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