В зависимости от того, что вы хотите сделать, это может быть невероятно сложной проблемой, но вот мой взгляд на самый простой способ (например, что я могу бросить вместе за 10 минут, прежде чем я уйду с работы ;-P)
Я бы попробовал подход в стиле StackOverflow / HotOrNot и сохранил бы их рейтинг как целое число без знака.
PRODUCTS(
id,
category_id,
name,
rating INTEGER UNSIGNED NOT NULL DEFAULT 0
);
Затем в вашей таблице «ГОЛОСОВАНИЕ» вы сохраняете Голосование (вверх / вниз). Я думаю, что таблица для вашей таблицы «VOTES» выглядит хорошо (хотя я бы использовал перечисление в качестве типа данных SCORE или какую-то стратегию, чтобы гарантировать, что голос не может быть обработан через XSS. Например, кто-то изменяет голосование так, что их голосование +10 000 вместо +1, тогда это было бы не круто)
Для небольшого забавного приложения вы, вероятно, можете обойтись путем увеличения или уменьшения счетчика, когда пользователь щелкает, но если вы делаете что-то с стремлением к масштабированию, тогда вы будете делать подсчет голосов и ранжирование через некоторый пакетный процесс. это работает каждые 10-15 минут.
Также на этом уровне вы бы начали использовать алгоритм для взвешивания значений голосов. Например, если один и тот же пользователь голосует (вверх или вниз) за один и тот же продукт более одного раза в день (или один раз каждый), то голоса после первого не должны учитываться при расчете ранга продукта.
Например, вот как работает алгоритм ранжирования Quora
Если пользователь является «опытным пользователем» или имеет более активную учетную запись, возможно, его голос важнее, чем голос нового пользователя. Я думаю, что на Yelp, если у вас не более одного или двух отзывов, ваш рейтинг и отзывы не будут учитываться, пока вы не встретите минимальное количество отзывов. Действительно, небеса предел.
PS. Я также рекомендовал бы проверить эту книгу О'Рейли о некоторых стратегиях для решения таких проблем