2011-12-22 2 views
2

Я создаю агрегат (rss, twitter, другие службы и т. Д.) Агрегатор с LAMP. Он очень похож на Google Reader, поскольку люди могут добавлять столько каналов, сколько захотят, а затем смогут читать свои каналы, сортировать их, просматривать отдельные каналы или группы каналов одновременно.Логика базы данных накопителя для многопользовательского опыта

Я создал этот вид обслуживания раньше, но для небольшой группы людей, где группа ENTIRE имела доступ ко всем агрегированным фидам. Таким образом, это было довольно просто.

На этот раз, однако, я создаю услугу, на которую люди могут подписаться, поэтому у меня потенциально (в идеале) тысячи пользователей и 10 тысяч тысяч фидов и в свою очередь, миллионы фидов.

Мой подход к схеме базы данных (упрощенно) заключается в следующем:

users (id, name, ...) 
feeds (id, name, url, ...) 
feed_items (id, title, timestamp, feed_id, ...) 
user_feeds (id, user_id, feed_id, ...) 

Однако в том, что пользователь может подписаться на 100 фидов я пытаюсь распланировать самый лучший и самый оптимизированный способ для запроса базу данных для фидов_имя фидов, на которые они подписаны (или подмножества).

ответ

2

Я думаю, что вы на правильном пути. Я делал это раньше (пару раз), и важно выяснить, какая таблица должна содержать какую информацию. Например, в моей таблице USERS я сохраняю копию кэша списка подписки пользователя (или OPML). Если вы хотите, чтобы пользователи отслеживали чтение/непрочитанный статус каждой статьи, вы, вероятно, захотите сохранить эти метаданные в отдельной таблице. И наоборот, я вижу, что вы создали реляционную таблицу только для пользователей < -> отношения с кормом. Это позволяет хранить только одну копию каждого фида в таблице FEED, но компромисс между сложностью (и производительностью запросов) может не стоить того. Рассмотрим, какие запросы вы ожидаете запустить.

Например, главная «домашняя страница» моих пользователей - это список «папок» (то есть ярлыков Google Reader), в которые отделяются фиды, причем каждая папка с надписью содержит количество непрочитанных статей в этой папке (не подсчет повторяющихся статей). Даже с хорошими индексами, это медведь запроса (и медленный) с использованием реляционного подхода. Но если вы его денормализуете (т. Е. Таблица FEEDS может содержать несколько копий каждого фида, а схема включает имя_пользователя (и, в моем случае, имя папки)), таблица больше, но этот запрос является простым и мгновенным.

Кроме того, в моей таблице POSTS (или FEED_ITEMS - независимо) я укладываю исходное описание/содержание статьи: закодировано в столбце DESCRIPTION_ORIGINAL, а затем помещаю «чистую» версию в столбец DESCRIPTION. Чистая версия HTML дезинформирована, удалены объявления, исправлены известные проблемы с кодированием и т. Д.

+0

спасибо за отличный совет. вы правы в том, что лучше не иметь таблицу соединений. особенно потому, что я планирую разрешить пользователям переупорядочивать свои каналы и помещать их в папки и т. д. У меня нет проблем с нормализацией нормализации БД (и размером, я полагаю) для скорости запросов и простоты организации. с вашим подходом каждый пользователь имеет свой собственный частный набор данных, который хорош тем, что я могу легко позволить пользователям «делать больше» с их данными, не добавляя огромных слоев сложности. хотел бы услышать больше советов, поскольку вы, кажется, понимаете мою ситуацию. – phirschybar

+0

Не стесняйтесь пишите мне. Мое имя пользователя - мой адрес электронной почты (gmail). – danmactough

0

Кэширование здесь невероятно полезно. Вы можете, когда пользователь редактирует свои каналы, выполнить запрос фида и сохранить результаты в memcache.

Тогда вы можете просто сделать WHERE (feed_items.feed_id IN (...)), хотя я рекомендую вам также кэшировать результаты этих запросов.

Смежные вопросы