@Ska1n

Система рейтинга постов

Добрый день. Пытаюсь написать свою небольшую цмску на джанге, посоветуйте, как лучше реализовать систему рейтинга постов на сайте. Интересует сторона хранения рейтинга на сайте. Как лучше создать модель(модели), в которой будут хранится записи о голосовании постов. Почесал голову, подумал о таком: при создание поста в ветку РЕЙТИНГ_ПОСТА вносить такие параметры:
---------------------------------------------------------------------------------
ID_ПОСТА   |   ID_АВТОРА   |   ВСЕГО_ПРОГОЛОСОВАЛО   |   ОБЩАЯ_СУММА_РЕЙТИНГА   |
---------------------------------------------------------------------------------
   253     |        4      |            0            |             0            |
---------------------------------------------------------------------------------

когда пользователь нажимает на ±/посмотреть результат, происходит запись добавление на+1 в колонку ВСЕГО_ПРОГОЛОСОВАЛО(если не смотрел результат) и осуществляет +1 или -1 в колонку ОБЩАЯ_СУММА, так же, осуществляется запись в другую ветку базы:
----------------------------------------------------------------------------------
ID_ПОЛЬЗОВАТЕЛЯ   |   ID_ПОСТА   |   ПЛЮС   |   МИНУС   |   ПОСМОТРЕЛ_РЕЗУЛЬТАТ   |
----------------------------------------------------------------------------------
          5       |     253      |     1    |      0    |           0             |
----------------------------------------------------------------------------------

в этой базе хранится индивидуалка к каждому пользователю и посту, чтобы пользователь не смог повторно проголосовать… с одной стороны, вроде бы функционально получится, а вот с другой, как представлю, сколько запросов к БД будет идти от такого нагромождения… может есть у кого лучше решение этого вопроса?
  • Вопрос задан
  • 3435 просмотров
Пригласить эксперта
Ответы на вопрос 3
sirko_el
@sirko_el
Я бы посоветовал Вам хранить рейтинг в два этапа. Допустим голосовать можно один раз в день за любое количество постов. Тогда вам нужно две таблички:
1. Табличка с дневными данными, и соответствующая ей модель(DayVote).
.----------------------------------------------------------------------------------------
| ID_ПОЛЬЗОВАТЕЛЯ | ID_ПОСТА | ОЦЕНКА | ПОСМОТРЕЛ_РЕЗУЛЬТАТ |
-----------------------------------------------------------------------------------------.
2. Табличка с агрегированными данными и соответствующая ей модель(PostVote):
.----------------------------
| ID_ПОСТА | ОЦЕНКА |
-----------------------------.
Эта табличка должна заполняться по крону автоматом 1 раз в сутки, собирая и агрегируя данные из DayVote, после чего DayVote нужно очистить.

Приимущества такого подхода:
1. Максимальное количество записей в таблицах будет равно количеству постов+ количеству проголосовавших за сегодня. А это гораздо меньше чем общее количество голосов.
2. Простота схемы данных.
3. Можно расширить DayVote служебными данными (как-то IP, USER_AGENT и т.п.), и в скрипте, обновляющем PostVote и проводить автоматический анализ и фильтрацию голосов, не боясь за то, что база разрастется.
Недостатки:
1. Усложняется процесс выбора количества голосов для поста (его теперь нужно выбирать из двух таблиц).
2. Нужно логировать запуски крон скрипта, и следить за логами, чтобы агрегирование выполнялось «гладко».
Ответ написан
@Dialog
Во втором варианте сделайте 1 поле, RATING к примеру, там будете хранить либо 1, либо -1.

Затем индекс по ID_ПОСТА + SQL SUM по этому полю. В итоге все должно шустро отрабатывать, если сервер будет напрягаться, то можно попробовать кешировать или же сделать еще одну таблицу, в которую будете писать и триггером раз в N времени данные записывать в основную (из которой вы показываете данные).
Ответ написан
Комментировать
@marazmiki
Укротитель питонов
Лучше не изобретать велосипед, а попробовать найти готовые решения, создатели которых уже переболели всеми детскими болезнями.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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