Как лучше считать количество непрочитанных сообщений?
В диалогах может быть более 2 пользователей. Подсчет количества непрочитанных сообщений представляет собой наиболее ресурсоемкую задачу, насколько мне это видится.
Думаю между 2 вариантами реализации:
1. Мы храним счетчик непрочитанных сообщений. Каждый счетчик привязан к конкретному пользователю и диалогу. Проблема этого подхода - при отправке сообщения, нужно инкрементить счетчики всех участников диалога. Сообщения могут отправляться достаточно часть, что приведет к огромному количеству запросов к БД на обновление.
2. Мы храним временную метку последнего прочтения диалога пользователем, опять таки, привязанную к конкретному диалогу и пользователю. В этом же случае, нам не нужно делать запросы на обновление, но при выводе диалогов, нам нужно выполнить по одному запросу на каждый диалог для того чтобы подсчитать количество сообщений, отправленных после последнего прочтения диалога пользователем.
В первом случае у нас множество частых запросов на обновление записей, во втором нечастые, но поисковые запросы к достаточно большой таблице сообщений.
Оба варианта кажутся мне далеко не идеальными, есть ли что-то лучше?
Слово временный означает "непостоянный". А хранить вы хотите метку времени. Программист как никто должен понимать, как важно четко излагать свои мысли.
Про "нечастые" запросы я не понял. Лет 20 назад, когда единственным способом обновить статус диалога было обновить страницу форума в браузере, это могло бы как-то проканать. А сейчас, когда пользователь ожидает обновления информации не совершая никаких действий, а просто глядя на экран, да ещё и в другом приложении, я не понимаю, как это должно работать. Когда именно приложение должно совершать свои нечастые селекты?
Вопрос же частых обновлений решается использованием сервиса, для этого предназначенного. Например, редис.
Как запасной вариант, можно также хранить и метку времени, на случай, если в редисе не окажется нужного ключа - тогда код быстренько посчитает и обновит счетчик
Под нечастыми запросами я имел в виду запросы, которые будут считать количество непрочитанных сообщений в момент подгрузки диалогов, когда пользователь открывает страницу диалогов. Далее, эта цифра уже будет обновляться через вебсокет в режиме реального времени.
Допустим в чате 1000 человек. Предположим, мы храним счетчики в редисе, итого при каждой отправке сообщения, нужно обновить 1000 значений. Умножаем все это на то что в каждом чате несколько человек могут одновременно отправлять сообщения и на общее количество чатов. В итоге получится цифра с очень большим количеством нулей - сколько раз должна произойти запись в редис в единицу времени. Сдается мне редис не особо тут будет вывозить.