【问题标题】:MongoDb data modelling, one large collection VS multiple smaller collectionsMongoDb 数据建模,一个大集合 VS 多个小集合
【发布时间】:2021-09-30 18:52:59
【问题描述】:

我无法决定我应该对我的 mongodb 数据使用什么数据模型结构。我读过有人说一个大集合是最好的选择,也有人说多个小集合是最好的选择。

我有“用户”,它们将存储在一个集合中。

我看过的选项是:

1.

Users (the collection):
  _id (what the documents include)
  name
  ...

Posts:
  _id
  user_id
  title
  body

要查找用户的所有帖子,我将查询 .collection("Posts").find({user_id: "123test"})

2.

Users:
  _id
  name
  ...

(user1)Posts:
  _id
  title
  body

(user2)Posts:
  _id
  title
  body

(user3)Posts:
  _id
  title
  body

...

要查找用户的所有帖子,我将查询 .collection(user + "Posts").find({})

用户和帖子将不断增长,我想要对大量数据有好处的东西。例如,一个用户可能有 1000-10000 个帖子。 最后可能会有大约 100 个用户。 这将等于 10 000 000 个帖子。 我还将在 Posts 集合上使用具有多个索引的多个过滤器。

我正在使用 Mongodb atlas serverless,那么什么选项是性能最高和最便宜的?

感谢您的宝贵时间:)

【问题讨论】:

    标签: database mongodb data-structures data-modeling mongodb-atlas


    【解决方案1】:

    IMO 最好的解决方案是采用第一种方法,避免在 Users 集合中出现异常膨胀的文档,即 The Subset Pattern 行。原因是对存储在 RAM 中的Working Set 的最佳使用。每当您触发查询时,它首先会尝试从 RAM 中解析,如果无法解析,它会转到磁盘获取数据,从而增加延迟。

    因此,如果您有较大的文档,存储引擎将能够容纳较少数量的存储在 RAM 中的工作集中的文档,而如果您有较小的文档,它将能够容纳更多数量的文档,从而增加了从 RAM 本身解决查询的可能性,而不必传输到磁盘或仅针对有限的数据集。

    除此之外,当您将Posts 存储在具有名为user_id 的字段的单独集合中时,可维护性和可伸缩性也会更好,如您在第一个示例中所示。此外,如果有一个用例,您必须显示用户的前 10 个帖子或类似的东西,那么您可以存储 posts 类型为 Array<Posts>making sure it is a bounded array with limited items, and not unbounded 的字段。

    【讨论】:

    • 感谢您的回答,但实际上采用了每租户数据库的方法。只是因为我关心安全并希望将数据与其他用户分开
    猜你喜欢
    • 2012-07-15
    • 2013-02-25
    • 2015-12-01
    • 1970-01-01
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多