MongoDB 文档设计
关联数据存储方案
如何处理需要依赖其他表配置的数据,主要取决于数据之间的关系和使用场景
嵌入式文档
适用场景:
- 配置数据较小且不经常变化
- 主数据和配置数据总是一起被查询
- 配置数据没有独立存在的必要
- 一对少或一对一关系
示例结构:
// products 集合
{
_id: "prod123",
name: "智能手机",
price: 2999,
// 直接嵌入配置数据
displayConfig: {
showPrice: true,
layout: "grid",
colorTheme: "dark"
},
inventoryConfig: {
lowStockThreshold: 10,
reorderPoint: 5
}
}
优点:
- 读取性能高(单次查询获取所有数据)
- 数据一致性维护简单
- 无需额外查询关联数据
缺点:
- 可能导致数据冗余(如果多个文档共享相同配置)
- 配置更新时需要更新所有相关文档
- 文档可能变得过大
引用关联(各自存储,通过引用关联)
适用场景:
- 配置数据较大或经常变化
- 多个主文档共享相同配置
- 配置数据需要独立查询或管理
- 一对多或多对多关系
示例结构:
// products 集合
{
_id: "prod123",
name: "智能手机",
price: 2999,
// 引用配置ID
displayConfigId: "dispConf1",
inventoryConfigId: "invConf2"
}
// display_configs 集合
{
_id: "dispConf1",
showPrice: true,
layout: "grid",
colorTheme: "dark"
}
// inventory_configs 集合
{
_id: "invConf2",
lowStockThreshold: 10,
reorderPoint: 5
}
优点:
- 避免数据冗余(共享配置只需存储一次)
- 配置更新只需修改一处
- 更符合关系型设计思维
- 更适合大型或复杂配置
缺点:
- 需要额外查询获取完整数据
- 需要应用层维护引用完整性
- 读取性能稍差(需要多次查询)
混合方案
也可以考虑混合使用两种方式:
{
_id: "prod123",
name: "智能手机",
price: 2999,
// 常用的小型配置直接嵌入
quickSettings: {
isFeatured: true,
priority: 2
},
// 大型或不常变化的配置使用引用
advancedConfigId: "advConf1"
}
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 木素音的小站!