2010-12-13 9 views
0

Я занимаюсь разработкой веб-сайта, который будет иметь 200 000 страниц. Существует также раздел обзора, который показывает наиболее популярные, самые высокие и т. Д. Документы. Однако этот раздел станет почти статичным через пару недель после запуска. Поэтому я также хотел бы внедрить фильтрующую систему, которая покажет сегодняшние, на этой неделе самые популярные статьи этого месяца, как и youtube.Фильтровать популярные предметы используя день/неделю/месяц

Так же, как это:

http://www.youtube.com/videos?c=2

Как я должен выполнять эту функцию? Мне нужна другая таблица, которая будет иметь новую запись для каждого документа каждый день?

DocId, дата, view_count, рейтинг

Так что получит сегодняшнюю строку для фильтрации с использованием дня, или вычислить неделю (7 строк) для фильтрации с помощью недели? Это кажется неэффективным. Есть ли у вас какие-либо предложения?

Я использую стек LAMP, кстати.

Спасибо,

+0

помните о проблемах безопасности, если вы не хотите, чтобы один пользователь мог, например, генерировать 1000 просмотров в секунду. Удачи в реализации способа остановить решительного злоумышленника, хотя .. –

ответ

0

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

1

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

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

EDIT

Но, возможно, вы имеете в виду самый популярный сегодня, не самый популярный, который был добавлен сегодня?

В этом случае у меня нет ответа.

1

Самый прямой подход - сохранить метку времени и идентификатор ресурса каждый раз, когда ресурс отображается в recent_views(what, when). Ежедневные/еженедельные/месячные графики могут быть созданы с соответствующими предложениями WHERE, такими как WHERE when > $beginOfPeriod AND when < $endOfPeriod.

По соображениям производительности вы можете суммировать значения каждую ночь, сохранять суммы в отдельных таблицах, например daily_views(what, sum), и обрезать исходную таблицу.

0

Я бы сделал это с помощью компилятора. Youtube, вероятно, тоже это делает, учитывая количество трафика и время ответа.

Принцип легко понять. Вы регистрируете каждый просмотр или рейтинг в таблице page_view. Вы определяете периоды, в которых происходит компиляция (ежечасно, ежедневно, еженедельно, ежемесячно). Каждый раз, когда вы попали в хорошее время (например .: конец дня), вы выполняете компилятор, который по существу выполнить запрос а-ля ...

SELECT * FROM page_view WHERE date > $from_date AND date < $to_date 

... и сохранить результат. Вероятно, это работает лучше в работе cron.

В следующий раз, когда вам нужно отобразить информацию, вы можете просто получить сохраненный результат и отобразить его без повторных вычислений. Существует множество методов хранения, которые вы можете использовать: таблицу MySQL (например, page_view_compiled), memcached и т. Д.

Смежные вопросы