【问题标题】:Model relations either by object using ID as key or by array of objects通过使用 ID 作为键的对象或对象数组来建模关系
【发布时间】:2017-03-23 04:00:32
【问题描述】:

下面的示例显示了两种可能的文档结构,可用于 MongoDB 3.4 上的联系人集合中的联系人。注意联系人和他所属的活动之间的关系。

方法 A:campaigns 是一个对象,它将活动保存为 key:value 对,其中 key 是活动 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:campaigns 是一个数组,它只是将活动作为对象保存。

{
  "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:为了分析的目的,请假设关系必须放在联系文档中。我建议你不要浪费时间回复其他设计方案。

在此致谢

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

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

    您可以在campaign_id 上创建索引并使用它来获得更好的查询性能。您还可以使用 user_id 和campaign_id(复合)创建一个多键索引作为您问题的答案。多键索引的一个缺点是多键索引比其他索引需要更多的存储空间。但它为您提供了高性能的数组查询。

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

    【讨论】:

    • 谢谢@Hasan,我投了你的票,但我想等待其他可能的答案,然后再接受你的正确答案。
    猜你喜欢
    • 1970-01-01
    • 2020-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多