Как реализовать функцию статистики просмотра страницы за некий период?
Не знаю как правильно подойти к реализации функции, с помощью которой я смогу выдавать пользователям о количестве просмотрев некой страницы. Важно, что бы это была статистика за день/месяц/год/всё время. Конкретно как реализовать количество просмотров за всё время не составит труда, но как реализовать это за некий период? Я ведь не могу хранить какой-то словарь с датами и количеством просмотрев... А если нужно будет реализовать за несколько лет? :
Дополнительно:
Важно, что бы это была статистика за день/месяц/год/всё время.
Первое что нужно - определитесь с минимальной статистической единицей, если это день - значит храните сумму за день, табличка соответственно будет что-то типа:
id, page_id, date, views;
Соответственно если нужен меньший таймфрейм - дата будет уже дататайм. Далее простой джоин, груп с аггрегацией и sum()
- Спасибо, уже часть реализовал. Остался вопрос, как правильно будет прикрутить, что бы оно каждый день отдельный закидывало в БД?
Имею ввиду, я подумал, что лучшим вариантом будет хранить тип [id, views, date, pageId]. При просмотре страницы брать рекорд по id соответствующей страницы + текущая data и делать инкремент количества просмотров. Так мы сможем изолировать состояние статистических данных на уровне БД и не будем выносить это на уровень приложения
А далее я не знаю как его правильно реализовать.
Я решил прикрутить BackgoundService, который каждый день ровно в 00:01 будет вносить в БД новые записи о всех продуктах по Id. Т.е., будут брать ВСЕ id ВСЕХ страниц и под каждую страницу создаваться новый рекорд в БД с указанием id этой страницы + текущая дата. Что-то типа Bulk запроса (Для PostgreSql, который я юзаю, такого нет, по этому там либо json/jsonb (под Dapper) , либо цикл)И вот с этим пунктом уже запутался. Вроде бы должно работать, но пока не уверен в правильности реализации.
-
Остался вопрос, как правильно будет прикрутить, что бы оно каждый день отдельный закидывало в БД?
А? Просто при каждом удачном выборе для показа делаете INSERT INTO stat (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1; и делаете уникальным ключом дату+айди.
- ThunderCat, насколько я понял, это что-то типа CREATE IF NOT EXISTS?
- Nik Faraday, да, только update if exists
- Мне кажется, даже это слишком сложно. Никаких сумм никуда не закидывается, просто при каждом вызове страницы в конце добавляется вставка этого вызова в БД.
Записывать можно URL, параметры, инфо о браузере, время и т.п. Об ID записи вообще не надо думать, просто таблица с автогенерацией ID. Никакие ON DUPLICATE тогда не нужны.
Для статистики - COUNT, WHERE, ORDER BY и т.д. (я про MySQL, но, полагаю, и в POSTGRES есть такое)
И ради бога, никаких библиотек, это чрезвычайно просто в реализации. - Natalia Baženova, там больше проблема в том, что статистика должна считаться за каждый день для каждой страницы. При просмотре статистики можно выбрать период просмотра выборки. И тут уже как-то костылями крыть это всё. А записывать в БД можно всё что угодно, хоть даже IP адреса юзеров, только по какой дате их записать? Какой страницы?
И да, вы тут забываете ещё о защите от Ctrl + R или подобных действий
- Nik Faraday, В таблице делаете поле типе DATETIME, по умолчанию CURRENT TIMESTAMP. Таким образом, оно будет заполняться автоматически.
При выборке за день задаете WHERE DATE(имя_поля)=требуемая_дата. Вот и статистика за день.
Никаких костылей здесь нет.
Кстати, IP имеет смысл записывать, хоть оно и не идентифицирует юзера, но несет много информации.
Если кто-то нечаянно нажмет CTRL-R, статистике это абсолютно не повредит.
Если же кто-то будет усердно нажимать эту комбинацию в течение часа, он явно заслужил наше дополнительное внимание. Такого юзера легко выделить и убрать его заходы из таблицы. - Natalia Baženova, спасибо. Можете вынести это всё в отдельный ответ, я помечу решением. Мне нравится ход ваших мыслей)
- Nik Faraday, добавила ответ
При каждом вызове страницы в конце добавляется вставка этого вызова в БД.
Записывать можно URL, параметры, инфо о браузере, время и т.п. Об ID записи вообще не надо думать, просто таблица с автогенерацией ID. Никакие ON DUPLICATE тогда не нужны.
Для статистики - COUNT, WHERE, ORDER BY и т.д. (я про MySQL, но, полагаю, и в POSTGRES есть такое)
В таблице делаете поле типе DATETIME, по умолчанию CURRENT TIMESTAMP. Таким образом, оно будет заполняться автоматически.
При выборке за день задаете WHERE DATE(имя_поля)=требуемая_дата. Вот и статистика
за день.
Кстати, IP имеет смысл записывать, хоть оно и не идентифицирует юзера, но несет много информации.
Если кто-то нечаянно нажмет CTRL-R, статистике это абсолютно не повредит.
Если же кто-то будет усердно нажимать эту комбинацию в течение часа, он явно заслужил наше дополнительное внимание. Такого юзера легко выделить и убрать его заходы из таблицы.
Ответы:
Я ведь не могу хранить какой-то словарь с датами и количеством просмотрев...
Почему нет? Для этого давно существуют базы данных.
(только не "словарь", а "данные")
- Хорошо, как вы предлагаете это реализовать?
- Nik Faraday, что значит как? Для начала научиться работать с БД.
- Nik Faraday, привинтить или изобрести мониторинг
у микрософта это называется Application Insights
- Refguser, сударь, серьёзно? А я по вашему, где данные храню? В почтовом ящике, или под матрасом?
- сергей кузьмин, ну, тут скорее нужен собственный велосипед
- Nik Faraday, у дот нет есть сек
https://docs.datalust.co/docs/an-overview-of-seq
его и прикручивайте
есть конечно прометеус и инфлюкс и элестик
их и прикручивайте
если помогло - я положу в ответы вы отметите решением - Nik Faraday, я без понятия где ты что хранишь. Но если бы знал по БД - не написал того, что я процитировал.
Вон ThunderCat даже разжевал, хотя я и не уверен, что это стоило делать.
- Refguser, так вопрос о реализации, а не о том, куда мне это закидывать. Если есть нормальный вариант реализации, я с радостью почитаю. А эти расскажи о существовании БД просто пустой диалог
- Nik Faraday, человек, знающий о существовании воды не сомневается в существовании возможности плавания.
Человек, знающий о существовании БД не сомневается в существовании возможности вести какую угодно статистику.
Человек, хоть чуть-чуть умеющий работать с БД уже сможет хоть что-то накидать и спросить совета насчёт правильности и тп.Ты же хочешь хочешь что бы за тебя всё сделали. С этим на фриланс.
- Refguser, причём тут работа с бд... Господи, что ты несёшь? При чём тут фриланс?
Умник, почему ты находишься на форуме? Судя по твоим вопросам ты не знаешь что такое css? У вас вот вопрос по css. Вы что, не знаете о сущестовании фриланса? Как вы посмели вопрос то тут задать? Идите на фриланс, там вопросы задавай умник
Тут подходит какая-нибудь аналитическая СУБД. Например, ClickHouse практически для этого и создавался (Click Stream + Ware House).
Хранить можно следующим образом:
1. Есть общая таблица по посещениям/визитами с примерно такой структурой [page_id, visit_date] (больше и не надо)
2. Для хранения статистики создаешь материализованные представления для дня/недели/года
У них есть тестовые данные для плейграунда сбора аналитики по посещениям/хитам - https://clickhouse-docs.vercel.app/docs/en/getting...
- Что-то под PostgreSql нужно. У меня оно на linux'е развернуто, по этому менять будет очень напряжно
- Nik Faraday, тогда можно попробовать так:
1. Таблица одна - [page_id, date, visits_count] - id страницы, дата (только дата без времени) посещения, кол-во посещений
2. На каждый заход на страницы вызывается UPDATE SET visits_count += 1 WHERE date = today() AND page_id = id
3. Для годовых/месячных/дневных делаешь материализованное представлениеP.S. - т.к. годовые/месячные/дневные больше не обновляются, то можно создать для них отдельную таблицу и хранить уже подсчитанные значения там. Обновлять скриптом по окончании периода.
- Сергей Соловьев, вырезка из другого моего ответа:
Остался вопрос, как правильно будет прикрутить, что бы оно каждый день отдельный закидывало в БД?
Имею ввиду, я подумал, что лучшим вариантом будет хранить тип [id, views, date, pageId]. При просмотре страницы брать рекорд по id соответствующей страницы + текущая data и делать инкремент количества просмотров. Так мы сможем изолировать состояние статистических данных на уровне БД и не будем выносить это на уровень приложения
А далее я не знаю как его правильно реализовать.
Я решил прикрутить BackgoundService, который каждый день ровно в 00:01 будет вносить в БД новые записи о всех продуктах по Id. Т.е., будут брать ВСЕ id ВСЕХ страниц и под каждую страницу создаваться новый рекорд в БД с указанием id этой страницы + текущая дата. Что-то типа Bulk запроса (Для PostgreSql, который я юзаю, такого нет, по этому там либо json/jsonb (под Dapper) , либо цикл)И вот с этим пунктом уже запутался. Вроде бы должно работать, но пока не уверен в правильности реализации.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для реализации функции статистики просмотра страницы за определенный период времени, вам понадобится база данных, в которой вы будете хранить информацию о просмотрах страниц. В данном примере мы будем использовать язык программирования PHP и MySQL для создания такой функциональности.
1. Создайте таблицу в вашей базе данных, где будет храниться информация о просмотрах страниц. Например, вы можете создать таблицу с полями id, page_id, view_date.
CREATE TABLE page_views ( id INT AUTO_INCREMENT PRIMARY KEY, page_id INT, view_date DATETIME );
2. После того как у вас есть таблица для хранения данных о просмотрах страниц, добавьте код PHP, который будет записывать информацию о просмотре страницы в базу данных.
function log_page_view($page_id) { $db = new mysqli('localhost', 'username', 'password', 'database_name'); $page_id = $db->real_escape_string($page_id); $view_date = date('Y-m-d H:i:s'); $sql = "INSERT INTO page_views (page_id, view_date) VALUES ('$page_id', '$view_date')"; $db->query($sql); }
3. Теперь, чтобы получить статистику просмотров страницы за определенный период времени, вы можете использовать следующий код:
function get_page_views($page_id, $start_date, $end_date) { $db = new mysqli('localhost', 'username', 'password', 'database_name'); $page_id = $db->real_escape_string($page_id); $start_date = $db->real_escape_string($start_date); $end_date = $db->real_escape_string($end_date); $sql = "SELECT COUNT(*) as total_views FROM page_views WHERE page_id = '$page_id' AND view_date BETWEEN '$start_date' AND '$end_date'"; $result = $db->query($sql); $row = $result->fetch_assoc(); return $row['total_views']; } // Пример использования $page_id = 1; $start_date = '2022-01-01 00:00:00'; $end_date = '2022-01-31 23:59:59'; $total_views = get_page_views($page_id, $start_date, $end_date); echo "Total views for page with ID $page_id from $start_date to $end_date: $total_views";
Таким образом, вы можете легко реализовать функцию статистики просмотра страницы за определенный период времени, используя PHP и MySQL.