Подтвердить что ты не робот

Несколько удаленных баз данных, одна локальная база данных (необычная репликация)

У меня есть приложение 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) (Нужна ли фильтрованная репликация?)
4b9b3361

Ответ 1

Репликация из многих удаленных баз данных на локальный:

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.