首页 > 解决方案 > 使用 cosmos db 在社交媒体应用程序中删除关于删除帖子的评论的正确方法

问题描述

我有一个使用 cosmos DB (SQL API) [.net 客户端,使用 cosmos-client sdk] 的社交媒体应用程序。我遵循了类似于此处描述的设计模式:https ://docs.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: ...
            ...
        }
    ]
}

这样做可以很容易地让我在删除帖子时删除整个评论对象,因为当帖子被删除时,它现在变成了单个删除操作。但是这样做打破了将评论和帖子分解为不同容器的基本思想,每个容器都分解为自己的单独对象,并且没有父对象,因为对这个父集合中特定对象的操作成本更高。

我的意思是,据我了解,对于上述结构,如果我必须更新喜欢的数量,或者只是删除一条单独的评论,那么成本要大得多,我希望后一个用例远远超过帖子被删除。

我是否以错误的方式处理这种情况?宇宙中有什么技巧可以让我更有效地做到这一点吗?

PS 我的应用程序目前有一些用户,因此任何更改还需要我能够有效地将数据迁移到新结构(如果需要)。

PPS 我已经看到如何使用存储过程删除数据,但考虑到存储过程在内部会一一删除,我假设 RU 消耗是相同的。

标签: c#azureazure-cosmosdb

解决方案


推荐阅读