嵌套的子文档数组嵌入还是链接?

时间:2013-09-12 00:35:07

标签: arrays node.js mongodb mongoose nested

所以,我的问题与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"
        }
      ]
    }
  ]

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

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

1 个答案:

答案 0 :(得分:1)

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

无论如何,进行多级嵌入式列表并不是一个好主意,为什么管理会很麻烦,并且有一些限制。

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

而且,如果我们从列出问题的角度出发。你首先点击问题然后你查询评论和答案(所以他们可以分开收集)如果有人可能深入挖掘可以点击一个单独的答案来显示更多相关的评论(所以它可以再次分开集合。)

如果你将收藏品分开处理会更容易,收藏品可能不会比将它们放在一起大得多。当您真正需要查看数据时,您只需查询(页面输入或保留在内存中)数据,您将获得极大的收益。