c# - 使用 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 消耗是相同的。
解决方案
推荐阅读
- python - 使用 pymssql 和 python 字典更新数据库表时出错
- javascript - 使用 PHP 变量并使用 javascript 将数据传递给 window.open
- sql - 用于添加数量并仅显示最新条目的 SQL 代码
- c# - 使用 RSA 公钥加密文本文件
- python-3.x - 如何在 Pandas 中更改数据框的索引
- java - Selinux 在针对 Android 10 时尝试打开相机设备时拒绝
- python-3.x - 如何通过自定义字典重新索引数据框?
- c# - .NET 核心 ASP 控制器中的线程
- javascript - 如何通过将键作为函数参数传递来更改对象的值?
- python-3.x - 使用嵌套键和数组展平字典