Как лучше считать количество непрочитанных сообщений?

В диалогах может быть более 2 пользователей. Подсчет количества непрочитанных сообщений представляет собой наиболее ресурсоемкую задачу, насколько мне это видится.

Думаю между 2 вариантами реализации:

1. Мы храним счетчик непрочитанных сообщений. Каждый счетчик привязан к конкретному пользователю и диалогу. Проблема этого подхода - при отправке сообщения, нужно инкрементить счетчики всех участников диалога. Сообщения могут отправляться достаточно часть, что приведет к огромному количеству запросов к БД на обновление.

2. Мы храним временную метку последнего прочтения диалога пользователем, опять таки, привязанную к конкретному диалогу и пользователю. В этом же случае, нам не нужно делать запросы на обновление, но при выводе диалогов, нам нужно выполнить по одному запросу на каждый диалог для того чтобы подсчитать количество сообщений, отправленных после последнего прочтения диалога пользователем.

В первом случае у нас множество частых запросов на обновление записей, во втором нечастые, но поисковые запросы к достаточно большой таблице сообщений.

Оба варианта кажутся мне далеко не идеальными, есть ли что-то лучше?
  • Вопрос задан
  • 301 просмотр
Пригласить эксперта
Ответы на вопрос 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
Слово временный означает "непостоянный". А хранить вы хотите метку времени. Программист как никто должен понимать, как важно четко излагать свои мысли.

Про "нечастые" запросы я не понял. Лет 20 назад, когда единственным способом обновить статус диалога было обновить страницу форума в браузере, это могло бы как-то проканать. А сейчас, когда пользователь ожидает обновления информации не совершая никаких действий, а просто глядя на экран, да ещё и в другом приложении, я не понимаю, как это должно работать. Когда именно приложение должно совершать свои нечастые селекты?

Вопрос же частых обновлений решается использованием сервиса, для этого предназначенного. Например, редис.
Как запасной вариант, можно также хранить и метку времени, на случай, если в редисе не окажется нужного ключа - тогда код быстренько посчитает и обновит счетчик
Ответ написан
Ваш ответ на вопрос

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

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