【问题标题】:What are the possible disadvantages of creating new doc instead of updating in CouchDb?创建新文档而不是在 CouchDb 中更新可能有哪些缺点?
【发布时间】:2016-09-30 15:25:00
【问题描述】:

我已经开始在我的新项目中将 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);
});

更新后,数据库中存在文档的两个修订版本。文档的旧版本仅在压缩过程中被清除。

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

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

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

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

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

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

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

【问题讨论】:

标签: couchdb pouchdb


【解决方案1】:

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

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

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

最后,由于您总是在创建新文档,我假设您在写入时始终可以访问完整文档(否则您将如何在不检索的情况下进行存储),也许您也可以存储“_rev”参数(在执行 PUT 时返回),然后将其用于更新,而不必请求文档。

【讨论】:

  • Nicholaj 是对的:在您的特定情况下,为每次更新创建新文档没有意义,这仅在许多用户编辑同一文档的环境中才有意义。您遇到的问题听起来像是冲突,请尝试解决冲突。
猜你喜欢
  • 1970-01-01
  • 2019-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多