Создание (простого) твиттер-клона с CouchDB - PullRequest
2 голосов
/ 17 октября 2011

Я пытаюсь создать (простой) твиттер-клон, который использует CouchDB как Database-Backend.Из-за его ограниченного набора функций я почти закончил с кодированием, но с CouchDB осталась одна вещь, которую я не могу решить - временная шкала для каждого пользователя.

Как и в твиттере, временная шкала для каждого пользователя должна отображатьтвиты всех людей, за которыми я следую, в хронологическом порядке.С SQL это довольно простой оператор Select, но я не знаю, как воспроизвести его с помощью CouchDBs Map / Reduce.

Вот SQL-оператор, который я бы использовал с RDBMS:

SELECT * FROM tweets WHERE user_id IN [1,5,20,33,...] ORDER BY created_at DESC;

Подробности схемы CouchDB

пользовательская схема:

{
  _id:xxxxxxx,
  _rev:yyyyyy,
  "type":"user",
  "user_id":1,
  "username":"john",
  ...
}

твит-схема:

{
"_id":"xxxx",
"_rev":"yyyy",
"type":"tweet",
"text":"Sample Text",
"user_id":1,
...
"created_at":"2011-10-17 10:21:36 +000"
}

С просмотр сопоставлений довольно просто запросить у CouchDB список «всех твитов с user_id = 1 в хронологическом порядке».

Но как мне получить список «всех твитов, принадлежащих пользователям с идентификатором 1?», 2,3, ... упорядочено в хронологическом порядке "?Нужна ли другая схема для моего приложения?

Ответы [ 2 ]

0 голосов
/ 17 октября 2011

Лучший способ сделать это - сохранить created_at как отметку времени , а затем создать представление и сопоставить все твиты с user_id:

function(doc){
  if(doc.type == 'tweet'){
    emit(doc.user_id, doc);
  }
}

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

Отредактировано в последний раз - пыталсячтобы сделать все это в couchDB ... см. ревизии:)

0 голосов
/ 17 октября 2011

Это приложение только для CouchDB?Или вы используете что-то промежуточное для дополнительной бизнес-логики.В последнем случае этого можно добиться, выполнив несколько запросов.

Это может включать в себя объединение различных представлений.Другой подход - добавить список «частных читателей» для каждого твита.Он допускает специфичные для пользователя (частичные) просмотры, но также представляет сложность добавления списка читателей для каждого нового твита или даже обновления списка в случае появления новых подписчиков или операций отмены подписки.

Важно подуматьвозможных операций и их частоты.Поэтому, когда вы в основном генерируете списки твитов, лучше перенести сложность на способ интеграции информации о читателях в ваши документы (т. Е. Интеграции читателей в ваш документ с твитами), а затем легко создавать эффективные индексы просмотров.

Если у вас много изменений в ваших данных, лучше спроектировать базу данных так, чтобы не обновлять слишком много существующих документов одновременно.Вместо этого попробуйте добавить данные, добавив новые документы и объединяя их в сложные представления.

Но вы показали крайний случай, когда простого (одномерного) индекса на основе списка недостаточно.На самом деле вам понадобятся вторичные индексы для фильтрации по времени и идентификаторам пользователей (учитывая тот факт, что вам также нужны частичные диапазоны для обоих).Но это невозможно в CouchDB, поэтому вам нужно обойтись, сдвинув данные «запроса» в ваши документы и использовать их при построении представления.

...