我有一个使用cosmos DB(SQL API)[. net客户端,使用cosmos客户端sdk]的社交媒体应用程序。我遵循的设计模式与下面描述的类似:https://learn.microsoft.com/en-us/azure/cosmos-db/social-media-apps.
所以,我有一个容器保存所有的帖子,另一个容器保存所有的评论。它们都通过id属性进行父化。它们看起来像这样:
Posts Container {
id: ...
userid: ... (partition key)
...
}
Comments Container {
id: ...
postid: ... (partition key)
...
}
我的问题出现在删除帖子的时候。当用户删除帖子时,我可以使用它的id从"posts"容器中删除相应的对象。但是现在要删除与该帖子相关的所有评论,我必须在一个循环中逐个删除它们,据我所知,cosmosSQLAPI不允许你批量删除同一个分区键中的条目,考虑到每次删除需要花费大约6个RU,如果我有一个有500条评论的帖子,我的理解是通过单独删除它们,仅仅删除一个帖子就要花费我们6 * 500 = 3000卢比。这似乎不太可行。我也不希望评论只是坐在那里没有家长。
我想到的一个变通方法是,我可以这样构造注解容器:
Comments Container {
id:
postid:
comments: [
{
commentid: ...
...
}
{
commentid: ...
...
}
]
}
这样做很容易让我在删除帖子时删除整个评论对象,因为现在删除帖子时它变成了一个单独的删除操作。但是这样做打破了将评论和帖子分解到不同容器中的基本思想,每个容器都有自己的单独对象,没有父对象,因为在这个父集合中对特定对象的操作成本更高。
我的意思是,据我所知,在上面的结构中,如果我必须更新喜欢的数量,或者只是删除一个单独的评论,成本要大得多,我预计后一种用例要比被删除的帖子多得多。
我是不是以错误的方式接近这个场景?宇宙中有没有什么技巧可以让我更有效地做到这一点?
P.S.我的应用程序目前有一些用户,所以任何更改都需要我能够有效地将数据迁移到新的结构(如果需要)。
另外,我已经看到了如何使用存储过程删除数据,但是考虑到存储过程在内部一个接一个地删除,我假设RU消耗是相同的。
1条答案
按热度按时间ql3eal8s1#
好的,从
3.25.0
版本开始,你可以使用DeleteAllItemsByPartitionKeyStreamAsync
(预览版)批量删除多个条目。可能需要一些架构上的改变(可能是单个容器)。更多信息点击这里