Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как лучше сделать голосование?
 
 автор: DEM   (07.08.2011 в 09:19)   письмо автору
 
 

У меня есть таблица в которой хранятся сообщения и у неё есть поля `plus`, `minus`, `ratting` и `ratID`.

Если пользователь ставит плюс, то увеличивается параметр `plus` и `ratting`, а в поле `ratID` (тип TEXT) прибавляется что-то вроде ",ID-пользователя," (то есть ID пользователя будет между запятыми).
С одной стороны у нас только одна таблица и воторой мы смотрим параметры и если пользователь голосует - проверяем, есть ли его ID в поле `ratID`, если есть - голос не проходит, нет - проходит.


Правильно ли это? Или лучше сделать еще одну таблицу в которой будет просто ID-статьи и ID-пользователя, который проголосовал (для каждого голоса своя запись).


Как лучше?



PS. я слышал про то, что таблицы должна быть атомарными и прочее-прочее, вот поэтому, в принципе, и спрашиваю :) Но с другой стороны во втором варианте в таблице с голосами может оказаться очень много записей...

  Ответить  
 
 автор: Valick   (07.08.2011 в 09:23)   письмо автору
 
   для: DEM   (07.08.2011 в 09:19)
 

лучше второй вариант, значения в поле через запятую это плохо
методика головсований

  Ответить  
 
 автор: cheops   (07.08.2011 в 09:53)   письмо автору
 
   для: DEM   (07.08.2011 в 09:19)
 

Второй хорош, если вам нужно отслеживать активность конкретного пользователя и групп пользователей (например, по времени и периодам). Если такие статистические подробности не нужны, лучше ограничиться первым, интегральным вариантом. Иначе объемы могут быть действительно впечатляющими и их придется сворачивать и архивировать по периодам или удалять старые голосования - в общем целая история.

  Ответить  
 
 автор: Valick   (07.08.2011 в 10:03)   письмо автору
 
   для: cheops   (07.08.2011 в 09:53)
 

Если такие статистические подробности не нужны
нужно отслеживать только один голос от юзера и не давать ему проголосовать дважды за одно и тоже

  Ответить  
 
 автор: cheops   (07.08.2011 в 10:17)   письмо автору
 
   для: Valick   (07.08.2011 в 10:03)
 

Хм... да, что-то я отвлекся, тогда второй вариант наверное будет лучшим решением, это разделяет задачи учета голоса и контроля от повтороного голосования. Т.е. таблицы с голосами остаются компактными (ну или по крайней мере меньше), а это важно, так как результаты голосования показываются чаще, чем происходит сам процесс голосования. Чем меньше объем таблицы - тем быстрее происходит обработка запроса.

DEM, а каждое сообщение - это и есть голос? Т.е. оставляя сообщение пользователь голосует в обязательном порядке?

  Ответить  
 
 автор: DEM   (07.08.2011 в 12:53)   письмо автору
 
   для: cheops   (07.08.2011 в 10:17)
 

Нет,
У анс есть таблица, к примеру comments в которой хранится ID пользователя, текст комментария, к какой статье относится, ну и тому подобные данные и плюс ко всему поля `plus`, `minus`, `ratting` и `ratID` (по последнему как раз вопрос). И когда любой авторизированный пользователь голосует ЗА или ПРОТИВ у нас меняются plus, minus и ratting, а в поле ratID добавляется еще один ID (проголосовавшего)
Мне просто надо проверить, голосовал пользователь или нет и всё. А количество голосов ЗА, ПРОТИВ и ОБЩИЙ РЕЙТИНГ отображаются вместе с самим комментомю, поэтому поля plus, minus и ratting я думаю лучше оставить в таблице comments

  Ответить  
 
 автор: Valick   (07.08.2011 в 15:24)   письмо автору
 
   для: DEM   (07.08.2011 в 12:53)
 

т.е. у вас после того как пользователь проголосовал, невозможно установить "за" он или "против"
мягко говоря ай-ай-ай
я бы вообще оставил только поле ratting
а в доп таблице
id_com | id_user | ocenka
и первичный ключь на оба поля id_com | id_user

  Ответить  
 
 автор: DEM   (07.08.2011 в 15:32)   письмо автору
 
   для: Valick   (07.08.2011 в 15:24)
 

Ну мне как бы и не интересно как проголосовал пользователь)))

Значит переделаю немного :)

  Ответить  
 
 автор: Valick   (07.08.2011 в 17:02)   письмо автору
 
   для: DEM   (07.08.2011 в 15:32)
 

Ну мне как бы и не интересно как проголосовал пользователь)))
1) это не повод чтобы усложнять себе жизнь, пусть даже не осознавая того
2) сегодня не интересно, а завтра - неизвестно...
3) вообще-то правилом хорошего тона было бы дать возможность пользователю передумать и проголосовать иначе, т.е. выставить другую оценку, это же все-таки не тест какой-нибудь, ваш вариант такого не может себе позволить.
4) в моем варианте можно выставлять любые оценки, а в вашем? ;) + ко всему рейтинг можно просчитать по любому алгоритму абсолютно не напрягаясь

  Ответить  
 
 автор: DEM   (07.08.2011 в 17:06)   письмо автору
 
   для: Valick   (07.08.2011 в 17:02)
 

Больше всего зацепил второй пункт :)
Вы правы, сделал так :)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования