我有一个使用 cosmos DB (SQL API) [.net 客户端,使用 cosmos-client 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 从“帖子”容器中删除相应的对象。但现在要删除与该帖子相关的所有评论,我必须在循环中单独删除它们,据我所知,即使在同一分区键中,Cosmos SQL API 也不允许您批量删除项目。考虑到每次删除大约需要 6 个 RU,如果我有一篇包含 500 条评论的帖子,我的理解是,通过单独删除它们,仅删除一个帖子就会花费我们 6 * 500 = 3000 RU。这似乎不太可行。我也不希望这些评论只是在没有家长的情况下坐在那里。
我想到的一个解决方法是我可以构建这样的评论容器:
Comments Container {
id:
postid:
comments: [
{
commentid: ...
...
}
{
commentid: ...
...
}
]
}
这样做可以让我在删除帖子时轻松删除整个评论对象,因为现在当帖子被删除时它变成了单个删除操作。但是这样做打破了将评论和帖子分解到不同容器中的基本思想,并且每个容器都分解为自己的单独对象,并且没有父对象,因为对此父对象集中的特定对象进行操作成本更高。
我的意思是,根据我的理解,在上述结构中,如果我必须更新点赞数,或者只是删除一条单独的评论,那么成本要大得多,我预计后一种用例是不仅仅是帖子被删除。
我是否以错误的方式处理这种情况?我可以使用 Cosmos 中的任何技巧来更有效地做到这一点吗?
附注我的应用程序当前有一些用户,因此任何更改也要求我能够有效地将数据迁移到新结构(如果需要)。
P.P.S。我已经了解了如何使用存储过程删除数据,但考虑到存储过程内部会一一删除,我假设 RU 消耗是相同的。
最佳答案
好的,从版本 3.25.0
开始,您可以使用 DeleteAllItemsByPartitionKeyStreamAsync
(预览版)批量删除多个项目。可能需要一些架构更改(可能是单个容器)。
更多信息here
关于c# - 使用 Cosmos db 删除社交媒体应用程序中删除帖子的评论的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63332111/