1

我刚开始使用 CouchDB (2.1),我打算用它来将每个用户的机密数据从移动应用程序复制到我的服务器。我读过每用户数据库是做到这一点的最佳方式,我已经设置好了。每个数据库都混合了用户创建的类型FooBar.

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

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

4

1 回答 1

1

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

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

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

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

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

就冗余而言,我不会那样想——或者至少,不是一件坏事。您会发现 CouchDB(和其他 NoSQL 存储一样)有一种趋势是从一开始就“非规范化”数据。特别是考虑到复制让我在操作和架构上可以做的事情,我宁愿拥有一个独立的文档,而不是依赖于从数据库名称派生的元数据的文档。

我不确定在您的情况下,一个额外的字段将如何使验证更加复杂,所以我不能完全说明这一点。您确实希望确保编写文档的用户“诚实地”设置它,所以是的,这有点复杂,但在大多数情况下通常不会太繁琐。

于 2017-10-25T20:40:33.837 回答