Голосовать за статью. Как спланировать базу

зверек

Новичок
Голосовать за статью. Как спланировать базу

Здравствуйте.

Стоит задача устроить голосования под каждой, вывешиваемой на сайт статьей. Ну знаете, на многих сайтах есть такое "проголосуйте за статью" и селект из 5 или 10 позиций.
Я думаю, как мне устроить под это дело базу. Как потом обрабатывать результаты? Сколько чел выбрало 1, сколько 2, сколько 5 и т.д.?
Ничего путного в голову не приходит, кроме как состряпать таблицу с графами:

id статьи| 1 |2 | 3 | 4| 5 |

Это если оценка по пятибальной шкале. И заносить данные от голосования в соответсвующие графы...Потом графики уже строить и пр...
Но мне кажется это какой-то тупой вариант.

Как вообще делают обычно?

Спасибо.
 

HEm

Сетевой бобер
одна таблица для правил:
id статьи|диапазон оценок

отдельную таблицу для результатов:
id статьи|vote

если нужно, можно расширить (например для анализа от накрутчиков), добавить votedt, voteip

как реализуешь диапазон - твое дело, можешь например сделать строку типа "1,2,3,4,5", можешь сделать 5 записей в таблице для каждого ответа
 

Falc

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

гоша

Guest
HEm

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

table articles
id | title | text | ...

table votes
article_id | user_uid | vote | timestamp

В таблице votes отражается тот факт, что юзер с уникальным номером user_uid поставил статье article_id оценку vote.

Составной уникальный ключ (article_id,user_uid) защищает от накруток.

Всю нужную статистику (группировки итп) можно извлечь из таблицы votes.
 

HEm

Сетевой бобер
Резюме:
реализаций - туча, отталкиваться нужно от поставленных задач
 

зверек

Новичок
угу. понятно. Спасибо!

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

Как обычно это делается?
 

HEm

Сетевой бобер
1. добавь поле с ip-адресом голосующего и не давай ему больше голосов
как вариант - добавить поле datetime и не давать голосовать определенное время (скажем с одного ip не чаще чем раз в два часа)
 

AlexVN

Новичок
Можно, например, пресекать повтороное голосование с одного и того-же IP в течении часа.
Можно добавлять в cookies запись - проголосовал и пресекать голосование в пределах одной сессии броузера.
Но тут дело такое, что кому очень будет надо - тот накрутит отключив cookies или голосуя с разных IP.
 

HEm

Сетевой бобер
да никому оно не надо, не трать силы попусту, поставб отбой по ип и хватит вполне
 
Сверху