Xpoint
   [напомнить пароль]

Ущербность общепринятой модели постраничного вывода

Метки: [без меток]
2006-05-04 13:37:20 [обр] Сергей Богомолов aka Dialer++[досье]

Интересно из названия темы понятно о чём будет идти речь... %)

Ладно, сразу к сути вопроса.
В интернете очень много сайтов построенных на моделе блога, в которых контент размещается по схеме список кратких нровостей с кратким текстом -> ссылка на полную статью. Возьмём класический пример - livejournal.com, к примеру этот дневник http://privat24.livejournal.com/
Мы видим что на первой странице выводятся последние 2 записей и даётся ссылка на предыдущие 20 записей. Я считаю такую схему вывода ущербной и вот почему. Во-первых, как только в дневник добавляется запись, содержимое этих страниц (предыдущие 20 и т.д.) как бы сдвигается на 1 позицию. Другими словами содержимое страниц архива постоянно растёт (что естественно и нормально), но при этом каждая из страниц постоянно меняет своё содержимое! Если у вас не большой малопосещаемый сайт, то это не имеет особого значения, т.к. эти страницы вполне можно генерировать на лету. Но в случае с хорошопесещаемым сайтом такой подход будет давать больгшую нагрузку на сервер. Очевидно чтобы снять её, такие страницы лучше генерировать 1 раз и ложить на диск. Вот тут-то и начинаются проблемы. Получается что нужно будет каждый раз при добавлении новой записи в блог перегенерировать все такие страницы!
Кроме того это нерационаьно с точки зрения всяких Яндексов и Гуглов. Получается что им каждый раз нужно заново индексировать эти страницы раз уж их содержимое поменялось.
С одной стороны выход очевиден - генерировать страницы начиная с самой старой и заканчивая самой новой. Тогда новые записи будут добавляться в конец без всяких ненужныс сдвигов. На первой странице архива первые 20 записей начиная с самой старой, а на последней... Опять неопонятка %) На последней по идее должно быть последние 20, но это случается только в одном случае из 20 (когда общее кол-во записей кратно 20). В остальных 19 случаях их получается меньше 20.

Какие у кого мысли по этому поводу? Возможно уже есть готовые схемы по этой проблеме? Буду очень рад если просветите меня о них ;-)

PS: Стот добавить, что при выводе коментариев такой проблемы нет, т.к. там всё выводится от самого старого к самому новому.

спустя 1 час 4 минуты [обр] Сергей Круглов(10/2057)[досье]
мыслей никаких нет, иначе на том же LJ мы их уже увидели бы.
спустя 13 минут [обр] Сергей Богомолов aka Dialer++[досье]

Ну жж это ещё не весь интернет.
На самом деле это проблема на уровне логической задачки со звездочкой. Где же вы отличники у которых я в школе их списывал??! %))

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

спустя 10 минут [обр] Я. Попов aka Jaded(2/191)[досье]
тогда делайте так: на главной странице - hot 20, и ссылка вроде "эти и другие статьи". не пойдёт?
спустя 5 минут [обр] Thirteensmay(0/157)[досье]
Просто корректировать не первую а последнюю страницу, т.е. чтобы нахлест был в конце ;) ?
спустя 2 минуты [обр] Сергей Богомолов aka Dialer++[досье]
Ну что-то вроде этого я пытался сделать на http://lugarus.com/ (см. главную страницу и внизу ссылка архив)
Но как я сейчас смотрю, я там вообще напорол непонять что %)
спустя 3 минуты [обр] Thirteensmay(0/157)[досье]
ну тык а пиво на что ;) ?
спустя 22 секунды [обр] Сергей Богомолов aka Dialer++[досье]
Thirteensmay[досье]
Ну так по задумке и так корректируется последняя страница (те что до неё не затрагиваются). Но из-за того что в блогах принято выводить статьи в обратном порядке (очень правильно кстати!) то первая страница после главной как раз и естьп оследняя по номеру ( см. http://lugarus.com/archive/ )
спустя 1 минуту [обр] Thirteensmay(0/157)[досье]
во блин, да Вы их не в хронологическом, а в логическом порядке местами меняйте...
спустя 30 секунд [обр] Сергей Богомолов aka Dialer++[досье]
Thirteensmay[досье]
Я тут пообезал уже одним товарищам пиво выставить если они решат эту задачку, но они сразу сдались :-/
спустя 2 минуты [обр] Сергей Богомолов aka Dialer++[досье]
Thirteensmay[досье]
То есть как не хронологическом а в логическом? Я что-то не догоняю..
спустя 8 минут [обр] Thirteensmay(0/157)[досье]
Допустим есть 8 постов, выводиться по 3 на страницу, т.е. расклад такой:
1 стр. - 8, 7, 6 посты,
2 стр. - 5, 4, 3,
3 стр. - 3, 2, 1.
спустя 10 минут [обр] Сергей Богомолов aka Dialer++[досье]
Thirteensmay[досье]
Если так как ты пишеш делать, то опять будет СДВИГ при добавлении новой статьи, от которого нужно избавиться!
спустя 17 минут [обр] Thirteensmay(0/157)[досье]
Да нееет, ;) страницы формируются "на лету", нагрузка на сервер говорите ? - у меня на 1700 целике получалось 10 отв./сек. - помоему приемлемо ;), а с точки зрения кэша/поисковика хранение как Вы говорите "20 предыдущих" имхо вообще нелогично, голова то растет всевремя.
спустя 17 минут [обр] Сергей Богомолов aka Dialer++[досье]
у меня на 1700 целике получалось 10 отв./сек. - помоему приемлемо ;),

