Правильный подход к просмотру уникальных новостных статей - PullRequest
1 голос
/ 14 июля 2011

Я смотрел на разные способы подойти к этому, но я хотел бы метод, который не позволяет людям обойти это.Просто нужен простой, легкий метод для подсчета количества просмотров различных новостных статей, которые хранятся в базе данных:

    id    |    title    |    body    |    date    |    views    
     1      Stack         Overflow     2010-01-01   23
  1. Сеанс - могут ли они не просто очистить данные браузера и перезагрузить страницудля другого взгляда?Любой способ остановить это?
  2. Таблица базы данных IP-адресов - Тонны записей, может снизить производительность
  3. Файл журнала - та же проблема, что и в базе данных, однако я видел много примеров

Для системы, критичной к производительности, и для обеспечения точности, какой метод мне следует рассмотреть дальше?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 14 июля 2011

Если вы хотите выяснить, сколько уникальных посетителей у вас на данной странице, вам необходимо сохранить информацию, уникальную для каждого посетителя где-то в вашем приложении, для ссылки.

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

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

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

Если вам ДЕЙСТВИТЕЛЬНО нужно иметь почти 100% точные цифры, то лучше всего регистрировать IP-адреса уникальных посетителей каждой страницы. Это обеспечит вам наиболее точный подсчет. Это довольно экстремально, и если вы можете получить точность в 5 +%, я бы точно выбрал куки.

1 голос
/ 14 июля 2011

Я думаю, что для упрощения вы должны использовать чужую вычислительную мощность, поэтому по этой причине вы должны зарегистрироваться до Google Analytics и вставить их код на свои страницы, которые вы хотите отслеживать.

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

0 голосов
/ 14 июля 2011

Другое предложение:

Когда пользователь заходит на ваш сайт, зарегистрируйте свой IP-адрес в таблице и отправьте cookie с уникальным идентификатором. Сохраните этот уникальный идентификатор в таблице вместе со ссылкой на запись IP-адреса. Таким образом, вы сможете рассчитать более точный счет (и внести коррективы в ваш окончательный номер)

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

Если вы готовы пожертвовать лучшей точностью, то это может быть решением:

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

CREATE TABLE `article_views` (
  `article_id` int(10) unsigned NOT NULL,
  `doy` smallint(5) unsigned NOT NULL,
  `ip_address` int(10) unsigned NOT NULL
) ENGINE=InnoDB

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

CREATE TABLE `summary_article_uniques_2011` (
  `article_id` int(10) unsigned NOT NULL,
  `doy` smallint(5) unsigned NOT NULL,
  `unique_count` int(10) unsigned NOT NULL,
  PRIMARY KEY (`article_id`,`doy`),
  KEY(`doy`)
) ENGINE=InnoDB 

Примеры запросов:

Уникальный счет для конкретной статьи в день:

SELECT unique_count FROM summary_article_uniques_2011 WHERE article_id=? AND doy=" . date('z') . "

Количество дней в сутки для конкретной статьи:

SELECT unique_count FROM summary_article_uniques_2011 WHERE article_id=?

Подсчитывает по всему сайту, самые популярные статьи сегодня:

SELECT article_id FROM summary_article_uniques WHERE doy=? ORDER BY unique_count DESC LIMIT 10 // note this query will not hit an index, if you are going to have a lot of articles your best bet is to add another summary table/index "unique_count"
...