2017-03-23 28 views
0

下面的示例显示了两个可能的文档结构,用于MongoDB 3.4上的联系人集合中的联系人。请注意联系人与他所属的广告系列之间的关系。通过使用ID作为关键字的对象或对象阵列的对象的模型关系

方法答:活动是保持活动作为键的对象:值对,其中是系列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

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

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

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

+0

谢谢@哈桑,我投了你,但我想等待其他可能的答案,然后接受你的答案作为正确的答案。 – Delmo