Architecture PockDB可以在客户端代理一个大数据库吗?

Architecture PockDB可以在客户端代理一个大数据库吗?,architecture,frontend,pouchdb,Architecture,Frontend,Pouchdb,在处理单页应用程序时,为了与服务器端数据同步,我必须编写大量样板代码 为这个问题提供了一个优雅的解决方案,允许在客户端本地访问数据 我不明白的是,当数据库太大而无法完全放入浏览器内存时,Pocket是否适合作为数据库代理 据我所知,Pocket可以复制整个远程数据库,因此,当整个数据库都放在浏览器内存中时,就可以使用它 示例用例 假设我有一个包含所有维基百科文章的数据库,我想在客户端操作其中的一部分。复制不是解决问题的方法,需要的是代理。例如,当在客户端本地发出查询时,只应传输匹配结果。仅对复制

在处理单页应用程序时,为了与服务器端数据同步,我必须编写大量样板代码

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

我不明白的是,当数据库太大而无法完全放入浏览器内存时,Pocket是否适合作为数据库代理

据我所知,Pocket可以复制整个远程数据库,因此,当整个数据库都放在浏览器内存中时,就可以使用它

示例用例
假设我有一个包含所有维基百科文章的数据库,我想在客户端操作其中的一部分。复制不是解决问题的方法,需要的是代理。例如,当在客户端本地发出查询时,只应传输匹配结果。仅对复制的值运行查询是不可行的,因为不可能在本地复制整个数据库。

您是对的,PockDB sync不会真正执行您希望它执行的操作。它旨在使用服务器端设计文档同步整个数据库或预定义的数据库子集

如果我是你,我可能仍然会使用PockDB,但我会手动处理同步。大概是这样的:

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以查询开头的所有文档。或者你可以使用二级索引


因此,尽管您不会从PockDB的内置同步中获得好处,但您可以在服务器上编写与客户端相同的代码,再加上PockDB的跨浏览器支持。所以我不认为这是一种不好的方式。

很有趣。这样,编写缓存包装器看起来很容易。我在这里看到的问题是缓存的报告不会自动与远程保持同步,因此缓存不能被信任是的,这很不幸,但您必须手动处理。例如,您可以在远程数据库上设置一个
changes()
侦听器,然后查找与已缓存的文档ID匹配的ID,以便在更新文档时查看。听起来这是一个很好的开发数据库插件的主意。:)CouchDb 2.x即将推出对索引视图的changes()支持,这将允许更高效的过滤更改和过滤复制。