Поиск наиболее активных тем или игр - PullRequest
1 голос
/ 01 июня 2009

Какая метрика для нахождения самой активной ветки форума или игры в вашей базе данных?

Представьте, что вы управляете форумом вроде 4chan. Вы хотите, чтобы самые активные темы появлялись на первой странице. Вы пробовали сортировать темы по last_updated, но результат хаотичен: потоки, которые вы видите при каждом обновлении, фактически случайны, и переход на вторую страницу может показать вам много одинаковых результатов. Должен быть более стабильный алгоритм определения активных потоков!

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

Что касается бонусных баллов, подумайте о том, как создать SQL-запрос для максимальной активности или как реализовать его в серверном кеше. Лучшие ответы не требуют задания cron для обработки данных.

Ответы [ 5 ]

1 голос
/ 01 июня 2009

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

SELECT p.id, p.title, COUNT(c.created_at) as count
FROM posts p, comments c
WHERE p.id = c.post_id
AND c.created_at > ***TIME YOU DETERMINE AS HOT***
GROUP BY p.id, p.title
ORDER BY count DESC

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

** обратите внимание, что все, что вы добавляете в выборку, должно быть также в группе по выражению **

0 голосов
/ 01 июня 2009

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

Вы можете вспомнить точное время, когда пользователь нажал на первую страницу, и упорядочить по last_updated, что меньше или равно этой дате:

SELECT  t.id, t.name, p.last_updated
FROM    threads t
JOIN    posts p
ON      p.thread_id = t.id
        AND p.last_updated <= @last_updated
ORDER BY
        p.last_updated DESC

Это даст вам стабильный набор результатов.

Обновлять переменную только тогда, когда пользователь обновляет главную страницу (а не нажимает page 1, page 2 и т. Д.)

0 голосов
/ 01 июня 2009

код Psuedo:

Выберите идентификатор, количество Групп по темам и порядок даты по количеству

0 голосов
/ 01 июня 2009

Проблема, в некоторой степени связанная с вашей, называется " Проблема Бритни Спирс ", которая связана с трудностью алгоритмического определения горячих тем. С точки зрения ИИ, это сложная проблема, потому что, во-первых, не существует фиксированного количества тем, поэтому о классификации не может быть и речи. А поскольку тренды время от времени меняются, модель должна принимать во внимание фактор (типичная нейронная сеть этого не делает, если вы не говорите о нейронной сети с временной задержкой). Наконец, то, что актуально, а что нет, является субъективным и отличается от человека к человеку, что означает, что вам может потребоваться учесть прошлые интересы человека ( Совместная фильтрация ).

0 голосов
/ 01 июня 2009

Конечно, вы не можете рассчитывать на last_updated (само по себе), вы должны использовать reply_count / play_count, view_count / plays_count для всех активных потоков за все время. и вам может понадобиться добавить поле, например now_playing_count для каждой игры, чтобы определить самую популярную игру сейчас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...