Какой будет хороший алгоритм для подсчета непрочитанных элементов в реализации агрегатора каналов онлайн? - PullRequest
0 голосов
/ 13 июня 2009

Предположим, что в базе данных есть таблицы для пользователей, каналов, элементов и возможность узнать, какие элементы пользователь уже видел. Я ищу дизайн-парадигму , которую можно использовать на сервере для вычисления за короткий промежуток времени [идентификатор фида, num_unread] для каждого фида, на который подписан пользователь.

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

Редактировать: я хотел решить проблему, с которой столкнулся Ник Дж (см. Ниже). Но я ценю решение, опубликованное Cletus. Я не очень беспокоюсь о запросах db, но хочу "парадигму проектирования" - например, сохранение процесса наблюдения, который хранит непрочитанные данные в памяти, чтобы их можно было обслуживать в любой момент.

1 Ответ

1 голос
/ 13 июня 2009

Я не уверен, что именно вам сказать, потому что то, что вы спрашиваете, достаточно просто.

Прежде всего, используйте Google Reader в качестве справочного материала для онлайн-агрегаторов / читателей фидов. И если вы пытаетесь воссоздать эту функциональность, Google Reader уже в значительной степени прибил ее (imho).

Google Reader работает просто путем сохранения списка каналов. С точки зрения БД, вы, вероятно, имели бы эти сущности

User: id, name, email, etc...
Feed: id, feed_name, feed_url
Content: id, feed_id, title, content
User Feed: id, user_id, feed_id, user_label, has_read

Непрочитанные предметы:

SELECT COUNT(1)
FROM user u
JOIN user_feed uf ON uf.user_id = u.id
JOIN feed f ON f.id = uf.feed_id
WHERE has_read = 0

Непрочитанные товары по ленте:

SELECT feed_id, feed_name, COUNT(1)
FROM user u
JOIN user_feed uf ON uf.user_id = u.id
JOIN feed f ON f.id = uf.feed_id
WHERE has_read = 0
GROUP BY feed_id, feed_name

И тогда вам просто нужен какой-то механизм для маркировки предметов как прочитанных. В случае Google Reader есть только вызовы AJAX, инициируемые событиями наведения мыши с дополнительными ссылками, чтобы пометить все как прочитанное, оставить элемент помеченным как непрочитанный и т. Д.

...