Как реализовать функцию статистики просмотра страницы за некий период?
Не знаю как правильно подойти к реализации функции, с помощью которой я смогу выдавать пользователям о количестве просмотрев некой страницы. Важно, что бы это была статистика за день/месяц/год/всё время. Конкретно как реализовать количество просмотров за всё время не составит труда, но как реализовать это за некий период? Я ведь не могу хранить какой-то словарь с датами и количеством просмотрев... А если нужно будет реализовать за несколько лет? :
Дополнительно:
Содержание
Важно, что бы это была статистика за день/месяц/год/всё время.
Первое что нужно - определитесь с минимальной статистической единицей, если это день - значит храните сумму за день, табличка соответственно будет что-то типа:
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) , либо цикл)И вот с этим пунктом уже запутался. Вроде бы должно работать, но пока не уверен в правильности реализации.
Для решения данной проблемы вы можете воспользоваться услугами фрилансеров. Мы выполним необходимую работу быстро и качественно.
Оставить комментарий Отменить
Ответы
- Есть ответ! к записи Как уменьшить масштаб меньше 100% в Windows 10 (22H2)
- Есть ответ! к записи Аналоги CloudFlare в России?
- Есть ответ! к записи Аналоги CloudFlare в России?
- Есть ответ! к записи Как называется человек, который дизайн придумает для сайта и сверстает его?
- Есть ответ! к записи Можно ли установить Яндекс.Диск на АльтЛинукс?
- Есть ответ! к записи Картинки мутные только на сафари, есть выход?
- Есть ответ! к записи Keenetic. Как настроить SSTP клиент с сертификатом?
- Есть ответ! к записи Чем заменить executor в aiogram 3?
Для реализации функции статистики просмотра страницы за определенный период времени, вам понадобится база данных, в которой вы будете хранить информацию о просмотрах страниц. В данном примере мы будем использовать язык программирования PHP и MySQL для создания такой функциональности.
1. Создайте таблицу в вашей базе данных, где будет храниться информация о просмотрах страниц. Например, вы можете создать таблицу с полями id, page_id, view_date.
2. После того как у вас есть таблица для хранения данных о просмотрах страниц, добавьте код PHP, который будет записывать информацию о просмотре страницы в базу данных.
3. Теперь, чтобы получить статистику просмотров страницы за определенный период времени, вы можете использовать следующий код:
Таким образом, вы можете легко реализовать функцию статистики просмотра страницы за определенный период времени, используя PHP и MySQL.