0

我有几个 CouchDB 数据库,都在数百 GB,我需要以依赖于多个数据库的方式从中获取文档,例如(伪代码,前缀指示文档来自哪个数据库):

for each Db1_Document in Db1
    if Db1_Document has field "Db2_match"
        Db2_Document = Db1_Document.Db2_match
        for each Db2_Reference in Db2_Document.references
            if Db2_Reference has empty field "Db1_match"
                add Db2_Reference to List bigList
        emit [Db2_Document, bigList]

我可以用一组复杂(和骇人听闻的)视图来做到这一点。或者我可以批量 HTTP 获取我需要的文档并用 Java 进行处理。

与创建视图相比,批量 HTTP 获取的成本是多少?CouchDB 本身不支持视图链接的事实是否足以避免视图解决方案?

这是一个效率非常重要的应用程序。

4

2 回答 2

1

在 Couch 中创建视图是 I/O 和 CPU 密集型的,特别是因为它会影响实例中的所有文档。

如果您的逻辑影响所有文档,那么创建视图可能是最有效的机制。如果您有一个相当粗略的视图已经为您提供了此处理所需的子集(或子集的超集,但少于整个 DB),那么最好简单地获取您需要的子集并在本地处理它.

于 2012-07-16T18:32:58.710 回答
1

您可能会发现创建一个新数据库更容易/更好,该数据库使用过滤复制将所有信息从其他数据库提取到另一个数据库中。然后对其他数据库进行查询。您的数据会有点陈旧,但将所有相关数据放在一个数据库中的优势在于可以编写一个可以查看所有相关文档的视图。因此,当新文档从复制步骤到达时,该视图将被索引并增量更新。

这将提供世界上最好的:

  • 您将能够编写有意义的视图。
  • 您将只将您需要的数据提取到您的 Java 代码中。
  • 您仍然会在运行时获得性能优势,因为视图将被编入索引,随着新数据从复制中到达,该视图将被增量更新。
于 2012-07-16T21:11:25.270 回答