【问题标题】:Nested subdocument array embed or link?嵌套子文档数组嵌入或链接?
【发布时间】:2013-09-16 04:54:38
【问题描述】:

所以,我的问题与MongoDB relationships: embed or reference? 相同,但我想知道是否应该将另一层嵌套(如答案)嵌入或链接到架构中。

像这样:

Question
  body: "This is my question"
  Comments: [
    comment: {
      _id: ObjectId
      body: "This is a comment on the question"
    }
  ]
  Answers: [
    answer: {
      _id: ObjectId
      body: "This is an answer"
      Comments: [
        comment: {
          _id: ObjectId
          body: "This is a comment on this answer"
        }
      ]
    }
  ]

我的架构实际上与问题、答案或 cmets 没有任何关系,但架构结构在嵌套和查询类型(例如在这种情况下会执行的编辑和排序)方面是相同的。

另外,我意识到除了单层数组嵌套之外,不可能使用位置表示法。所以answers.$.comments.$.body 是不可能的...https://jira.mongodb.org/browse/SERVER-831?page=com.atlassian.streams.streams-jira-plugin:activity-stream-issue-tab

【问题讨论】:

    标签: arrays node.js mongodb mongoose nested


    【解决方案1】:

    在 RDBMS 系统中,您更多地考虑数据如何处于最佳结构中,因此它是关于 Schema 设计而不是使用,通常使用像 mongoDB 这样的技术,您更多地需要考虑数据将如何用过的。当然,您必须考虑一致性,但更多需要考虑将这些数据存储在一起,同时需要什么。

    无论如何,做几级嵌入式列表不是一个好主意,因为管理起来会很痛苦,并且有一些限制。

    例如,在 stackoverflow 中,问题与答案以及 cmets 一起查看。这些是一级列表,所以没问题。您不会只看到前几个 cmets,因此如果您将它们(例如前 4 个)与答案以及所有其他 cmets 存储在一个单独的集合中,它会在您单击查看更多时起作用。

    此外,如果我们从列出问题的角度来看。您从单击问题开始,然后查询 cmets 和答案(因此它们可以是分开的集合),如果有人可能更深入地挖掘可以单击单个答案以显示更多相关的 cmets(因此它可以再次分开收藏。)

    如果将集合分开处理会容易得多,集合可能不会比将它们放在一起大多少。只有在真正需要查看数据时才需要查询(页入或保存在内存中)数据,您将获得极大的收益。

    【讨论】:

      猜你喜欢
      • 2018-07-24
      • 2021-05-01
      • 1970-01-01
      • 2014-01-29
      • 1970-01-01
      • 2020-11-28
      • 2020-03-27
      相关资源
      最近更新 更多