подскажите тему, где обсуждался алогоритм непрочитанных тем f.local

Phoenix

Когда-то очень давно пробегала тема о том, как устроен алгоритм появления лампочек рядом с разделами и темами (когда там появляются новые сообщения)
Что-то не могу найти никак.
или можно в 2-3 словах, если кто знает или помнит ту тему.

YUAL

Рядом с разделом появляется, если там с твоего последнего захода в него появились сообщения новые.
Иконки тем подсвечиваются другим цветом пока там есть непрочитанные тобой сообщения.
Вроде всё очевидно. Или я чего-то не догоняю?

Phoenix

ну да.
Как это сделано-то?
не хранится же таблица со ключом темаXпользователXпост

tokuchu

не хранится же таблица со ключом темаXпользователXпост
А почему нет? Скорее всего так и есть.
Но там ещё по времени какие-то ограничения есть, т.к. через какое-то время посты прочитанные становятся вроде.

Phoenix

т.е. после каждого добавленного коммента добавляется (КОЛво_Пользователей) - строк ?

Fragaria

Проще хранить прочитанные посты для каждого пользователя, чем непрочитанные. Объем прочитанных постов можно ограничить сроком например в 2 недели, тогда таблица не будет расти экспоненциально. А все посты старше 2 недель считать прочитанными.

danilov

А может для каждого пользователя и каждой темы хранятся все прочитанные, но отрезками?
Так и по производительности и по объёму мало будет

Phoenix

сколько андейтов/добавлений будет после каждого добавленнго сообщения?

Fragaria

Не факт что так удобнее. Все равно каждое сообщение проверять на прочитанность, мне кажется проще сделать один запрос с JOIN-ом ко второй таблице, чем рассчитывать интервалы.

danilov

Если правильно сформировать, то 0 в обоих случаях. Обновления, только при прочтении.
Разве что при удалении, но там тоже легко попирается

danilov

> Все равно каждое сообщение проверять на прочитанность
Это зачем? Считать интервалами очень просто в любом случае

Fragaria

Ну у тебя же около каждого сообщения горят значки либо желтые, либо оранжевые.

danilov

Блин, А еще тебе браузером каждое сообщение надо рисовать. Как это связано вообще?
Вопрос же в хранении и способе доступа. А алгоритм пересечения группы интервалов с интервалом (просматриваемая страница) пишется на коленке за 10 минут, и работает линейное время.

Fragaria

А алгоритм пересечения группы интервалов с интервалом (просматриваемая страница) пишется на коленке за 10 минут, и работает линейное время.
На странице могут быть как прочитанные, так и непрочитанные сообщения. Они с огромной долей вероятности не имеют последовательных ID-шников. Когда у тебя открывается страница, ты имеешь набор непоследовательных ID-шников сообщений на данной странице.
Скажем, пусть 101, 120, 123, 140, 155. Из них не прочитано только последнее сообщение, так как его только что добавили.
По моей модели в базе хранятся ID-шники 101, 120, 123, 140, соответственно путем join-a находим пересечение, состоящее только из одного элемента 155, помечаем его оранжевым, остальные - желтым. Соответственно сразу же добавляем 155 в список просмотренных.
Как действовать в твоей модели?

danilov

В моей модели (и в твоей кстати тоже) на определённом этапе обработки запроса имеет место быть
список сообщений в теме (пусть даже только просматриваемая страница). Скажем, пусть ты смотришь
сообщения 10-15 (индексы сообщений в списке тогда берём из базы инфу о прочитанных сообщениях
этой темы (например 1-10 + 13 + 15-17) и умело пересекаем (получаем, что прочитаны 10, 13, 15).

tokuchu

Поиск одного сообщения в базе делается за O(log N а твоё пересечение будет за O(N).

Fragaria

Проблема в том, что у сообщений сквозная нумерация. То есть сообщение номер 10 находится в этой теме, а номер 11 - в соседней. Соответственно у тебя никогда не будет ситуации, где ID-шники сообщений в теме - 1-10 + 13 + 15-17, а всегда будет как у меня в примере: несколько разрозненных id-шников. Это связано с тем, что на пост можно сослаться по его id-шнику, даже если его перенесли или прикрепили к другой теме.

danilov

Блин, мне болдом что ли отметить?
> Скажем, пусть ты смотришь сообщения 10-15 (индексы сообщений в списке тогда
> берём из базы инфу о прочитанных сообщениях этой темы.

Fragaria

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

danilov

> перенос сообщений и прикрепление к другой теме части треда
Это довольно редкая ситуация, которая да, требует некоторых дополнительных действий,
но в среднем, думаю, обработка всё равно будет быстрее.

tokuchu

индексы сообщений в списке
Список — это подразумевается сообщений в теме? Данный форум имеет древовидную структуру сообщений, поэтому списка никакого не получится.

danilov

> Список — это подразумевается сообщений в теме? Данный форум имеет древовидную
> структуру сообщений, поэтому списка никакого не получится.
Тут есть кнопечка, которая позволяет смотреть его списком. Вполне себе список, не?
В моём случае время работы не M + N, а O(M). отрезки хранятся в пределах темы.
И всё-таки понудю, оценки O(log N) и O(N) из твоего поста таки оказались несвязанными величинами.
И повторюсь, да, есть проблемы при разных модификациях тем.

tokuchu

Тут есть кнопечка, которая позволяет смотреть его списком. Вполне себе список, не?
Да, но пользователь её не обязательно нажимает. А ещё у него могут быть выключены другие слои или заигнорены какие-нибудь пользователи. В общем тут список рушится.
В моём случае время работы не M + N, а O(M). отрезки хранятся в пределах темы.
Ну тут-то это не так. Потом всё равно куда делся список просмотренных постов, что только O(M) осталось? M может быть гораздо меньше постов в теме и просмотренных тем более.
И всё-таки понудю, оценки O(log N) и O(N) из твоего поста таки оказались несвязанными величинами.
Ну почему же. Я просто полагал M достаточно маленьким и ограниченным, т.е. O(1). Тогда будут такие оценки.
Оставить комментарий
Имя или ник:
Комментарий: