Может ли PouchDB проксировать большую базу данных на стороне клиента?

Работая над одностраничными приложениями, мне приходится писать много стандартного кода для синхронизации с данными на стороне сервера.

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

Чего я не понимаю, так это подходит ли Pouch в качестве прокси базы данных, в тех случаях, когда база данных слишком велика, чтобы полностью поместиться в памяти браузера.

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

Пример использования

Допустим, у меня есть база данных со всеми статьями Википедии, и я хочу манипулировать частью из них на стороне клиента. Репликация — не выход, нужно проксирование. Например, когда запрос выдается локально на стороне клиента, должны быть переданы только совпадающие результаты. Невозможно выполнить запрос только к реплицированным значениям, поскольку невозможно локально реплицировать всю базу данных.


person danza    schedule 31.07.2014    source источник


Ответы (1)


Вы правы в том, что синхронизация PouchDB на самом деле не будет делать то, что вы хотите. Он предназначен для синхронизации целых баз данных или предопределенных подмножеств базы данных с использованием проектной документации на стороне сервера.

Если бы я был на вашем месте, я бы, вероятно, все еще использовал PouchDB, но я бы занимался синхронизацией вручную. Что-то вроде этого:

var localDB = new PouchDB('localDB');
var remoteDB = new PouchDB('http://some-site.com:5984/somedb');

function searchForDocs(docId) {
  // try the local DB first
  localDB.get(docId).catch(function (err) {
    if (err.name !== 'not_found') {
      throw error;
    }
    // not found, so fall back to the remote DB
    return remoteDB.get(docId).then(function (doc) {
      // cache in the local DB
      delete doc._rev;
      return localDB.put(doc).then(function () {
        return doc;
      });
    });
  }).then(function (doc) {
    // do something with our doc
  }).catch(function (err) {
    // handle any errors along the way
  });
}

Использование get() здесь немного упрощено; в вашем случае с Википедией вы, вероятно, захотите сделать allDocs({startkey: query, endkey: query + '\uffff'}), чтобы найти все документы, идентификатор которых начинается с запроса. Или вы можете использовать вторичный индекс.

Таким образом, хотя вы не получаете преимуществ встроенной синхронизации PouchDB, вы получаете возможность писать тот же код для сервера, что и для клиента, а также кросс-браузерную поддержку PouchDB. Так что я не думаю, что это плохой способ сделать это.

person nlawson    schedule 01.08.2014
comment
Интересно. Таким образом, выглядит легко написать кэширующую оболочку. Проблема, которую я здесь вижу, заключается в том, что кешированные отчеты не будут автоматически синхронизироваться с удаленным, поэтому кешу нельзя доверять. - person danza; 01.08.2014
comment
Да, это прискорбно, но вам придется справиться с этим вручную. Например, вы можете просто настроить прослушиватель changes() в удаленной базе данных и искать идентификаторы, соответствующие идентификатору документа, который вы уже кэшировали, чтобы увидеть, когда он будет обновлен. Звучит как хорошая идея для плагина PouchDB. :) - person nlawson; 01.08.2014
comment
Скоро в CouchDb 2.x появится поддержка change() для индексированных представлений, что позволит более эффективно фильтровать изменения и фильтровать репликацию. - person Tony O'Hagan; 21.11.2015