4

http://www.rethinkdb.com/docs/data-modeling/,状态:

由于前面的限制,最好将帖子数组的大小保持在不超过几百个文档。

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

然而,MongoDB 关系中的一个相关问题:嵌入还是引用?建议 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 }
        ]
      },
      ...
    ]
  }
]
4

2 回答 2

5

简短的回答:

那篇文章指的是每个嵌入式数组的大小,而不是它们大小的总和。所以在你的情况下,大小只有 10,这肯定没问题。

更长的分析器:

在文档中有一个大的嵌套数组(实际上只是一个大的文档,一般来说,数组没有什么特别之处)的问题是,如果您需要更新它,它会变得很慢。RethinkDB 目前不进行部分更新,因此无论何时您想要更新文档,都需要读取磁盘的整个内容并将整个内容写入磁盘。同样,如果您经常阅读文档但只关心其中的一小部分,这可能会成为问题。例如,如果您在文档中有一个非常大的数组,但还有一个小字段,您每次尝试读取小字段时都需要经常从中读取,您将付出读取大数组的代价。

于 2013-09-26T18:07:29.817 回答
1

这里所说的“以前的限制”是指以下内容:

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

这不是关于限制,而是关于性能权衡。

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

  1. 推文的嵌入使用户文档变大
  2. 每次插入推文时,都必须更新整个用户文档(很大)
  3. 每个用户每天可能有很多推文插入
  4. 将其乘以用户总数

另一方面,如果您将推文存储在单独的表中,则每次插入都很小且便宜。

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

于 2013-10-07T15:40:13.987 回答