Это вы о чём? Если о http://lugarus.com/, то речь не о нём. Там нагрузка хоть и большая, но всёравно несоизмерима с преполагаемой в проекте, над которым я сейчас работаю.

а с точки зрения кэша/поисковика хранение как Вы говорите "20 предыдущих" имхо вообще нелогично, голова то растет всевремя.

По-моему мы говорим о разных вещах. Потому что я не вижу ничего не логичного в стремлении сделать содержимое страницы расположенной по определенному аресу постоянным. Вот представьте что вы ищите в Яндексе "TheBat 3.0" и вам яндекс выдаёт резултат расположенный на странице сгенерированной по такому принципу. Скорее всего перейдя на неё никакого бата вы не обнаружите, потому что он сместился на другую страницу. Что в этом хорошего?

спустя 15 минут [обр] Алексей Севрюков(0/1280)[досье]
Сергей Богомолов aka Dialer[досье] Используйте сортировку "новые снизу". Я не понимаю как еще по другому Вы собрались это решать.
спустя 16 минут [обр] Давид Мзареулян(1/1003)[досье]

Я в последнее время бью страницы по времени. Например, ...list?before=20060401123234 — показать 20 (к примеру) записей, предшествующих моменту “2006-04-01 12:32:34”. Понятно, что содержимое таких выборок не меняется (если элементы списка не удалять).

Кстати, ЖЖ тоже, начиная с определённой глубины переключается в режим календаря. Потому что базы данных не любят селектов с большими оффсетами.

спустя 1 час 36 минут [обр] Thirteensmay(0/157)[досье]
Ну тогда это уже не ущербность, а как обычно - желание сделать идеально ;) Если вдруг не понравится вариант Давид Мзареулян[досье] то может быть поиметь буфер в который складываются входящие посты, а по мере его наполнения создавать статические страницы архива ? Т.е. например при биении по 20 постов/стр. имеем буфер на 40 постов, как только он заполнится старшая его половина сбрасывается в архив. Конечно количество постов на первой странице будет колебатся от N до 2N-1 но это помоему мелочи, а остальное вроде в ажуре ;)
спустя 4 дня [обр] Tony(1/52)[досье]
Выводите на основной странице последние 20 постов, а остальные группируйте по месяцам (или неделям или дням, в зависимости от насыщенности постов). Кроме того, можно группировать не просто по дням (или неделям), а по логике "чем более старая информация, тем по большему промежутку группировка". При этом если страница с полным списком постов за месяцЮ который прошел полгода назад, то выводить первые N слов каждого поста, а остальное раскрывать уже по другой логике (новая страница, динамическина той же странице или иным способом).
спустя 7 часов [обр] Сергей Богомолов aka Dialer++[досье]
Tony[досье]
Именно так я и поступил! Точнее почи так. Мне посоветовали выводить архив по месяцам и каждый месяц в свою очередь делить на страницы например по 10 постов. Это оптимальный вариант, т.к. он позволяет делать навигацию по месяцам и при этом сохранять равномерность вывода информации. Ведь если выводить по принципу календаря то далеко не каждый день могут быть посты, в какой-то день их может быть много, а в какой-то всего 2-3, что не вполне рационально.
Вобщем меня полностью устраивает такой подоход. Тема закрыта.
спустя 1 день [обр] Tony(1/52)[досье]
На мой взгляд рационально, так как в постах людей интересует чаще всего именно хронология. А 10 постов на страницу — это мало. Выводите хотя бы 30-40.
спустя 1 час 31 минуту [обр] Сергей Богомолов aka Dialer++[досье]
Tony[досье]
Полностью согласен. Но ввиду специфики моего проекта у меня будет выводится 10-15 постов =)
спустя 1 месяц 12 дней [обр] Дмитрий Донцов+++(0/68)[досье]

Сергей Богомолов aka Dialer[досье]

Получается что нужно будет каждый раз при добавлении новой записи в блог перегенерировать все такие страницы!

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

ps
это на случай если вам разонравится идея календаря. мне она уже разонравилась :)

спустя 5 часов [обр] Сергей Богомолов aka Dialer++[досье]
Вы вравы во всем, кроме одного.
Удалять ВСЁ при добавлении необязательно. Достаточно удалять только те страницы, где упоминается отредактированная новость.
спустя 14 часов [обр] Дмитрий Донцов+++(0/68)[досье]

Сергей Богомолов aka Dialer[досье]

Удалять ВСЁ при добавлении необязательно.

Конечно не обязательно, зависит от реализации и кучи всего.
Идея, как таковая, сохраняется...

спустя 9 месяцев [обр] romy4[досье]
Создавайте части страниц, а потом налету быстренько собирайте готовые блоки. Думаю, что склеить 20-25 блоков для сервера будет не сложно.
спустя 1 месяц 11 дней [обр] vlad+(2/38)[досье]

а по моему скромному мнению, эта модель вовсе и не ущербная
поисковики - им блоги как раз нравятся, они их лопают со страшной силой
что касается главных потребителей - людей
мне сложно представить распространенный юзкейс, когда пользователю требуется часто возвращаться к странице со списком новостей (кроме переходов с поисковиков и постоянных пересылок ссылки на index2 РБК) - скорее, на конкретный "пост", "страницу рубрики" или "главную"
тут все логично
на главной - последние новости по всем рубрикам
на странице рубрики - последние новости рубрики и листалка
на странице новости - ясное дело, новость и все релевантное
на странице тэга - то что к нему привязалось (а вот тут все смешнее чем с датами - хочешь/не хочешь, непостоянства не избежать)
желающие смотреть новости "за период" - клацают по календарю; вот тут все стабильно

то есть, я думаю, что не надо бороться со "смещениями", т.к. борьба за идею может повредить - прежде всего, пользователю

спустя 5 месяцев [обр] brutalProger(0/3)[досье]
Ведь когда мы читаем книгу, мы начинаем с первой и заканчиваем последней страницей.
Почему при появлении новой информации, она выкидывается на первую, тем самым замещая бывший там контент, а то, что ранее было на ней, сдвигается на другие страницы? Разве это логично?
К примеру пользователь поставил закладку на 3-ю страницу, возвращается туда через полгода, а нужной информации там уже нет. Она где-то дальше.
Такое разбитие данных, видимо обусловлено тем, что "первая страница" асооциируется с некой свежестью информации. Так уж повелось.
Но что если самые старые данные публиковать на 1-ой странице, а самые последние скажем на 300-ой? Тогда никакой путаницы не будет, пользователь поставивший ее в закладки, вернется к ней и спустя полгода. Единственное к этому надо привыкнуть. Так к примеру сделано на www.habrahabr.ru
Ведь когда мы ведем ежедневник, мы записываем самые свежие записи в конец, а не в начало :)
спустя 1 месяц [обр] wiktar(0/20)[досье]

В бумажной литературе (ежедневнике), вполне вероятно, было бы не так, если бы имелась возможность сделать иначе.

Так уж получилось, что новое и свежее должно быть наверху.

Powered by POEM™ Engine Copyright © 2002-2005