RethinkDB可以容纳超过几百个嵌入式阵列吗?

时间:2013-09-26 14:53:26

标签: mongodb rethinkdb rethinkdb-ruby nosql

http://www.rethinkdb.com/docs/data-modeling/,声明:

  

由于之前的限制,最好保持大小   将数组发布到不超过几百个文档。

如果我打算保留90天(3个月)的统计数据,并且每个日期可能包含大约10个地区的嵌入式数组。这意味着90 * 10 = 900。 900不完全是几百

然而MongoDB relationships: embed or reference?的相关问题表明,MongoDB的限制为16mb,这意味着能够托管3000万条推文或大约250,000个典型的Stackoverflow问题作为嵌入式文档。那太多了!

然而,那就是MongoDB。 RethinkDB每个文档的限制为10mb。哪个应该还是相当高的。 RethinkDB的文档可能存在缺陷。或者还有另一个具体原因(未解释)为什么Rethinkdb建议只将它保持在几百个嵌入式数组中,即使10mb可以明显地保持不止这么多。

我所指的架构的粗略概念:

DailyStat::Campaign
[
  {
    id: '32141241dkfjhjksdlf',
    days_remaining: 26,
    status: 'running',
    dates: [
      {
        date: 20130926,
        delivered: 1,
        failed: 1,
        clicked: 1,
        top_regions: [
          { region_name: 'Asia', views: 10 },
          { region_name: 'America', views: 10 },
          { region_name: 'Europe', views: 10 },
          { region_name: 'Africa', views: 10 },
          { region_name: 'South East Asia', views: 10 },
          { region_name: 'South America', views: 10 },
          { region_name: 'Northern Europe', views: 10 },
          { region_name: 'Middle East', views: 10 }
        ]
      },
      {
        date: 20130927,
        delivered: 1,
        failed: 1,
        clicked: 1,
        top_regions: [
          { region_name: 'Asia', views: 10 },
          { region_name: 'America', views: 10 },
          { region_name: 'Europe', views: 10 },
          { region_name: 'Africa', views: 10 },
          { region_name: 'South East Asia', views: 10 },
          { region_name: 'South America', views: 10 },
          { region_name: 'Northern Europe', views: 10 },
          { region_name: 'Middle East', views: 10 }
        ]
      },
      ...
    ]
  }
]

2 个答案:

答案 0 :(得分:5)

简短回答:

该帖子指的是每个嵌入式阵列的大小,而不是它们大小的总和。所以在你的情况下,大小只有10,这肯定会很好。

更长的anser:

在文档中拥有一个大型嵌套数组的问题(实际上只是一个大型文档,对于数组没什么特别的),如果你需要更新它会使它变慢。 RethinkDB现在不进行部分更新,因此,只要您想要更新文档,就需要读取整个磁盘并将整个内容写入磁盘。同样,如果您经常阅读文档但只关心其中的一小部分,这可能会成为一个问题。例如,如果您在文档中有一个非常大的数组,而且还有一个小字段,那么每次尝试读取小字段时都需要经常读取它,您将支付读取大数组的费用。

答案 1 :(得分:1)

此处提到的“先前限制”是指以下内容:

  

使用嵌入式数组的缺点:对作者文档的任何操作都需要将所有帖子加载到内存中。对文档的任何更新都需要将整个数组重写为磁盘。

这不仅限于限制,更多是关于绩效折衷。

例如,如果您将每个用户的推文嵌入到用户表中,则可能会遇到性能问题,因为:

  1. 推文的嵌入使用户文档变大
  2. 每次插入推文时,都必须更新整个用户文档(很大)
  3. 每位用户每天可能会插入很多推文
  4. 将此乘以用户总数
  5. 另一方面,如果您将推文存储在单独的表中,则每次插入都很小且便宜。

    在您的实例中,您每天都会存储统计信息。每天更新一个单个文档不应该导致任何性能问题,即使它只有几MB。