所以,我一直在看这个视频,以便学习MongoDB数据建模。在一对多关系中,演讲者谈论三种不同的类型:
- 嵌入式数组/数组键:在特定文档中,您将有一个字段,该字段将是引用其他文档的数组(例如,用户文档中的blog_posts属性将存储用户创建的博客文章的所有id)
- 嵌入式树:我们在文档中完全嵌入了文档,而不是使用引用其他内容的数组
- Normalized:在彼此之间有两个集合和引用
那么,嵌入的数组键和规范化的数组键之间有什么区别呢?嵌入式数组不是也在引用另外两个集合吗?
区别很简单(不幸的是,在视频中有点令人困惑)。
想象一下,为一篇博客文章(Post
)和评论(Comment
)建模。
- 嵌入式数组:
Post
文档包含所有Comment
文档的所有ID的数组。Comment
存储在单独的文档(和/或集合)中 - 树:
Post
文档包含嵌入的Comment
s。它们不存储在不同的文档中,也不存储在自己的集合中。虽然这表现得很好,但BSON文档的大小限制为16MB,这可能会使其更难使用 - 规范化:
Post
文档和Comment
文档分别存储。然而,在这种情况下的Comment
文档具有对Post
的类似外键的引用。例如,它可能有一个名为postId
的字段。它将引用与Comment
相关的Post
。此模式与#1不同,因为Post
文档不包含Comments
的列表。因此,虽然此选项使Comments的数量基本上是无限制/无限制的,但如果不建立特定的索引,它可能会使注释的检索效率更高(例如postId
、commentDate
可能很有用)