Алгоритм выбора наиболее популярных мест из базы данных - PullRequest
4 голосов
/ 25 апреля 2010

У нас есть сайт, который содержит базу данных мест. Для каждого места наши пользователи могут выполнить одно из следующих действий, которые мы записываем:

  1. Просмотр - Просмотр профиля
  2. РЕЙТИНГ - Оцените по шкале от 1 до 5 звезд
  3. ОБЗОР - Просмотрите его
  4. ЗАВЕРШЕНО - Отметьте, что они были там
  5. СПИСОК ЖЕЛАНИЙ - Отметьте, что они хотят пойти туда
  6. ЛЮБИМЫЙ - Отметьте, что это один из их любимых

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

  • вид
  • отзывы
  • avg_rating
  • завершено
  • 1028 * лист желаний *
  • любимый

То, что мы хотим сделать, это генерировать списки лучших мест, используя вышеуказанную информацию. В идеале мы хотели бы иметь возможность генерировать этот список, используя относительно простой SQL-запрос, без необходимости выполнять какую-либо работу по вычислению дополнительных полей или мест в стеке друг против друга. При этом, поскольку у нас есть только около 50 000 мест, мы можем запустить ночное задание cron, чтобы вычислить некоторые поля, такие как ранжирование по разным категориям, если это будет иметь существенное значение в общих результатах наших призовых мест.

Буду признателен, если вы дадите несколько советов о том, как нам следует подумать о том, как поднять лучшие места наверх, какие критерии нам следует придавать более весомому значению, и, учитывая эту информацию, предложить, как должен выглядеть запрос MySQL. для выбора 10 лучших мест.

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

Заранее спасибо за помощь и советы!

Ответы [ 3 ]

2 голосов
/ 25 апреля 2010

Точная формула для фаворита должна исходить от вас, мы назовем ее f (x).
Для фактической реализации я бы добавил поле Popular_score, которое я бы вычислял, как вы сказали по ночному заданию cron, используя f (x) для каждой строки.

Тогда это просто случай "выбрать название места из таблицы по популярности_score desc".

Ладно. Давайте сделаем удар Popular_score = (ИЗБРАННОЕ * 3 + ЗАВЕРШЕНО * 2 + WISHLIST) * РЕЙТИНГ * ПРОСМОТР / AVG_VIEWS_OF_ALL_PROFILES

1 голос
/ 25 апреля 2010

У меня нет мнения о том, как взвешивать вещи.

Тем не менее, почему бы просто не добавить столбец популярности в таблицу местоположений? Внезапно ваш SQL-запрос невероятно прост.

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

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

Если вы умны, вы можете разработать достаточно простую формулу, чтобы популярность можно было отслеживать в режиме реального времени. Например, если мы заботимся только о средних оценках, вы можете изменить среднюю оценку только тремя переменными: текущая средняя оценка, количество раз, которое объект был оценен, и новое значение рейтинга.

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

...