Cosmos DB 数据建模以优化搜索

Cosmos DB data modelling to optimize search

我看了 this video Cosmos DB 中的数据建模。

视频中解释说,如果您可以对数据进行建模,使最常见的查询位于分区查询中,那么您就可以最大限度地减少 RU,从而最大限度地降低成本并提高性能。

视频中使用的例子是一个博客系统。他们表明,通过四处移动,将博客帖子和评论作为单独的实体存储在同一集合中,所有内容都按 blogId 进行分区,他们可以为常见查询实现低 RU。

然后他们表明,搜索特定用户的所有博客 post 作为跨分区查询,成本非常高。因此,他们随后复制所有博客 post 数据,并将每个博客 post 作为单独的实体添加到用户集合中,该集合已按 userId 分区。用户搜索 posts 现在很便宜。争论是存储比 CPU 时间便宜得多,所以这是一件好事。

我的问题是:当我想让更多的东西可有效搜索时,我是否继续遵循这种模式?例如,我希望能够搜索博客主题(每个博客可能有很多 post)、离散的博客评级等等。

我觉得为每个搜索词扩展这种模式是不可持续的。在这些情况下,我是只能忍受高 RU 搜索还是有一些聪明的方法可以提高效率?

本质上归结为了解使用更改源将数据从一个容器复制到另一个容器的成本是否低于执行跨分区查询的成本。这需要了解您的应用程序的访问模式,还需要衡量这些查询的平均成本与使用更改提要制作另一个副本的成本。 Change feed 在轮询容器时消耗 2 RU/s,然后从源容器中读取每 1Kb 或更少的数据消耗 1 RU,在目标容器中每插入 1Kb 或更少的数据消耗约 8 RU,具体取决于您的索引策略。将其乘以数据插入或更新的速率。然后每天或每月计算这个以比较成本。

如果你要查找的是对数据进行自由文本搜索,则可能需要考虑使用 Azure 搜索。这比使用更改源的方法更简单,但 Azure 搜索也可能非常昂贵。