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

记录源数据库时将CouchDB数据库与复制相结合,couchdb,couchdb-2.x,Couchdb,Couchdb 2.x,我刚开始使用CouchDB(2.1),我计划使用它将每个用户的机密数据从移动应用程序复制到我的服务器。我已经读到,每个用户数据库是实现这一点的最好方法,我已经设置了它。每个数据库都混合了用户创建的Foo和Bar类型的文档 现在,我还希望能够将这些数据的多用户片段收集到一个数据库中,并在该数据库上构建视图以用于管理报告。假设我想要一个包含所有用户所有foo的数据库。到目前为止还不错,\u replicator中有一个条目,其中包含从每个用户数据库到一个目标的过滤器 但从组合数据库来看,我无法判断给

我刚开始使用CouchDB(2.1),我计划使用它将每个用户的机密数据从移动应用程序复制到我的服务器。我已经读到,每个用户数据库是实现这一点的最好方法,我已经设置了它。每个数据库都混合了用户创建的
Foo
Bar
类型的文档

现在,我还希望能够将这些数据的多用户片段收集到一个数据库中,并在该数据库上构建视图以用于管理报告。假设我想要一个包含所有用户所有
foo
的数据库。到目前为止还不错,
\u replicator
中有一个条目,其中包含从每个用户数据库到一个目标的过滤器


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

CouchDB的replicator只是尝试匹配目标数据库中给定文档的确切状态,如果无法匹配,它会存储±确切的源内容(作为冲突版本)

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

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

我可以将用户id写入每个用户数据库中的每个文档中,但这似乎是多余的,并且增加了验证的复杂性。还有别的办法吗

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

至于冗余,我不会这样认为——或者至少,不是一件坏事。您会发现CouchDB(和其他NoSQL存储一样)一开始就有“非规范化”数据的趋势。特别是考虑到复制允许我在操作和体系结构上做的事情,我更希望有一个自包含的文档,而不是一个依赖于从数据库名称派生的元数据的文档


我不确定在您的案例中,一个额外的字段如何使验证更加复杂,所以我不能完全说明这一点。您确实希望确保编写文档的用户已将其设置为“诚实”,因此确实存在一些更复杂的问题,但在大多数情况下通常不会太麻烦。

这很有帮助-谢谢。只是想详细说明一下——我很高兴非规范化(来自mongodb),但对于我来说,冗余问题是,如果我从客户机(Pogg)->每个用户db->组合db复制,那么即使客户端移动应用程序也要容纳很多(千个)它自己的ID的副本。传统上,我希望服务器在这种情况下添加经过身份验证的客户端的ID-将其添加到每个文档的客户端是来自客户端POV的大量无用数据。强化诚实是我考虑重新验证的唯一复杂因素,但我想这并不难。接受,因为似乎没有更好的方法,而你的答案对理解原因很有帮助。希望能够将双射定义为复制设置的一部分,可能会在coach 3或4;)中提供。无论如何,谢谢!