转发行为和分区

时间:2017-03-10 16:44:18

标签: azure-cosmosdb nosql

我正在实施时间表行为,用户可以跨时间线转发内容,其关注者类似于推特上的转推。

当用户发布内容时,我会收到所有关注者并为每个关注者创建一个时间轴对象。 Timeline对象将partitionkey设置为FollowerId。因此,当用户想要查看他的关注时间轴时,我只需通过他的userId获取时间轴对象。

问题在于重新转发/转发内容是否在关注者列表之外重复。所以当我需要更新时间轴对象时,例如(喜欢的数量,或内容本身)。我需要获取具有相同ContentId的所有Timeline对象,但由于它是由FollowerId分区的,因此我无法查询它,因为它是交叉分区的。

我正在使用存储过程btw来处理时间轴对象更新。

由于转发(转发)的数量确实可以快速增长,因此推荐的处理方法是什么?

是否可以为同一个对象提供两个独立的分区键?

1 个答案:

答案 0 :(得分:2)

不,DocumentDB中的同一对象不可能有两个独立的分区键。为此,您必须使用两个不同的分区键将相同的数据存储两次。

社交网络遵循的模式类似于电子邮件邮箱。数据被冗余地复制到每个用户的邮箱/分区密钥(有效期很短)。因此,当有人发推文时,您异步(使用DocumentDB的更改源或其他队列/代理)将其写入跟随用户的任何人,以便它出现在他们的流中。每个用户使用他们的分区键独立地只读取他们的重复副本。

一个常见的特殊情况是“名人” - 大多数系统都有特殊处理,因为你不想为拥有大量粉丝的人重复数据1M次。因此,您使用两种方法的组合 - 默认情况下重复数据,并为顶级用户单独检索推文。