Как делают на форумах "отметить сообщение прочитанным"?

Elina74

Поискал в инете, нашел, например такое:
http://www.phpbb.com/phpBB/viewtopic.php?p=1453155:
... each and every user has a record of which posts they have (have not) read that is stored in the database. So it is preserved from session to session, rather than relying on a cookie.
Т.е. у каждого пользователя в базе данных должна быть запись с номерами сообщений, которые этот пользователь еще не читал. Причем:
1. При создании пользователя эта запись пуста.
2. При разлогинивании эта запись очищается полностью.
3. При добавлении любого сообщения в форум информация о номере этого сообщения записывается в запись каждого пользователя форума.
4. Как только пользователь затребует страницу на которой есть сообщение с номером, который есть в записи, этот номер из записи удаляется.
Если так, то вопрос: как эту запись реализовать в базе данных?

stm7884696

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

Marinavo_0507

10^7 сообщений, и 10^4 пользователей
получается 10^11 бит нужно хранить
многовато

Elina74

мпросмотревших
Каких? От этого многое зависит.

stm7884696

просмотревших эту запись...
Посмотри, по крайней мере в этом форуме я представляю себе так, создается сообщение и на его ид цепляется привязка таблицы с просмотревшими это сообщение пользователями... И пока ты его не посмотрел, у тебя оно отображается непрочитаным (как у анонимуса после того как ты его просмотрел, у тебя твой ид заноситься в таблицу просмотров...
ЗЫ а т.к. просмотр у нас возможен за месяц мах - значит все записи старше месяца удаляются...

sergey_m

У сообщений есть уникальные номера, которые равномерно растут. При условии, что юзер читает сообщения последовательно, нужно просто увеличивать номер последнего прочитанного сообщения в его профайле. Если он читает непоследовательно, то возникают дыры, которые нужно отдельно описывать. Чем более "дыряво" юзер читает, тем больше на него тратится памяти. Но, среднестатистически дыр будет не так уж много. Кроме того, на всех форумах (включая и этот) по прошествии времени Х, все старые сообщения считаются прочитанными. Таким образом удаляются дыры в прошлом и средний расход памяти не растет с течением времени. Растет только с увеличением userbase и уровнем пиздобольства в форуме.
Пример реализации - читалка новостей tin, которая именно в таком формате хранит файл .newsrc.

durka82

Можно всю эту инфу(о прочитанных сообщениях) в куках на клиенте хранить и обрабатывать только на клиенте

stm7884696

описывать дыры, этот момент поподробнее пожалуста...

sergey_m

Вот пример моего .newsrc:

fido7.ru.unix.bsd: 1-211503
fido7.ru.unix.prog: 1-17023,17063-17064,17070,17081,17097,17099,17103,17126,17139-17141
,17157,17164,17172,17469-17470,17472-17474,17482,17493,17495,17497,17499-17501,17509,17
526,17547-17549,17553,17692,17694,17697,17699,17702,17704,17711,17719-17720,17722-17724
,17735-17736,17740,17747,17832,17843-17844,17854,17859,17907,17985,17988-17989,18025,18
035,18045,18051,18078,18087-18088,18091-18097,18105,18110,18127,18129,18134,18141-18142
,18144
fido7.ru.unix: 1-117904

fido7.ru.unix.bsd и fido7.ru.unix я читаю полностью, а fido7.ru.unix.prog выборочно.

Marinavo_0507

Я немного думал над этим (чтоб для этого форума адаптировать и более перспективным (cжатие лучше) представляется некий вариант RLE.

sergey_m

Вот кстати прикольная реализация аналогичной задачи (но не подходит в данном случае): unit allocator в FreeBSD.
Оставить комментарий
Имя или ник:
Комментарий: