Второй день думаю над тем, как должен работать алгоритм интересных новостей. Понятно, что каким-нибудь кроном делается выборка всех постов и потом ранжируется. Проблема возникает чуть дальше.
Например, после очередного ранжирования получился следующий список:
1, 2, 3, 4, 5, 6, 7, 8, 9
Пользователю эти записи выдаются по 4 штуки на страницу.
Пользователь открывает страницу и видит:
1, 2, 3, 4
Далее запускается кроновское задание и перераспределяет страницs. То есть после текущего ранжирования получается следующий список:
1, 5, 6, 4, 3, 2, 7, 8, 9
И когда пользователь перейдёт на вторую страницу, сервер ему выдаст записи, которые он уже видел:
3, 2, 7, 8
Как правильно реализовывать подобные динамические ленты?
Можно сделать убрать постраничную навигацию и сделать просто что сначала отображаются 5 штук, потом когда прокрутил колесиком до конца страницы - отображаются следующие (без перезагрузки страницы), по образу как сделаны новости в ВК.
DTX: не совсем... при постраничной навигации у тебя происходит ребут страницы (в большей части случаев) и соответственно новый запрос к БД допустим, которая как раз может пересортировать что-либо в зависимости от контроллера. А порциальная выдача может загрузить с самого начала ВСЕ и потом отображать по мере необходимости... Возможно конечно больше нагрузки на БД, нооо... за то решит проблему описанную в вопросе... =))
DTX: Либо можно оставить постраничную навигацию. но сделать тогда перезагрузку контента лишь центрального блока без перезагрузки страницы... Опять же все решение вопроса лежит на фронте.
Либо ты тащишь изначально из БД всё что требуется в нужной сортировке и потом выдаешь порциями, не важно как с постраничкой или с порциальной подачей... Либо у тебя перезагрузка страницы и соответственно месиво в сортировке...
Тут как бы всего два варианта простых...
Либо можно заморачиваться и что-то там творить с куками, сессиями и т.д.
Леонид Грошев: страницы и порциальная выдача делаются для того, чтобы не грузить лишние посты, которые могут и не пригодится.
Ты же предлагаешь отдавать пользователю сразу все посты? Их же может быть тысяча, если не больше.
Правильно такие ленты строятся в зависимости от подхода.
1. Когда ранжирование является глобальным. В таком случае, каждая запись имеет некоторый ранг - вычисляемое поле, которое пересчитывается по событию. Например, когда кто-то делает к ней комментарий или по каждому седьмому просмотру. Логика расчета ранга зависит от ресурса и содержимого. Ну а дальше элементарная сортировка. Если вы хотите, вы можете исключать просмотренные статьи.
2. Когда ранжирование зависит от предпочтений пользователя. В данном случае при авторизации пользователя в фоновом процессе происходит расчет ранга или лента строится на лету. Для построения ленты на лету применяется комбинация графовых и обычных баз. Графовые могут быстро рассчитывать степень влияний предпочтений и связей пользователей между собой.