Отслеживание просмотров страниц и отображение связанных данных - PullRequest
0 голосов
/ 02 января 2011

Я хочу отслеживать, какие статьи пользователь читает на сайте.

Затем с этими данными можно узнать:

1) - N лучших статей за последний час / день / неделю / месяц

2) - показать рекомендации («пользователи, которые читают и читают это»)

3) - аналогично (1), но для конкретного раздела на сайте

Поскольку у сайта высокий трафик (> 1 млн просмотров / день), я не могу использовать СУБД для этого.

Я начал смотреть на NoSQL (в частности, на Кассандру), и, поскольку для меня все это ново, я не уверен, что это то, что мне нужно или нет.

Возможно, я не первый, кто нуждается в чем-то подобном, но не может найти ссылки / статьи, дающие мне подсказки о том, как сделать что-то подобное. Является ли NoSQL лучшим подходом? Любые советы по модели данных?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 12 октября 2011

Хмм easyrec обладает именно той функциональностью, которая вам нужна, и может управлять действиями 1M (использует mysql). Заходите в ветке форума о макс. Действиях: тема форума

0 голосов
/ 02 января 2011

SQL сделает это довольно счастливо. Миллион просмотров в день - это всего десять в секунду; большинство баз данных легко справятся с несколькими сотнями.

У вас уже должна быть таблица для статей и таблица для пользователей; вам нужно будет создать таблицу Read, которая представляет собой отношение «многие ко многим» между пользователями и статьями и, возможно, отметку времени. Каждый раз, когда вы читаете статью, вы добавляете в таблицу «Чтение» запись, в сущности говоря: «Пользователь x только что прочитал статью y».

Затем вы можете задать такие вопросы, как «Сколько раз статью читали за последнюю неделю» или «Сколько статей просматривает рядовой читатель по четвергам».

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

Edit:

Я испытываю желание отослать вас к http://nosql.mypopescu.com/post/1016320617/mongodb-is-web-scale - то, что «NoSQL» не уменьшает объем необходимой работы или магическим образом ускоряет его работу (хотя часто облегчает использование большего количества оборудования если , то вы можете сформулировать свою проблему в форме, которая ему нравится).

"Пользователи, которые читают это, также читают:"

SELECT
  Article.id, OtherArticle.id as oid, COUNT(*) AS cnt
FROM
  Article
  JOIN Read AS R1 ON Article.id=R1.article_id
  JOIN Read AS R2 ON R1.user_id=R2.user_id AND NOT R1.article_id=R2.article_id
  JOIN Article AS OtherArticle on R2.article_id=OtherArticle.id
GROUP BY
  OtherArticle.id, OtherArticle.title
ORDER BY
  cnt DESC, OtherArticle.title ASC

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

...