подскажите тему, где обсуждался алогоритм непрочитанных тем f.local
Иконки тем подсвечиваются другим цветом пока там есть непрочитанные тобой сообщения.
Вроде всё очевидно. Или я чего-то не догоняю?
Как это сделано-то?
не хранится же таблица со ключом темаXпользователXпост
не хранится же таблица со ключом темаXпользователXпостА почему нет? Скорее всего так и есть.
Но там ещё по времени какие-то ограничения есть, т.к. через какое-то время посты прочитанные становятся вроде.
т.е. после каждого добавленного коммента добавляется (КОЛво_Пользователей) - строк ?
Проще хранить прочитанные посты для каждого пользователя, чем непрочитанные. Объем прочитанных постов можно ограничить сроком например в 2 недели, тогда таблица не будет расти экспоненциально. А все посты старше 2 недель считать прочитанными.
Так и по производительности и по объёму мало будет
сколько андейтов/добавлений будет после каждого добавленнго сообщения?
Не факт что так удобнее. Все равно каждое сообщение проверять на прочитанность, мне кажется проще сделать один запрос с JOIN-ом ко второй таблице, чем рассчитывать интервалы.
Разве что при удалении, но там тоже легко попирается
Это зачем? Считать интервалами очень просто в любом случае
Ну у тебя же около каждого сообщения горят значки либо желтые, либо оранжевые.
Вопрос же в хранении и способе доступа. А алгоритм пересечения группы интервалов с интервалом (просматриваемая страница) пишется на коленке за 10 минут, и работает линейное время.
А алгоритм пересечения группы интервалов с интервалом (просматриваемая страница) пишется на коленке за 10 минут, и работает линейное время.На странице могут быть как прочитанные, так и непрочитанные сообщения. Они с огромной долей вероятности не имеют последовательных ID-шников. Когда у тебя открывается страница, ты имеешь набор непоследовательных ID-шников сообщений на данной странице.
Скажем, пусть 101, 120, 123, 140, 155. Из них не прочитано только последнее сообщение, так как его только что добавили.
По моей модели в базе хранятся ID-шники 101, 120, 123, 140, соответственно путем join-a находим пересечение, состоящее только из одного элемента 155, помечаем его оранжевым, остальные - желтым. Соответственно сразу же добавляем 155 в список просмотренных.
Как действовать в твоей модели?
список сообщений в теме (пусть даже только просматриваемая страница). Скажем, пусть ты смотришь
сообщения 10-15 (индексы сообщений в списке тогда берём из базы инфу о прочитанных сообщениях
этой темы (например 1-10 + 13 + 15-17) и умело пересекаем (получаем, что прочитаны 10, 13, 15).
Поиск одного сообщения в базе делается за O(log N а твоё пересечение будет за O(N).
Проблема в том, что у сообщений сквозная нумерация. То есть сообщение номер 10 находится в этой теме, а номер 11 - в соседней. Соответственно у тебя никогда не будет ситуации, где ID-шники сообщений в теме - 1-10 + 13 + 15-17, а всегда будет как у меня в примере: несколько разрозненных id-шников. Это связано с тем, что на пост можно сослаться по его id-шнику, даже если его перенесли или прикрепили к другой теме.
> Скажем, пусть ты смотришь сообщения 10-15 (индексы сообщений в списке тогда
> берём из базы инфу о прочитанных сообщениях этой темы.
А, если по порядковым номерам сообщений в теме, тогда да, согласен, будет практически сплошной интервал. Только тогда перенос сообщений и прикрепление к другой теме части треда будет создавать ситуации, когда уже прочитанное помечается как еще не прочитанное, но, судя по некоторым замеченным эффектам, на фл так и делается
Это довольно редкая ситуация, которая да, требует некоторых дополнительных действий,
но в среднем, думаю, обработка всё равно будет быстрее.
индексы сообщений в спискеСписок — это подразумевается сообщений в теме? Данный форум имеет древовидную структуру сообщений, поэтому списка никакого не получится.
> структуру сообщений, поэтому списка никакого не получится.
Тут есть кнопечка, которая позволяет смотреть его списком. Вполне себе список, не?
В моём случае время работы не M + N, а O(M). отрезки хранятся в пределах темы.
И всё-таки понудю, оценки O(log N) и O(N) из твоего поста таки оказались несвязанными величинами.
И повторюсь, да, есть проблемы при разных модификациях тем.
Тут есть кнопечка, которая позволяет смотреть его списком. Вполне себе список, не?Да, но пользователь её не обязательно нажимает. А ещё у него могут быть выключены другие слои или заигнорены какие-нибудь пользователи. В общем тут список рушится.
В моём случае время работы не M + N, а O(M). отрезки хранятся в пределах темы.Ну тут-то это не так. Потом всё равно куда делся список просмотренных постов, что только O(M) осталось? M может быть гораздо меньше постов в теме и просмотренных тем более.
И всё-таки понудю, оценки O(log N) и O(N) из твоего поста таки оказались несвязанными величинами.Ну почему же. Я просто полагал M достаточно маленьким и ограниченным, т.е. O(1). Тогда будут такие оценки.
Оставить комментарий
Phoenix
Когда-то очень давно пробегала тема о том, как устроен алгоритм появления лампочек рядом с разделами и темами (когда там появляются новые сообщения)Что-то не могу найти никак.
или можно в 2-3 словах, если кто знает или помнит ту тему.