Реализация базы данных "Самые популярные" - PullRequest
5 голосов
/ 01 сентября 2010

Мне было интересно, как лучше всего реализовать функцию " наиболее просматриваемые " (например, youtube) в моей базе данных.

Позвольте мне объяснить функцию " наиболее просматриваемые " немного лучше: В основном я хочу перечислить наиболее посещаемые страницы / видео / и т. Д. За этот день / неделю / месяц, см. http://www.youtube.com/charts/videos_views для примера.

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

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

Ps. Я специально смотрю на то, как рассчитать время, скажем, самое просматриваемое в этом месяце, без огромной таблицы, сохраняющей каждое представление с указанием даты и времени. Любая идея приветствуется.
Pps. Я использую Mysql и PHP, дополнительные советы для этих двух очень приветствуются.

Ответы [ 5 ]

3 голосов
/ 01 сентября 2010

имеют следующие таблицы: 1. просмотров 2. views_hourly_summary 3. views_daily_summary 4. views_monthly_summary 5. views_alltime_summary

запускать задание cron через следующие интервалы:

  1. запускать каждый час и предварительно агрегировать представления для этого часа из таблицы представлений и сохранять предварительно агрегированный результат в таблице views_hourly_summary, а также обновлять таблицу views_alltime_summary

  2. выполняется в конце рабочего дня и предварительно агрегирует представления для этого дня из таблицы часов и сохраняет предварительно агрегированный результат в таблице views_daily_summary

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

Далее при получении результатов вам нужно будет выполнить некоторые математические операции следующим образом:

  1. Например, если вы хотите получить представления за последние 4 часа, вы должны получить данные за 3 полных часа из часовой таблицы, а для остальных данных - из таблицы представлений следующим образом:

    выберите item_id, sum (views) в качестве views из views_hourly_summary где час между concat (left (now () - интервал 3 часа, 14), '00: 00 ') и concat (left (now (), 14), '00: 00') сгруппировать по item_id

    союз

    выберите item_id, count (1) как просмотры из просмотров где datetime между (now () - интервал 4 часа) и concat (left (now () - интервал 3 часа, 14), '00: 00 ') или datetime> concat (left (now (), 14), '00: 00 ') сгруппировать по item_id

1 голос
/ 01 сентября 2010

Сначала я бы попытался отследить пользователей, используя cookie, давая им уникальный идентификатор как при посещении, так и при посещении.Это должно помочь с идентификацией.

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

Я бызатем настройте службу для чтения из этой очереди и обработки информации.Это позволит вам обновить / изменить эту логику, не затрагивая сайт.Вы, вероятно, захотите выполнить несколько обновлений и т. Д., Чтобы люди не связывались с результатами - умышленно или случайно.Кроме того, абстрагируя эту обработку от основного сайта, вы не замедляете время запроса страницы - вы можете сделать логику для определения / обновления представлений элементов настолько сложной, насколько вам нравится.

1 голос
/ 01 сентября 2010

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

0 голосов
/ 10 августа 2016

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

По сути, просто разделите время на интервалы, скажем, по 5 минут каждый.Имейте запись в db с одним столбцом для videoID, и одним столбцом, идентифицирующим определенный интервал времени, и затем один столбец для того, сколько просмотров видео получило за тот интервал времени.Затем, если вы хотите узнать, сколько просмотров видео было получено за последний день, просто суммируйте все те, где интервал / отметка времени больше, чем день назад.Это не совсем оптимально, потому что последний интервал будет только частично заполнен представлениями, что дает вам представления на некоторое дополнительное время или немного меньшее время в зависимости от того, когда вы его вычисляете.Но этого достаточно для решения, которое занимает две секунды.Чтобы рассчитать годовые просмотры, сделайте то же самое, за исключением полностью отдельной таблицы, где временные интервалы составляют, скажем, 1 день, чтобы вам не приходилось хранить данные и суммировать более 100 000 пятиминутных интервалов, чтобы получить полный год.

Просто убедитесь, что в [videoId, timestamp] есть составной индекс, чтобы вы могли быстро суммировать просмотры.

0 голосов
/ 01 сентября 2010

Вдобавок к моей голове, у меня была бы таблица ItemViews, которая отображает количество просмотров для идентификатора элемента (при условии, что существует только один тип элемента). Таблица может иметь 2 столбца: ItemId и ViewCount. Когда новая функция получает свое первое представление, я вставляю новую строку в эту таблицу и инициализирую ViewCount равным 0. Затем я увеличиваю счетчик в этой строке каждый раз, когда обнаруживаю новое представление.

Я мог бы тогда вычислить статистику из этой таблицы. Если есть понятие категорий (например, на Youtube), я мог бы объединить идентификаторы категорий с ItemId и сгруппировать таким образом значения моих просмотров.

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