在记录源数据库时将 CouchDB 数据库与复制相结合

Combine CouchDB databases with replication while recording source db

我刚开始使用 CouchDB (2.1),我打算用它来将每个用户的机密数据从移动应用程序复制到我的服务器。我读到每个用户数据库是执行此操作的最佳方式,并且我已经设置了它。每个数据库都混合了 FooBar.

类型的用户创建文档

现在,我还希望能够将该数据的多用户切片一起收集到一个数据库中,并在其上构建视图以供管理员报告。假设我想要一个包含所有用户的所有 Foos 的数据库。到目前为止一切顺利,_replicator 中的一个条目带有从每个用户数据库到一个目标的过滤器就可以完成这项工作。

但是查看组合数据库,我无法判断给定的 Foo 来自哪个用户。我可以将用户 ID 写入每个用户数据库中的每个文档,但这似乎是多余的,并且增加了验证的复杂性。还有其他办法吗?

CouchDB 的复制器只是简单地尝试匹配目标数据库中给定文档的确切状态——如果不能,它无论如何都会存储准确的源内容(作为冲突版本)。

此外,复制系统用来检查文档是否需要更新的文档的 _rev 字段实际上是基于(散列)其他文档字段。

很遗憾,您无法在复制期间添加元数据。对于这种情况和其他 情况,这确实很方便,但它不是 CouchDB 目前支持的东西,它会破坏一些优化以增加对它的支持。

I could write the user id into each document within the per-user database but that seems redundant and adds the complexity of validation. Is there any other way?

在每个文档中包含类似 .user 字段的内容是正确的解决方案。

至于多余,我不会那样想——或者至少,这不是一件坏事。您会发现 CouchDB(以及其他 NoSQL 存储)有一种趋势是 "denormalize" 数据。特别是考虑到复制允许我在操作和架构上做的事情,我宁愿拥有一个独立的文档,也不愿拥有一个依赖于从数据库名称派生的元数据的文档。

我不确定在您的情况下,额外的字段究竟会使验证变得更加复杂,所以我不能完全说明这一点。你想确保编写文档的用户已经设置它"honestly",所以是的,有一点复杂,但在大多数情况下通常不会太麻烦。