通讯活动的分区键设计

Partition Key design for Newsletter Campaign

在阅读了所有我能在 document db 上找到的文档后,我仍在为如何最好地设计分区键而苦恼。让我们以发送到 employees/departments 的公司电子邮件为例。假设这是一家大型公司,拥有 100 万名员工,这是虚构的,我只是想假设每周发送几百万封电子邮件,大多数都会被阅读和点击,因此会吸收大量数据。

让我将一些实体表示为 json。出于所有意图和目的,至少就我而言,此数据位于 sql 服务器中,但我想按成员和部门跟踪打开、点击。对于大型组织,此数据可以快速增长是 DocumentDB 的用例。我不想为此争论 DocumentDB 的优点,只是想更好地理解分区键设计。煮沸:

数据

报告

您将如何设计分区键?会有与报告相关的不同文档类型吗?即,跟踪员工 clicks/opens 的数据(这将是大量数据),按部门递增聚合的数据,时事通讯的聚合数据(可能只是对部门求和)等,或者此交易是否会变得昂贵实施,因为您可能会在阅读电子邮件的同时打开 10000 次?

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

对于 NewsletterEmployeeActivity,由于您预计在发布时事通讯时会有 activity 的爆发,因此 employeeId 将是有效扩展写入流量的良好分区键。

由于报告的构建通常会稍有延迟,我建议通过 运行 在 change feed 上进行窗口聚合,对时事通讯、时事通讯 x 部门、部门执行所有聚合,然后保存每个 hour/minute 的统计信息放入单独的 DocumentDB "stats" 集合中。

要存储新闻稿和员工元数据,您可能需要分别使用 newsletterIdemployeeId。如果您愿意,可以将这些文档存储在同一个集合中,方法是创建一个合成分区键,然后根据类型存储适当的值。