Внедрение системы рейтинга
Я видел несколько вопросов о том, как обезопасить и предотвратить злоупотребление системами ранжирования (например, просмотр фильмов, продуктов и т. Д.), Но ничего о реальной реализации. Чтобы упростить этот вопрос, безопасность не беспокоит меня, все люди, получающие доступ к этой системе, пользуются доверием, а злоупотребление системой ранжирования, если это произойдет, тривиально и проще отменить, чем вызвать. В любом случае, мне любопытно, как хранить голоса.
Одна мысль состоит в том, чтобы иметь таблицу голосов, в которой регистрируются все голоса, а затем либо сразу, в запланированное время, либо при каждой загрузке продукта (это кажется неэффективным, но, возможно, нет), голоса подсчитываются и удваиваются между 0 и 5. обновляется в записи товара в таблице товаров.
В качестве альтернативы я сохраняю в таблице продуктов общий балл и количество голосов, и просто делю их, когда отображаю, и добавляю голос к общему количеству и увеличиваю число, когда кто-то голосует.
Или есть лучший способ сделать это, чего у меня нет? Я хотел бы просто иметь поле "рейтинг" в таблице продуктов, но не могу придумать, как обновить голоса без каких-либо дополнительных данных.
Опять же, целостность данных важна, но ни в коем случае не нужна, есть мысли?
3 ответа
Я бы вел "оценку" с вашими продуктами, но также вел бы таблицу голосования, чтобы увидеть, кто за что проголосовал. И когда кто-то голосует, вставьте голос, обновите счет продукта.
Это позволяет выполнять быструю сортировку, и у вас также есть таблица, чтобы можно было пересчитать баллы по результатам и остановить двойное голосование.
Не нужно ждать, чтобы написать голосование и обновить результаты. Это создаст проблемы, и если он будет действовать как традиционная система (намного больше читает, чем пишет), это не даст вам никаких преимуществ.
Я согласен с Оли. Кроме того, вы можете кэшировать свой счет. Таким образом, вы обновляете оценку продукта в кеше, и ваше приложение всегда выбирает значение кеша. Таким образом, даже при обновлении страницы вы получите последний результат без попадания в базу данных.
Вы имеете в виду, что вы будете отдельно хранить голоса в таблице, а затем обновлять соответствующий рейтинг продукта в таблице продукта с помощью определенной стратегии? Это кажется неэффективным способом хранения. Может быть, есть причина для этой причины; но почему бы вам не захотеть хранить все голоса в одной таблице и продолжать ссылаться на эти голоса для соответствующего продукта. Это дает вам счет в реальном времени.
В пользовательском интерфейсе вы будете вычислять среднее значение всех голосований до целого числа, которое нужно показать. Этого было бы достаточно, не так ли? Или я что-то упустил?