Есть новостной сайт — около 50 000 новостей в mysql db. Мне нужно создать список наиболее интересных и актуальных новостей для каждой страницы новостей и удалить уже просмотренные элементы для текущего пользователя (фактическая персонализация).
Я уже составил список новостей, просматриваемых в файлах cookie. Поэтому все, что мне нужно, это лучший архитектурный подход для фильтрации просматриваемых новостей.
Я вижу только варианты буксировки:
Каждый раз, когда пользователь открывает страницу, снова создайте для него список популярных предметов.
В варианте 1 мы можем использовать кеширование с APC, REDIS и т. Д., Но всегда имеем большие массивы данных, копируемые на каждый запрос, который потребляет много памяти. Но в варианте 2 мы должны были бы каждый раз запрашивать db, чтобы это было не быстро и потребляло ресурсы ЦП и БД.
Так есть ли способ, которым я могу избежать использования такого количества ресурсов и сделать это быстро?
Вы можете сделать что-то вроде
SELECT ... article data .. FROM Articles
LEFT JOIN ViewedArticles USING (articleId)
LEFT JOIN Users USING (userId)
WHERE ViewedArticles.articleId IS NULL AND Users.userId = :id
Это должно выбрать выбрать только статьи, которые не имеют соответствия articleId
в ViewedArticles
таблица с соответствием userId
,
Других решений пока нет …