作者:MongoDB 首席技术支持工程师 William Zola
“我用SQL很长时间了, 但是 MongoDB 对我而言算是一个新东西。在 MongoDB 里面我该怎么处理___一对多___的关系呢?”这是我在 MongoDB 工作期间,用户问的最多的一个问题。
这个问题我没办法用简单的一两句话就给说明白,因为不止一种方式可以做到这件事情。对于 SQL 中经常谈及的比较扁平化的___一对多___这个数据表之间的关系,MongoDB 有非常丰富而且细腻的词汇来表达它。接下来我们就一起看一下,在 MongoDB 中处理___一对多___这种关系的时候,你都有哪些选择。
由于要讲的东西太多,我会把内容分为 3 部分来向说。在第一部分中,我会给大家讲解在MongoDB中实现___一对多___关系的 3 种基本方式;在第二部分中,我会介绍更加复杂的 Schema 设计方式,包括非规范化和双向引用;在最有一部分中,我会带大家回顾所有内容,并针对在 MongoDB 中设计___一对多___关系时,你会考虑的上千种选择(真的是上千种哦),给你一些建议。
在大多数新手看来,MongoDB 中设计这种___一对多___的关系只有一种方案,那就是在父文档(parent document)中嵌入一个包含子文档(sub-document)的数组,但事实并非如此。但这只是因为你可以使用嵌入方式(embedding),并不意味着你应该使用嵌入方式(embedding)。
在设计一个 MongoDB Schema 的时候,你应该从一个你在使用 SQL 的时候从来都不会考虑的问题开始:关系(Relationship)的基数(cardinality注[1])是什么?换句更通俗易懂的话来讲:你需要用更准确的方式来描述你的___一对多___关系,是”一对几个”,还是“一对很多个”,还是___一对超级多___,这对你讲采用哪种方式来建立你的关系模型,有着至关重要的影响。