c# - 使用 Cosmos db 删除社交媒体应用程序中删除帖子的评论的正确方法

标签 c# azure azure-cosmosdb

我有一个使用 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/

相关文章:

c# - 需要两个单例实例

c# - 添加另一个下拉按钮到自己的 devexpress PopupContainerEdit 具有相同的样式行为

c# - IDisposable 实现 - 'if (disposing)' 中应该包含什么

c# - 如何同步两个不同数据库表中的不同列名?

azure - 如何在Azure Function中设置Azure DocumentDB输出绑定(bind)的重试次数?

asp.net - 我无法使用 "host.docker.internal:some-port"将我的 ASP .NET 应用程序从 Docker 容器连接到我的计算机主机数据库

c# - Nhibernate 中的 MySqlException

azure - 如何设置 Linux Azure VM 以便可以通过浏览器进行连接?

Azure 数据工厂 V2 探索管道依赖性

azure - 使用资源 token 的 CosmosDb Rest SQL 查询