通讯活动的分区键设计
Partition Key design for Newsletter Campaign
在阅读了所有我能在 document db 上找到的文档后,我仍在为如何最好地设计分区键而苦恼。让我们以发送到 employees/departments 的公司电子邮件为例。假设这是一家大型公司,拥有 100 万名员工,这是虚构的,我只是想假设每周发送几百万封电子邮件,大多数都会被阅读和点击,因此会吸收大量数据。
让我将一些实体表示为 json。出于所有意图和目的,至少就我而言,此数据位于 sql 服务器中,但我想按成员和部门跟踪打开、点击。对于大型组织,此数据可以快速增长是 DocumentDB 的用例。我不想为此争论 DocumentDB 的优点,只是想更好地理解分区键设计。煮沸:
数据
- 时事通讯:
{newsletterId: 1, name: 'something', departments:[1,2,3]} // this newsletter sent to 3 company departments
- 员工:
{employeeId: 1212, name: 'John Smith'}
- NewsletterEmployeeActivity:
{newsletterId: 1, employeeId:1212, link: 2, date: '1-2-2017'}
and/or {newsletterId: 1, employeeId: 1212, open: '1-2-2017'}
// 其中 link 是电子邮件中 link 的 ID
报告
- 按部门的简报打开和点击
- 按部门打开和点击
- 打开并点击整个时事通讯
- 时事通讯的点击次数 Link(假设我们可以将 link id 映射到 link)
您将如何设计分区键?会有与报告相关的不同文档类型吗?即,跟踪员工 clicks/opens 的数据(这将是大量数据),按部门递增聚合的数据,时事通讯的聚合数据(可能只是对部门求和)等,或者此交易是否会变得昂贵实施,因为您可能会在阅读电子邮件的同时打开 10000 次?
阅读了有关热分区的内容后,上述方法似乎属于该类别。
对于 NewsletterEmployeeActivity,由于您预计在发布时事通讯时会有 activity 的爆发,因此 employeeId
将是有效扩展写入流量的良好分区键。
由于报告的构建通常会稍有延迟,我建议通过 运行 在 change feed 上进行窗口聚合,对时事通讯、时事通讯 x 部门、部门执行所有聚合,然后保存每个 hour/minute 的统计信息放入单独的 DocumentDB "stats" 集合中。
要存储新闻稿和员工元数据,您可能需要分别使用 newsletterId
和 employeeId
。如果您愿意,可以将这些文档存储在同一个集合中,方法是创建一个合成分区键,然后根据类型存储适当的值。
在阅读了所有我能在 document db 上找到的文档后,我仍在为如何最好地设计分区键而苦恼。让我们以发送到 employees/departments 的公司电子邮件为例。假设这是一家大型公司,拥有 100 万名员工,这是虚构的,我只是想假设每周发送几百万封电子邮件,大多数都会被阅读和点击,因此会吸收大量数据。
让我将一些实体表示为 json。出于所有意图和目的,至少就我而言,此数据位于 sql 服务器中,但我想按成员和部门跟踪打开、点击。对于大型组织,此数据可以快速增长是 DocumentDB 的用例。我不想为此争论 DocumentDB 的优点,只是想更好地理解分区键设计。煮沸:
数据
- 时事通讯:
{newsletterId: 1, name: 'something', departments:[1,2,3]} // this newsletter sent to 3 company departments
- 员工:
{employeeId: 1212, name: 'John Smith'}
- NewsletterEmployeeActivity:
{newsletterId: 1, employeeId:1212, link: 2, date: '1-2-2017'}
and/or{newsletterId: 1, employeeId: 1212, open: '1-2-2017'}
// 其中 link 是电子邮件中 link 的 ID
报告
- 按部门的简报打开和点击
- 按部门打开和点击
- 打开并点击整个时事通讯
- 时事通讯的点击次数 Link(假设我们可以将 link id 映射到 link)
您将如何设计分区键?会有与报告相关的不同文档类型吗?即,跟踪员工 clicks/opens 的数据(这将是大量数据),按部门递增聚合的数据,时事通讯的聚合数据(可能只是对部门求和)等,或者此交易是否会变得昂贵实施,因为您可能会在阅读电子邮件的同时打开 10000 次?
阅读了有关热分区的内容后,上述方法似乎属于该类别。
对于 NewsletterEmployeeActivity,由于您预计在发布时事通讯时会有 activity 的爆发,因此 employeeId
将是有效扩展写入流量的良好分区键。
由于报告的构建通常会稍有延迟,我建议通过 运行 在 change feed 上进行窗口聚合,对时事通讯、时事通讯 x 部门、部门执行所有聚合,然后保存每个 hour/minute 的统计信息放入单独的 DocumentDB "stats" 集合中。
要存储新闻稿和员工元数据,您可能需要分别使用 newsletterId
和 employeeId
。如果您愿意,可以将这些文档存储在同一个集合中,方法是创建一个合成分区键,然后根据类型存储适当的值。