@Richard_Ferlow
Веб-программист

Как экономично хранить в MySQL данные о просмотрах материалов конкретных?

Заказчик попросил сделать чтобы просмотры материалов были уникальными для разных IP. т.е. чтобы много раз открывая один и тот же материал на одном IPшнике счетчик не увеличивался сам собой.
Собственно я решил в отдельной таблице хранить записи о просмотре конкретного материала с конкретного ip адреса. При открытии проверять есть ли запись. а количество просмотров в записи материала хранится и увеличивается через UPDATE ... SET views=views+1

Я создал такую таблицу

CREATE TABLE IF NOT EXISTS `cms_views` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `plugin` enum('2','17','171','2007') NOT NULL,
  `object` int(11) DEFAULT '0',
  `ip` varchar(15) NOT NULL,
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1
;

Но думаю вот как сделать ее максимально компактной, так чтобы не получилось что база вырастет до 100мб чисто за счет этой таблицы за пол года.(сейчас вся база менее 2мб).и рост продолжится.

Может быть кто-то подскажет куда более изящный способ.

Как таковой задачи привязки к ip жесткой нет, задача в том чтобы кол-во просмотров было хоть сколько-то похожее на правду.
  • Вопрос задан
  • 2646 просмотров
Пригласить эксперта
Ответы на вопрос 3
silentvick
@silentvick
Кроме проверки IP есть смысл идентифицировать пользователя еще по какому-нибудь параметру, иначе все люди с одним адресом (серые подсети) будут считаться за одного человека. Можно добавить хотя-бы User-Agent, а в базе хранить хеш от IP+User-Agent.
Ответ написан
mgyk
@mgyk
Во-первых можно хранить ip как INT UNSIGNED и использовать inet_aton/inet_ntoa для конвертации. Во-вторых значительно быстрее будет использовать
INSERT INTO ... ON DUPLICATE KEY UPDATE views=VALUE(views)+views. Индекс при этом должнен быть UNIQUE INDEX(object, ip)

Если более правильно решать задачу, то просто поставьте гугл/яндекс аналитику на сайт и добавьте id материла в трекер. Таким образом получите нормальную статистику по материалам. https://developers.google.com/analytics/devguides/...
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
`id` в таких таблицах не нужен, надо хранить код статьи, IP записывать не в тексте, а в двоичной форме `ip` INT(10) UNSIGNED, и, если учитываете работу через прокси, то `proxy_ip` INT(10) UNSIGNED. Уникальный ключ при этом формируется из всех полей.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы