PouchDB可以代理客户端的大数据库吗?

时间:2014-07-31 13:48:30

标签: architecture frontend pouchdb

处理单页应用程序我必须编写大量样板代码才能与服务器端数据同步。

PouchDB为此问题提供了一个优雅的解决方案,允许在客户端本地访问数据。

我不明白,在数据库太大而无法完全适合浏览器内存的情况下,Pouch是否适合作为数据库代理。

据我所知,Pouch可以复制整个远程数据库,因此可以在整个数据库适合浏览器内存的情况下使用。

示例用例

让我们说我有一个包含所有维基百科文章的数据库,我想在客户端操纵其中的一部分。复制不是要走的路,需要的是代理。例如,当在客户端本地发出查询时,只应传输匹配的结果。仅对复制值运行查询是不可行的,因为无法在本地复制整个数据库。

1 个答案:

答案 0 :(得分:5)

你是对的,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'})找到ID以查询开头的所有文档。或者你可以使用二级索引。

因此,虽然您无法获得PouchDB内置同步的好处,但您可以获得能够像客户端一样针对服务器编写相同代码的好处,以及PouchDB&#39 ; s跨浏览器支持。因此,我认为这不是一个糟糕的方式。