Горбушка
Ищу её...
- Регистрация
- 2 Май 2008
- Сообщения
- 3.444
- Реакции
- 2.524
- Автор темы
- #1
Всем привет!
Есть задачка - реализовать в системе, схожей с форумной, функционал подсветки записей, которые пользователь не просматривал. Отсюда вытекает вопрос - как?
А теперь, если Вас хватило на прочитать это всё или Вы тупо не открыли спойлер, а как правильно хранить эту информацию? Как это хранит, к примеру, XenForo? phpBB? vBulletin?
Есть задачка - реализовать в системе, схожей с форумной, функционал подсветки записей, которые пользователь не просматривал. Отсюда вытекает вопрос - как?
Первое что приходит в голову - в каждой записи хранить ID пользователей, которые её просмотрели. Возникает сложности с проверкой для категорий, т.к. вложенность не ограниченная... Да и в базе хранить кучу мусора не хочется.
Дальше вариант с хранением информации в куках. Но если пользователь их удалит - все записи будут не просмотренными по умолчанию.
В добавок к этим 2 вариантам - а как сделать "Отметить всё прочитанным"? Это ж задница писать в каждую запись ID пользователя.
Вторая реализация вытекает из первой. Хранить не факт просмотра, а время просмотра. Т.е. подсвечиваем только записи с предыдущего визита. Проблема тут не с избытком данных, а с недостатком. Ведь на момент предыдущего визита пользователь мог отсмотреть не все записи.
Третий вариант вытекает из первых двух. Добавлять к первому варианту дату, до которой всё считается просмотренным. Тут опять же возникает сложность, ведь для каждого раздела своя дата. И это, ребята, будет задника...
Четвёртый вариант представляет из себя обратный фикс - мы не только помечаем непрочитанные с предыдущего визита, но и пишем ID в базу. При просмотре из БД они удаляются. При этом записи чистятся по крону, к примеру. А делаются только для активных пользователей. При следующем визите запрашиваем новые + подсвечиваем те, что уже есть в БД. Ну и чистим те, что по времени устарели (хранить что пользователь не читал год назад не самая удачная затея для БД).
Ок, 4-ый вариант кажется не плохим, но есть совершенно другой вариант, основанный на счётчиках. Да и опять же, хранить мусор в виде списка всех ID статей не очень хочется. Человек зарегислся чтобы посмотреть 1 статью, а это пораждает 100500 записей в БД на неопределённый срок. Зато мусора не будет для активных пользователей. Если пользователь прочитал всё - в БД записей не останется. Так же и с теми, кто не посещает систему - информация по ним будет вычищаться по кнону...
Вариант 5 - мы храним в БД для каждого пользователя количество постов на момент последнего прочтения для каждой категории/записи. Т.е. в категории 20 записей, пользователь прочитал 19 - значит есть непрочитанные. В записи есть 20 вложений, пользователь прочитал 19 - значит запись не прочитана. Вариант снижает нагрузку в том случае, если человек уже прочитал все записи. В этом случае сравнивается только общее количество во всей системе и нет нужды проходить по каждой категории. Так же вариант "Отметить всё прочитанным" для категории выглядит лишь как приравнивание количества постов. Недостаток тот же - куча мусора в БД.
Дальше вариант с хранением информации в куках. Но если пользователь их удалит - все записи будут не просмотренными по умолчанию.
В добавок к этим 2 вариантам - а как сделать "Отметить всё прочитанным"? Это ж задница писать в каждую запись ID пользователя.
Вторая реализация вытекает из первой. Хранить не факт просмотра, а время просмотра. Т.е. подсвечиваем только записи с предыдущего визита. Проблема тут не с избытком данных, а с недостатком. Ведь на момент предыдущего визита пользователь мог отсмотреть не все записи.
Третий вариант вытекает из первых двух. Добавлять к первому варианту дату, до которой всё считается просмотренным. Тут опять же возникает сложность, ведь для каждого раздела своя дата. И это, ребята, будет задника...
Четвёртый вариант представляет из себя обратный фикс - мы не только помечаем непрочитанные с предыдущего визита, но и пишем ID в базу. При просмотре из БД они удаляются. При этом записи чистятся по крону, к примеру. А делаются только для активных пользователей. При следующем визите запрашиваем новые + подсвечиваем те, что уже есть в БД. Ну и чистим те, что по времени устарели (хранить что пользователь не читал год назад не самая удачная затея для БД).
Ок, 4-ый вариант кажется не плохим, но есть совершенно другой вариант, основанный на счётчиках. Да и опять же, хранить мусор в виде списка всех ID статей не очень хочется. Человек зарегислся чтобы посмотреть 1 статью, а это пораждает 100500 записей в БД на неопределённый срок. Зато мусора не будет для активных пользователей. Если пользователь прочитал всё - в БД записей не останется. Так же и с теми, кто не посещает систему - информация по ним будет вычищаться по кнону...
Вариант 5 - мы храним в БД для каждого пользователя количество постов на момент последнего прочтения для каждой категории/записи. Т.е. в категории 20 записей, пользователь прочитал 19 - значит есть непрочитанные. В записи есть 20 вложений, пользователь прочитал 19 - значит запись не прочитана. Вариант снижает нагрузку в том случае, если человек уже прочитал все записи. В этом случае сравнивается только общее количество во всей системе и нет нужды проходить по каждой категории. Так же вариант "Отметить всё прочитанным" для категории выглядит лишь как приравнивание количества постов. Недостаток тот же - куча мусора в БД.