在CouchDb中创建新文档而不是更新有哪些可能的缺点?

时间:2016-06-01 10:07:58

标签: couchdb pouchdb

我已经开始在我的新项目中将CouchDb与PouchDb结合使用,并且相对较新。我有一个基本的疑问。

要更新文档,我需要具有_rev值,这意味着查询数据库,例如如图所示here

// fetch mittens
db.get('mittens').then(function (doc) {
  // update their age
  doc.age = 4;
  // put them back
  return db.put(doc);
}).then(function () {
  // fetch mittens again
  return db.get('mittens');
}).then(function (doc) {
  console.log(doc);
});

更新后,db中存在两个文档修订版。只有在压缩过程中才会清除文档的旧版本。

如果我在我的文档ID中添加时间戳,例如 shashi@stackoverflow.com-user-1464772888286,然后我的数据库中有不同的文档,而不是对同一文档的不同修订版本。

添加新文档后,我可以删除包含旧时间戳的文档。因此,在查询时我可以使用

查询all_docs
startkey="shashi@stackoverflow.com-user-"&endkey="shashi@stackoverflow.com-user-\uffff"   

并根据时间戳获取最新的文档。 (无论如何,由于我在创建新文档时删除较旧的文档,因此此查询仅返回一个文档。)

在我正在构建的应用程序中,桌面应用程序将仅在桌面上创建和修改文档,并同步到服务器以进行存储/报告/分析。因此,其他人将修改导致冲突的文档的情况很少。

最初,我采用了保持id相同的方法。但是,我遇到了一个奇怪的错误,其中pocuhdb在尝试更新文档时引发了错误,但是在CouchDb上创建了具有相同数据的不同修订,pouchDb配置为同步。由于我缺乏时间并且正在构建一个概念证明,我继续在_id中使用时间戳的方法。

然而,现在我想知道这种方法的潜在缺陷是什么?我有一种直觉,因为我没有看到任何人采取这种方法,但我不确定他们是什么。

1 个答案:

答案 0 :(得分:1)

CouchDb通过主id进行查找效率最高。要使用开始和结束键,您需要使用视图,这意味着您将失去性能并处理更复杂的视图。

例如,如果您执行大量插入操作,则在更新时从视图获取响应会有一点延迟。它还需要更多的磁盘空间。

我还认为,您将要执行的删除操作会比更新前首先检索文档更能影响您的性能。最好在安静的时候对旧版本进行压缩处理。

最后,既然你总是在创建新的文档,我假设你在写作时总是可以访问完整的文档(否则你将如何能够存储而无需检索),也许你也可以存储&#34 ; _rev" param(当您执行PUT时返回)然后使用它进行更新,而不必请求文档。