Как эффективно проверять новые данные в БД?

Я пишу сейчас два веб приложения: один на php (Yii2), другое на python (django). Одно использует MySQL, другое PostgreSQL.

В этих веб системах много таблиц, это что-то вроде своей CRM системы. В пунктах меню отображаются через лейблы число новых записей в базе данных. Например, если пользователю поступила новая задача, то над иконкой "Задачи" будет +1. Аналогично с другими пунктами меню: чат, проекты, оповещения и т.д.

Каждый раз, когда обновляется веб страница, идет запрос в базу данных на наличие новых записей по каждой таблице из тех, что я выше перечислил. А это уже минимум 5 дополнительных запросов!

Вопрос: является ли это эффективной схемой напрямую делать куча запросов на каждую таблицу для проверки новых записей, или есть более умные решения, о которых я не знаю? Возможно что-то связанное с сессиями, или кэшированием.
Но как тогда будет этот механизм работать, если нужно реально проверять наличие обновлений?
  • Вопрос задан
  • 1383 просмотра
Пригласить эксперта
Ответы на вопрос 4
@melnikov_m
Можно реализовать примерно так
1) создать для задачи колонку isRead(0/1 не прочитано/прочитано)
2) при создании записи добавлять в кеш с привязкой к пользователю, что у него есть непрочитанная задача
Yii::$app->cache->set('newTask-user-'. $userId, 1);

конечно нужно сначала проверять счетчик на существование и инкриментировать его. Например, это умеет редис
https://yiigist.com/package/drsdre/yii2-redis-coun...
В общем, если счетчика нет, то он создается, если есть, то берется его старое значение и делается +1
3) Когда пользователь зашел в список задач, то идет обращение не в БД, а к этому счетчику и пользователь видит (+1, +2 и т.д).
Когда заходит в конкретную задачу, то если колонка isRead = 0, то записываем 1, а счетчик делаем -1.
4) Наверное, еще придется предусмотреть "разогрев кеша", если он упал(на случай если вы предполагаете, что нагрузка будет реально большая)
Для этого пишем задачу, которая запускается при запуске сервера кеширования, в которой берем count всех непрочитанных задач, сгруппированных по пользователям и записываем эти значения в счетчики.
Ответ написан
ernesto77
@ernesto77
php, rb, py, js, webdev
я думаю надо в кеше или сессии держать массив со счетчиками и обновлять его в режиме реального времени при добавлении/удалении записей (скорее всего через сокеты). А запросы к БД при обновлении страницы делать только в том случае, если в кеше нет нужного счетчика.

По сути получится так что первый запрос будет тяжелый, но потом в кеше создастся массив со всеми счетчиками, благодаря которому не нужно будет обращаться к БД.
Ответ написан
Комментировать
dimonchik2013
@dimonchik2013
non progredi est regredi
триггеры можете, только не забывать о репликации
Ответ написан
webinar
@webinar Куратор тега Веб-разработка
Учим yii: https://youtu.be/-WRMlGHLgRg
Я бы для всех сущностей делал дату создания и возможно дату актуальности. А у пользователя бы имел в базе или в сессии дату последнего экшена. Это позволяет и делать кто онлайн и Вашу задачу и еще много чего. А что бы не перегружать базу запросами, делайте их не постоянно, а раз в n минут, кешируя результат.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы