MongoDB中应选关联查询还是嵌入文档?人员地址存储方案咨询
人员与居住地址数据存储方案选择建议
方案一:嵌入(人员属性直接放进Address集合)
适合这些场景:
- 人员和地址是一对一强绑定:比如一个人只有一个固定居住地址,不会有多个地址的情况,嵌入后不用做关联查询,一次就能拿到完整数据,性能更优。
- 人员属性少且不常变:比如只有姓名、年龄这俩字段,而且很少修改,嵌入后不会因为更新人员信息导致大量Address文档变动,避免数据不一致。
- 查询以地址为核心:大部分时候都是查某地址对应的人,嵌入后直接查Address集合就够,不用折腾
$lookup。
方案二:分两个集合(Person + Address带person_id)
适合这些场景:
- 一个人有多个地址:比如同时有家庭地址、工作地址,要是嵌入的话,每个地址文档里都会重复存一遍人员信息,后续改个姓名就得改N个文档,很容易出错。
- 人员属性多或频繁更新:比如Person还有手机号、职业、邮箱一堆字段,而且经常要改,分集合的话只需要更新Person文档一次,所有关联的Address查询时都会自动拿到最新信息。
- 需要复用人员数据:比如除了Address,还有订单、支付记录这些集合也要关联同一个人,分集合的话Person数据只存一份,不会冗余。
- 查询需求灵活多样:有时候只想查人员基本信息,有时候要查某个人的所有地址,分集合可以单独查对应集合,或者用
$lookup按需组合数据。
怎么选?
先搞清楚这几个问题:
- 一个人对应几个地址?(1个→优先嵌入;多个→必须分集合)
- 人员信息会不会经常改?(会→分集合;不会→可以考虑嵌入)
- 还有其他业务场景要用到Person数据吗?(有→分集合;没有→嵌入)
- 每次查询都必须同时拿到人员和地址吗?(是→嵌入;不是→分集合)
内容的提问来源于stack exchange,提问作者Paulo
相关产品推荐
相关产品推荐

