Традиционным решением является таблица соединений что-то вроде:
CREATE TABLE topicviews (
userid INTEGER NOT NULL,
topicid INTEGER NOT NULL,
lastread TIMESTAMP NOT NULL,
PRIMARY KEY (userid, topicid),
FOREIGN KEY (userid) REFERENCES users(id),
FOREIGN KEY (topicid) REFERENCES topics(id)
);
последнее обновление обновляется каждый раз, когда читается тема. При отображении списка тем, если themes.lastupdated> topicviews.lastread, появляются новые сообщения.
Традиционное решение - мусор, который убьет вашу базу данных! Не делай этого!
Первая проблема заключается в том, что запись в каждом представлении темы вскоре поставит сервер баз данных на колени на загруженном форуме, особенно в таблицах MyISAM, которые имеют только блокировки на уровне таблиц. (Не используйте таблицы MyISAM, используйте InnoDB для всего, кроме полнотекстового поиска).
Вы можете немного улучшить эту ситуацию, потрудившись писать в последний раз, когда в теме читаются действительно новые сообщения. Если topic.lastupdated
Вторая проблема - комбинаторный взрыв. Скоро складывается по одной строке на пользователя на тему: всего тысяча пользователей и тысяча тем, и у вас есть потенциально миллион строк для просмотра тем!
Вы можете немного улучшить эту ситуацию, ограничив количество тем, запоминаемых для каждого пользователя. Например, вы можете удалить любую тему из таблицы представлений, когда она станет старше определенного возраста, и просто предположить, что все старые темы «прочитаны». Обычно для этого требуется выполнить очистку в фоновом режиме.
Другие, менее интенсивные подходы включают в себя:
- хранит только одно последнее чтение за форум
- хранит только одно время последнего посещения для каждого пользователя на всем сайте, которое будет отображаться как «новые» только обновленные данные с момента предыдущего посещения (сеанса) пользователя
- вообще не хранит последнюю прочитанную информацию, но включает время последнего обновления в самом URL темы. Если браузер пользователя недавно видел эту тему, он запомнит URL и пометит его как посещенный. Затем вы можете использовать CSS для стилизации посещенных ссылок как «тем, не содержащих новых сообщений».