Azure cosmosdb 时事通讯活动的分区键设计

Azure cosmosdb 时事通讯活动的分区键设计,azure-cosmosdb,Azure Cosmosdb,在阅读了DocumentDB上的所有文档之后,我仍然在为如何最好地设计分区键而苦苦挣扎。让我们把企业电子邮件发送给员工/部门。假设这是一家大型公司,有100万员工,这是虚构的,我只想假设它每周发送数百万封电子邮件,大多数都被阅读和点击,因此吸收了大量数据 让我将一些实体表示为json。出于所有目的和目的,至少在我的案例中,此数据位于sql server中,但我希望按成员和部门跟踪打开、单击的情况。在大型组织中,这种数据可以快速增长是DocumentDB的使用案例。我不想为此争论DocumentD

在阅读了DocumentDB上的所有文档之后,我仍然在为如何最好地设计分区键而苦苦挣扎。让我们把企业电子邮件发送给员工/部门。假设这是一家大型公司,有100万员工,这是虚构的,我只想假设它每周发送数百万封电子邮件,大多数都被阅读和点击,因此吸收了大量数据

让我将一些实体表示为json。出于所有目的和目的,至少在我的案例中,此数据位于sql server中,但我希望按成员和部门跟踪打开、单击的情况。在大型组织中,这种数据可以快速增长是DocumentDB的使用案例。我不想为此争论DocumentDB的优点,只是想更好地理解分区键设计。把它煮开:

资料

  • 时事通讯:
    {newsletterId:1,name:'something',departments:[1,2,3]}//此时事通讯已发送到3个公司部门
  • 员工:
    {employeeId:1212,姓名:'John Smith'}
  • 通讯员工活动:
    {newsletteeid:1,employeeId:1212,link:2,日期:'1-2-2017'}
    和/或
    {newsletteeid:1,employeeId:1212,打开:'1-2-2017'}
    //其中link是电子邮件上链接的id
报告

  • 按部门按时事通讯打开和单击
  • 按部门打开并单击
  • 打开并单击整个新闻稿
  • 按链接按新闻稿单击(假设我们可以将链接id映射到链接)
您将如何获取分区密钥?是否会有与报告相关的不同文档类型?也就是说,一个跟踪员工点击/打开(这将是大量数据),一个按部门增加聚合,一个新闻稿聚合(可能只是对部门进行汇总),等等,或者这个事务执行起来会很昂贵,因为您可能会在阅读电子邮件的同时收到10000个打开


阅读了有关热分区的内容后,上述方法似乎就属于这一类。

对于新闻稿EmployeeActivity,由于您预计新闻稿发布时会出现突发活动,
employeeId
将是有效扩展写流量的一个很好的分区键

由于报告的生成通常会有一点延迟,因此我建议通过在上运行窗口聚合,然后将每小时/分钟的统计数据保存到单独的DocumentDB“stats”集合中,在新闻稿、新闻稿x部门、部门上执行所有聚合


对于存储新闻稿和员工元数据,您可能希望分别使用
newsletteeid
employeeId
。如果愿意,可以通过创建合成分区键将这些文档存储在同一个集合中,然后根据类型存储适当的值。

您是计划让DocumentDB执行聚合,还是计划将聚合或报告以最终形式存储在DocumentDB中?实际上,我猜每个进行聚合的x周期都需要运行一个流程。我想将它们存储在documentdb中作为示例。我想补充一点,如果您想与documentdb工程师更详细地讨论分区键的选择/设计,请发送电子邮件askdocdb@microsoft.com.Thank我会的。