【问题标题】:Can PouchDB proxy a big database on the client side?PouchDB 可以在客户端代理一个大数据库吗?
【发布时间】:2014-07-31 13:48:30
【问题描述】:

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

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

我不明白的是,Pouch 是否适合作为数据库代理,以防数据库太大而无法完全放入浏览器内存中。

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

示例用例

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

【问题讨论】:

    标签: architecture frontend pouchdb


    【解决方案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() 有点简单;在您的 Wikipedia 案例中,您可能想要执行 allDocs({startkey: query, endkey: query + '\uffff'}) 来查找 ID 以查询开头的所有文档。或者你可以使用二级索引。

    因此,尽管您不会获得 PouchDB 内置同步的好处,但您会获得能够针对服务器编写与客户端相同的代码以及 PouchDB 的跨浏览器支持的好处。所以我不认为这是一个糟糕的方法。

    【讨论】:

    • 有趣。这样,编写缓存包装器看起来很容易。我在这里看到的问题是缓存的报告不会自动与远程保持同步,因此缓存不可信
    • 是的,很不幸,但您必须手动处理。例如,您可以在远程数据库上设置一个changes() 侦听器,并查找与您已缓存的文档的 ID 匹配的 ID,以查看它何时更新。对于 PouchDB 插件来说,这听起来是个好主意。 :)
    • 即将在 CouchDb 2.x 中推出对索引视图的更改()的支持,这将允许更有效的过滤更改和过滤复制。
    猜你喜欢
    • 2017-12-04
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 2021-04-08
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    • 1970-01-01
    相关资源
    最近更新 更多