Внедрение системы ранжирования

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

Одна идея состоит в том, чтобы иметь таблицу голосов, которая регистрирует каждый голос, а затем либо немедленно, в запланированное время, либо при каждой загрузке продукта (это кажется неэффективным, но, возможно, нет) голоса подсчитываются и удваиваются между 0 и 5 обновляется в записи продукта в таблице продуктов.

В качестве альтернативы я сохраняю в таблице продуктов общий балл и количество голосов, и просто делю это, когда я отображаю, и добавляю голос к общему количеству и увеличиваю число, когда кто-то голосует.

Или есть лучший способ сделать это, о котором я не думал? Я бы хотел просто иметь поле «рейтинг» в таблице продуктов, но не могу придумать способ обновить голоса без дополнительных данных.

Опять же, целостность данных важна, но ни в коем случае не необходима, есть мысли?


person dimo414    schedule 29.06.2009    source источник
comment
Это может вас заинтересовать: evanmiller.org/ как не сортировать по среднему рейтингу.html   -  person Svante    schedule 29.06.2009


Ответы (3)


Я бы вел «счет» по вашим продуктам, но также вел бы таблицу для голосования, чтобы видеть, кто за что проголосовал. И когда кто-то голосует, вставьте голос, обновите оценку продукта.

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

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

person Oli    schedule 29.06.2009

Вы имеете в виду, что вы будете хранить голоса отдельно в таблице, а затем обновлять соответствующий рейтинг продукта в таблице продуктов с определенной стратегией? Это кажется неэффективным способом хранения. Возможно, у этой причины есть предыстория; но почему бы вам не хранить все голоса в одной таблице и продолжать ссылаться на эти голоса на соответствующий продукт. Это дает вам реальный счет времени.

В пользовательском интерфейсе вы рассчитаете среднее значение всех голосов до почти целого числа, чтобы показать. Этого было бы достаточно, не так ли? Или я что-то упускаю?

person Priyank    schedule 29.06.2009
comment
Причина, по которой я думал, что рейтинг хранится вместе с продуктом, заключается в скорости - таким образом, расчет нужно выполнять только при поступлении нового голоса, а не при каждой загрузке страницы. Это точно не забота? - person dimo414; 29.06.2009
comment
Я думаю, что сохранение их отдельно не окажет большого влияния на производительность, если индексы и соединения хорошо созданы для таблиц. Однако, если вы все еще считаете, что это негативно повлияет на производительность, подумайте об использовании представлений в базе данных. Создайте представление, используя запрос соединения между вашей таблицей продуктов и таблицей, содержащей сопоставление продуктов и рейтинг. На основе представления вы можете извлекать данные, которые должны быть относительно быстрее, если запрос хорошо оптимизирован, и вы можете правильно выполнять свои вычисления. - person Priyank; 30.06.2009

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

person Sathya    schedule 02.07.2009