Мне нужно определить, посетил ли уже пользователь страницу, для отслеживания уникальных просмотров страниц.
Я уже реализовал кеш заголовков HTTP, но теперь мне нужно оптимизировать SQL-запросы.
Визит является уникальным, когда:
- пара:
page_id
+ user_id
находится в таблице visit
- или пара:
page_id
+ session_id
найдено
- или:
page_id
+ [ip
+ useragent
] - (это тема для другого обсуждения, будь то только ip или ip + useragent)
Итак, у меня есть таблица отслеживания посещений пользователей:
visit:
page_id
user_id
session_id
useragent
ip
created_at
updated_at
Теперь при каждом посещении пользователя (которое не попадает в кэш) я буду обновлять строку, если она существует. Если есть какие-либо затронутые строки, я добавлю новое посещение таблицы.
Это один или два запроса (при условии, что кеш будет работать, в основном два запроса), но количество строк несколько ограничено. Возможно, было бы лучше сохранить все посещений, а затем очистить базу данных, например, в. месяц?
Вопросы:
- как должна быть построена таблица
visit
(ключи, индексы, отношения к user
и page_views
таблицам). Некоторые из важных полей могут быть нулевыми (например, user_id), тогда как насчет индексов? Нужен ли многостолбцовый первичный ключ?
- Какой самый быстрый sql-запрос для поиска уникального пользователя?
- это здравый подход?
Я использую PostgreSQL и PDO (Doctrine ORM).
Все мои сеансы хранятся в одной БД.