关联数据存储方案

如何处理需要依赖其他表配置的数据,主要取决于数据之间的关系和使用场景

嵌入式文档

适用场景:

  • 配置数据较小且不经常变化
  • 主数据和配置数据总是一起被查询
  • 配置数据没有独立存在的必要
  • 一对少或一对一关系

示例结构:

// products 集合
{
  _id: "prod123",
  name: "智能手机",
  price: 2999,
  // 直接嵌入配置数据
  displayConfig: {
    showPrice: true,
    layout: "grid",
    colorTheme: "dark"
  },
  inventoryConfig: {
    lowStockThreshold: 10,
    reorderPoint: 5
  }
}

优点:

  1. 读取性能高(单次查询获取所有数据)
  2. 数据一致性维护简单
  3. 无需额外查询关联数据

缺点:

  1. 可能导致数据冗余(如果多个文档共享相同配置)
  2. 配置更新时需要更新所有相关文档
  3. 文档可能变得过大

引用关联(各自存储,通过引用关联)

适用场景:

  • 配置数据较大或经常变化
  • 多个主文档共享相同配置
  • 配置数据需要独立查询或管理
  • 一对多或多对多关系

示例结构:

// 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
}

优点:

  1. 避免数据冗余(共享配置只需存储一次)
  2. 配置更新只需修改一处
  3. 更符合关系型设计思维
  4. 更适合大型或复杂配置

缺点:

  1. 需要额外查询获取完整数据
  2. 需要应用层维护引用完整性
  3. 读取性能稍差(需要多次查询)

混合方案

也可以考虑混合使用两种方式:

{
  _id: "prod123",
  name: "智能手机",
  price: 2999,
  // 常用的小型配置直接嵌入
  quickSettings: {
    isFeatured: true,
    priority: 2
  },
  // 大型或不常变化的配置使用引用
  advancedConfigId: "advConf1"
}