2015-03-12 3 views
8

У меня есть приложение pouchdb, которое управляет пользователями.PouchDB: Несколько удаленных баз данных, одна локальная база данных (фантастическая репликация)

Пользователи имеют локальный экземпляр pouchDB, который реплицируется с помощью одной базы данных couchDB. Довольно просто.

Здесь все становится немного сложнее. Я представляю концепцию «групп» для моего дизайна. Группы будут разными базами данных couchDB, но локально, они должны быть частью пользовательской базы данных.

Я читал немного о «Причудливая репликация» на сайте pouchDB, и это кажется решением, которым я пользуюсь.

Теперь, мой вопрос: как мне это сделать? Более конкретно, Как я могу реплицировать из нескольких удаленных баз данных в один локальный? Некоторые примеры кода будут супер.

Из приведенной ниже диаграммы вы заметите, что мне необходимо существенно динамически добавлять базы данных на основе групп, в которых находится пользователь. Критика моего дизайна также будет оценена. Спасибо!

enter image description here

Если поток будет что-то вроде этого:

  1. Получить все документы пользователей из его/ее БД в localUserDB
  2. var groupDB = new PouchDB('remote-group-url'); groupDB.replicate.to(localUserDB);
    (любые проблемы с производительностью с несколькими экземплярами pouchdb 0_0?)
  3. Локально, когда пользователь вносит изменения, связанные с Определенная группа, мы определим соответствующую базу данных и репликации, делая что-то вроде:
    localUserDB.replicate.to(groupDB) (нужно ли мне фильтруется репликацию?)

Edit: Нолан порекомендовал мне взглянуть на «роль» CouchDB системы, чтобы решить мою проблему , Я отправлю сюда, как только выясню это.

+0

Вы поняли систему ролей? –

+0

Да, в основном в базе данных '' _users'' я использовал одну роль для каждой базы данных. Я определил имена баз данных, к которым пользователь имеет доступ в массиве '' role'' пользователя в каждом пользовательском документе. Дайте мне знать, если у вас есть более конкретные вопросы, я буду рад помочь, так как я потратил на это значительное количество времени. –

+0

как вы настроили синхронизацию между пользовательскими базами данных? –

ответ

9

Replicate из многих удаленных баз данных на ваш локальный:

remoteDB1.replicate.to(localDB); 
remoteDB2.replicate.to(localDB); 
remoteDB3.replicate.to(localDB); 
// etc. 

Затем сделать фильтрованной репликации из локальной базы данных в удаленной базе данных, которая должна получать изменения:

localDB.replicate.to(remoteDB1, { 
    filter: function (doc) { 
    return doc.shouldBeReplicated; 
    } 
}); 

Почему отфильтрованная репликация? Поскольку ваша локальная база данных содержит документы из многих источников, и вы не хотите копировать все обратно в одну удаленную базу данных.

Почему функция фильтра? Поскольку вы копируете из в локальную базу данных, нет никакой выгоды от использования проектных документов, представлений и т. Д. Просто передайте функцию фильтра; это проще.:)

Надеюсь, что это поможет!

Редактировать: ОК, похоже, что имена групп, к которым принадлежит пользователь, фактически включены в первую базу данных, что вы подразумеваете под «итерацией». Нет, вы, вероятно, не должны этого делать. :) Вы пытаетесь обойти встроенную систему аутентификации/привилегий CouchDB.

Вместо этого вы должны использовать встроенные в CouchDB роли , применить эти роли к пользователю и затем использовать схему «база данных для каждой роли», чтобы обеспечить пользователям доступ только к их соответствующим групповым БД. Пользователи могут всегда запрашивать API _users, чтобы узнать, к каким ролям они принадлежат. Просто!

Для получения более подробной информации, читайте pouchdb-authentication README.

+0

Нолан! Чтобы обеспечить правильное понимание, поток будет примерно таким: 1) Извлеките все пользовательские документы из своего DB 2) Когда встречается документ группы типов: 'var groupDB = new PouchDB ('remote- group-url '); '(любые проблемы с производительностью здесь 0_0?) ' groupDB.replicate.to (localUserDB); ' 3) Локально, когда пользователь вносит изменения, связанные с определенной группой, мы определяем соответствующие базы данных и репликации, выполнив что-то вроде: 'localUserDB.replicate.to (groupDB)' (немного путают, когда использовать фильтрованную репликацию в этом случае) Имеет ли смысл мой поток? Спасибо человеку –

+0

Я извиняюсь за блок текста, но переполнение стека, похоже, не допускает разрывов строк в комментариях. Кроме того, переполнение стека, по-видимому, не позволяет редактировать ваши комментарии через пять минут. 0_0 –

+0

** Я добавил комментарий нечитабельного блока выше к самому вопросу ** под изображением, –

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