Задать вопрос
Quber
@Quber
PHP Team lead

Как не выводить на ленте пользователя просмотренный им контент?

Необходимо отслеживать "стену" пользователя (аля вконтакте) и не выводить на неё информацию, которую он уже видел.
Как грамотно это реализовать?

Думал насчёт назначения куки, но вот что если он просмотрит 50 000 материала, столько куки наверно даже не вместятся.
Или с localstorage, но тогда контент который не должен видеть пользователь всё равно будет генерироваться на сервере, то есть делать лишнюю операцию, что не есть хорошо.
Вариант сохранять всю эту информацию в базе, но тогда что если записей будет миллионы, как это скажется на производительности чтения и записи?

Может есть какие нибудь адекватные варианты?
  • Вопрос задан
  • 2437 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
DmitriyEntelis
@DmitriyEntelis
Думаю за деньги
Задача на самом деле сложная :)
Я бы подумал так ли Вам это надо.
Решение в лоб: хранить табличку user_id, post_id - информация которую пользователь посмотрел.
Но нам нужно так или иначе отфильтровать post_id на выводе - засада в том, что запрос вида select ... from post where post_id not in ( ... ) не использует индекс и поэтому крайне медленный.
Нормальных решений работающих для десятков тысяч пользователей/постов я не знаю, все имеют в лучшем случае емкость count(user)*count(post)
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
hedint
@hedint
Senior front-end developer
Вам еще предстоит выделить состояние "просмотрел". :)
То, что мне где-то что-то вывели, не значит, что я его просмотрел.

Конкретно по вопросу - конечно, сохранять в базе.
Cookie меняются/удаляются, localstorage - тоже.
Ответ написан
@IceJOKER
Web/Android developer
Если для гостей - то лучше cookie или сессии, просто при выводе исключаем просмотренные -
WHERE `id` NOT IN (implode(',', $_SESSION['saw_id_list']));


желательно перед запросом фильтровать -
$saw_id_list = array_map(intval, $_SESSION['saw_id_list']);


А если система с авторизацией , то храним в бд, можно раз в месяц чистить таблицу
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы