【问题标题】:Imitate join for NoSQL document databaseNoSQL 文档数据库的模拟连接
【发布时间】:2011-10-14 06:47:58
【问题描述】:

是否有任何变通方法可以使用 NoSQL 文档数据库执行类似联接的查询?

示例:我们需要按用户评分超过千的用户选择上个月的文章。 SQL解决方案是

SELECT a.* FROM Articles as a
INNER JOIN Users as u ON a.UserId = u.Id
WHERE a.Date > (Now - Month) AND u.Rating > 1000

我可以想象几种 NoSQL 解决方案。首先是两个查询解决方案:

  1. 检索评分超过 1000 的用户
  2. 检索这些用户上个月的文章

我不喜欢它,因为我必须进行两次查询,并且我必须检索所有评分 > 1000 的用户(如果我有 1kk 的用户怎么办?)

我想到的另一个 NoSQL 解决方案是非规范化。但我不是它的忠实粉丝。我不反对将 cmets 集合放到 post 实体中(因为 cmets 属于 post),但我不喜欢将 user 放在文章中或将文章放在 user 中。

还有其他解决方案吗?

【问题讨论】:

    标签: mongodb couchdb ravendb nosql


    【解决方案1】:

    您可以使用带有RavenDB 的Multi Maps / Reduce 索引来做到这一点。见here

    【讨论】:

      【解决方案2】:

      RavenDB Multi Maps 很好地处理了这种情况:

      http://ayende.com/blog/89089/ravendb-multi-maps-reduce-indexes

      【讨论】:

        【解决方案3】:

        另一个解决方案可能是 playOrm,您可以在其中对表进行分区并选择和加入分区。 IT 基本上就像带有 JQL 的休眠,除了查询到分区之外。也许如果您按月分区,您可以在该分区上运行一个简单的老式选择查询并将其与其他内容连接起来。 noSql 现在似乎通​​过 playOrm 加入;)。它当然不会在 HUGE 表上进行连接。在进行连接时,PARTITION 的大小需要与 RDBMS 表的大小相当......表的大小可以是无限的(即您有无限的分区)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-03-14
          • 1970-01-01
          • 2012-09-04
          • 2019-01-06
          • 2011-08-16
          • 2011-08-23
          • 2011-10-19
          • 1970-01-01
          相关资源
          最近更新 更多