Реализация непрочитанного сообщения на форуме

Реализация форума asp.net mvc3. Частью реализации является функция, которая показывает, какие сообщения были прочитаны, а какие нет.

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

Сейчас у меня 450 пользователей, так что на их создание уходит много времени.

Я думал, что должен быть лучший способ, поскольку большие форумы vbullitin или phpbb с более чем 1000 пользователей могут сделать это, не тратя 2+ сек на создание поста, для создания всех этих записей, но я не нашел его. Я могу увидеть на этом сайте еще несколько вопросов по этому поводу, но я не нашел ответа, на который можно было бы ответить.


person Androme    schedule 01.05.2011    source источник


Ответы (3)


Вам необходимо записывать последние действия пользователя, но хранить все в базе данных будет неэффективно. В связи с этим вам также необходимо установить файлы cookie, чтобы знать, какие потоки они просматривали. Немного гибридный подход, но здесь есть несколько длительных дискуссий по этому поводу:

person Teoman Soygul    schedule 01.05.2011

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

Затем вы можете легко определить, что в потоке является непрочитанным ... если у вас нет метки времени в БД для этого пользователя / потока, то для них все это непрочитано. Если у вас есть отметка времени, все сообщения в цепочке после этой отметки времени будут непрочитанными.

person Robert Levy    schedule 01.05.2011
comment
Это приведет к меньшему количеству чтений, но не вставок, так как мне придется вставлять строку для каждого пользователя, поскольку проверка того, существуют ли они уже, потребует больше времени. - person Androme; 01.05.2011
comment
Не согласен, что на это уйдет больше времени. Это не значит, что вам нужно перебирать всю таблицу, чтобы понять, что нет записи для конкретной комбинации пользователь-поток. Базы данных умнее этого (особенно если вы индексируете столбцы идентификатора пользователя и потока) и могут выполнять поиск быстрее, чем O (N) - person Robert Levy; 01.05.2011

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

person spender    schedule 01.05.2011