MongoDB中物料类与物料的一对多映射方案选型咨询
物料类与物料的一对多映射方案选型问题
需求背景
需实现物料类(Material Class)与物料(Material)的一对多映射,即多个物料类可对应单个物料,示例如下:
| Material Class | Material |
|---|---|
| Washing Machine | Appliances |
| Fridge | Appliances |
| Oven | Appliances |
| Samsung | Mobile |
| Nokia | Mobile |
业务场景细节:
- 约30000个物料类映射到少量物料
- 支持从UI端为物料添加、编辑、删除物料类,操作后同步至数据库
- 已存在
materials集合
现有两种实现方案
方案1:嵌入式文档模式
直接在materials集合的文档中嵌入物料类数组:
materials: [ { _id: 'aaa', name: 'Appliances', classes: ['Washing Machine', 'Fridge', 'Oven'] // 最多可包含10,000条条目 }, { _id: 'bbb', name: 'Mobile', classes: ['Samsung', 'Nokia'] // 最多可包含5,000条条目 } ]
优缺点:
- 优势:物料类的增删改操作便捷,无需跨集合操作
- 劣势:当单个物料对应的物料类数量过多时,数组体积过大,可能影响查询性能与文档存储上限
方案2:子集模式(新增独立集合)
新增material_classes集合存储映射关系:
material_classes: [ { _id: 'ccc', material_id: 'aaa', // 关联物料文档的ObjectId name: 'Washing Machine' }, { _id: 'ddd', material_id: 'aaa', name: 'Fridge' }, { _id: 'eee', material_id: 'aaa', name: 'Oven' }, { _id: 'fff', material_id: 'bbb', name: 'Samsung' }, { _id: 'ggg', material_id: 'bbb', name: 'Nokia' } ]
(注:原示例中存在重复_id与错误映射,已修正)
优缺点:
- 优势:避免单个文档体积过大的问题,数据结构更灵活
- 劣势:需存储30000条独立数据,增删改操作需跨集合处理;删除物料时需批量删除关联的物料类数据,性能开销较大
核心疑问
除上述两种方案外,是否存在更优的实现方案?若没有,应选择哪一种方案?
内容的提问来源于stack exchange,提问作者Amaarockz
相关产品推荐
相关产品推荐

