Вроде бы простое решение ввело меня в ступор. Задача — организовать рейтинги разных частей сайта, таких как пользователи, комментарии, отдельные страницы, видео ролики. Комментарии и пользователи должны иметь два варианта рейтинга — плюс и минус. Остальные части — 5 звёзд рейтинга.
Есть три идеи:
1. Создать таблицу с полями id_юзера_изменившего_рейтинг, значение_которое_юзер_внёс(+1/-1, или 1,2,3,4,5), имя_приложения_в_котором_изменили_рейтинг(новости, комментарии, пользователь) и уникальный_id_записи_в_приложении.
Записи будут вида:
307|-1|'comments'|3425
26|1|'comments'|3425
141|4|'news'|22
2. Почти то же самое что и первый вариант, только не записывать каждое изменение рейтинга, а перезаписывать конечный результат рейтинга у приложения, то есть к каждому приложению добавить поле общего рейтинга.
Записи будут вида:
307|'comments'|3425
26|'comments'|3425
141|'news'|22
А в таблице приложений comments и news уже будет считаться общий рейтинг для каждой записи.
3. К каждому приложению делать таблицу с рейтингами(неудобно при добавлении новых приложений).
1. Таблица с каждым голосом общая — до тех пор, пока будет позволять нагрузка (в большинстве проектов — навсегда).
2. Рейтинг каждой записи хранить в таблице приложения у каждой записи. Скажем, храним там количество голосов и сумму. Или количество и среднее — кому как нравится, и в зависимости от того что делают чаще — просматривают (тогда количество и среднее — удобнее сортировать и выводить значение) или голосуют (тогда количество и сумму)
Алгоритм соответственно такой:
— проверяем, может ли юзер голосовать (IP, cookie, сессии, дата предыдущего голосования и т.д. )
— даём\не даём ему возможность голосовать
— проверяем снова, если юзер жульничает — можем предупредить
— записываем голос, если все верно
— обновляем количество и сумму\среднее