Многие сайты, которые используют какой-либо рейтинг популярности, делают это, используя стандартный алгоритм для определения рейтинга, а затем затухают вечно с течением времени. То, что я обнаружил, работает лучше для сайтов с меньшим трафиком, так это множитель, который дает бонус к новому контенту / активности - он по сути тот же, но счет перестает меняться после определенного периода времени.
Например, вот псевдо-пример того, что вы можете попробовать. Конечно, вы захотите настроить вес, который вы приписываете каждой категории, исходя из вашего собственного опыта работы с сайтом. Комментарии редки, но от пользователя требуется больше усилий, чем для избранного / голосования, поэтому они, вероятно, должны получить больший вес.
score = (votes / 10) + comments
age = UNIX_TIMESTAMP() - UNIX_TIMESTAMP(date_created)
if(age < 86400) score = score * 1.5
Подход такого типа даст бонус к новому контенту, загруженному в прошедший день. Если вы хотите подходить к этому аналогичным образом только для контента, который недавно был добавлен в избранное или прокомментирован, вы можете просто добавить некоторые ограничения WHERE в свой запрос, чтобы получить оценку из БД.
На самом деле есть две серьезные причины НЕ рассчитывать этот рейтинг на лету.
- Требование к вашей БД получить все эти данные и выполнить вычисления для каждой загрузки страницы, чтобы просто изменить порядок элементов, приводит к дорогостоящему запросу.
- Возможно, меньшая ошибка, но если у вас относительно небольшая активность на сайте, небольшие изменения в рейтинге могут привести к довольно резкому движению контента.
Таким образом, вам придется либо периодически кэшировать результаты, либо настраивать задание cron для обновления нового столбца базы данных, содержащего этот рейтинг, по которому вы оцениваете.