Как в базе делается «просмотренно» на сообщениях и задачах для разных пользователей?
Есть задачи, если сообщения. И то и другое может быть редактируемое. Мы храним дату изменений. Смотреть это могут несколько разных пользователей, причем права просмотра у них могут менять.
Нужно показывать количество непросмотренных каждому пользователю.
Мое решение - таблица, где хранится дата последнего просмотра. При выводе на фронте джойним и там сравнивается.
user_id | task_id | date_view
Для задач еще куда ни шло, их не так много, а вот для сообщений мне кажется перебор. Есть какие-то лучшие решения?
Вот, что мне пришло первое в голову:
Я бы хранил так
user_id | task_id | is_watched
И написал бы триггер (CREATE TRIGGER) на изменение задачи, чтоб менял всем подписанным пользователям is_watching на false.
А при просмотре (уже в рамках приложения), меняем на true.
В принципе должно быстро считаться кол-во непросмотренных.
grabbee, триггер можно и нужно писать на уровне приложения - а это уже может быть реализовано, как на языке программирования приложения, например, на уровне ORM через событие изменения объекта модели или в репозитории в методе изменения после основного запроса update, так и на SQL в миграции (CREATE TRIGGER, как-никак это же тоже язык программирования). Да и вообще не вижу смысла обсуждать, так как будет холивар)))
Да, отдельная таблица пользователь+пост, хранить boolean 'просмотрели' или два поля - дата последнего просмотра и дата последнего изменения (последний в таблице сообщений)
Но главное, не считайте количество каждый раз при запросе из базы, лучше считайте количество на изменении, и сохраняйте рядышком в таблице сообщений, особенно если просмотры происходят чаще редактирований