使用ID作为键或对象数组的对象建模关系

时间:2017-03-23 04:00:32

标签: mongodb mongodb-query

下面的示例显示了两个可能的文档结构,用于MongoDB 3.4上联系人集合中的联系人。请注意联系人与其所属广告系列之间的关系。

方法A:广告系列是一个对象,它将广告系列保存为键:值对,其中是广告系列ID和价值其他广告系列数据。

{
  "first_name": "John", 
  "last_name": "Doe", 
  "user_id": 1170,
  "campaigns": {
    3452: {
      subscription_dt: ISODate("2017-01-28T19:00:00Z"),
      score: 19
    },
    243: {
      subscription_dt: ISODate("2017-01-15T16:45:00Z"),
      score: 27
    }
  }
}

方法B:广告系列是一个只将广告系列作为对象保存的数组。

{
  "first_name": "John", 
  "last_name": "Doe", 
  "user_id": 1170,
  "campaigns": [
    {
      campaign_id: 3452,
      subscription_dt: ISODate("2017-01-28T19:00:00Z"),
      score: 19
    },
    {
      campaign_id: 243,
      subscription_dt: ISODate("2017-01-15T16:45:00Z"),
      score: 27
    }
  ]
}

请想象一下集合上的任何类型的查询:

  • 哪种查询最好?
  • 是否有任何特定查询使用某些解决方案更难写?甚至不可能写?
  • 哪种方法可以获得更好的性能? (我的意思是,例如,创建复合索引user_id,campaign_id)

PD:为了分析的目的,请假设关系必须放在联系文件中。我建议你不要浪费时间回复其他设计方案。

先谢谢

1 个答案:

答案 0 :(得分:1)

我会选择方法B,这是常用的。这是查询在广告系列数组中获取数据的好方法。

您可以在campaign_id上创建索引并使用它来获得更好的查询效果。此外,您还可以使用user_id和campaign_id(复合)创建一个多键索引作为问题的答案。多键索引的缺点是多键索引需要比其他索引更多的存储。但它可以让您从具有高性能的数组中进行查询。

在方法A中,要使用campaign_id查询数据,您必须为每个campaign_id创建索引,这是无意义的(我不确定是否有人使用该方法,但我不会这样做)。新的campaign_id将强制您使用新的campaign_id创建新索引,以便在查询中获得更好的效果。对于方法A,可能会给出更好的答案,但我在MongoDB上的经验告诉我选择方法B来解决这个问题。