Azure CosmosDb 中分区键的使用
Usage of partition key in Azure CosmosDb
直到现在我都使用 Linq to SQL 查询我的 ComosDb 数据库,它运行良好而且我不必传递分区键。但是我现在必须编写一个更复杂的查询来在多个字段上搜索产品,所以我决定写入存储过程,这里我必须传递分区键来执行它。
- 为什么传递分区键在某些方面是强制性的,而在其他方面则不是?
在我的用例中,我有一个包含 products 对象的集合,这些对象都有一个 supplierId 属性分区键,以及 catalogId 属性,其中包含产品可用的所有目录的数组。
在我的 API 中,我需要 catalogId 来搜索产品而不是供应商,因为它是多余的。当然,我可以先使用 catalogId 检索 supplierId,然后将其传递给调用 Cosmosdb 的方法,但我不太喜欢它意味着我的应用程序层应该知道基础设施的工作方式。
- 对于如何管理对分区键的依赖,您有什么建议吗?或者也许我没有根据 cosmosdb 最佳实践以最佳方式对我的数据层进行建模?
如果分区键作为过滤谓词 (where) 发送,Linq 可能能够推断出分区键,这就是您不需要指定它的原因。但是,如果您不传递它,Linq 会很乐意 运行 一个扇出查询,当大规模完成时,它是缓慢且低效的,并且在高请求量时绝对避免。
存储过程的范围限定为分区键,因此需要传递它。
如果您在此处进行查询,我不会使用存储过程,因为它们仅在主副本上执行,因此只能访问所配置吞吐量的 1/4。使用 SDK 的常规查询可以访问 4 个副本中的任何一个,从而更好地利用吞吐量。这对于高并发查询尤其重要,但无论您的目标是什么,都应该提高效率。
因此,如果这确实是一个跨分区查询并且您没有为执行非常频繁的查询传递 supplierId,您可能需要查看您的分区策略并分析您对数据的访问模式以确保您正在设计一个可扩展且高效的数据库。
直到现在我都使用 Linq to SQL 查询我的 ComosDb 数据库,它运行良好而且我不必传递分区键。但是我现在必须编写一个更复杂的查询来在多个字段上搜索产品,所以我决定写入存储过程,这里我必须传递分区键来执行它。
- 为什么传递分区键在某些方面是强制性的,而在其他方面则不是?
在我的用例中,我有一个包含 products 对象的集合,这些对象都有一个 supplierId 属性分区键,以及 catalogId 属性,其中包含产品可用的所有目录的数组。 在我的 API 中,我需要 catalogId 来搜索产品而不是供应商,因为它是多余的。当然,我可以先使用 catalogId 检索 supplierId,然后将其传递给调用 Cosmosdb 的方法,但我不太喜欢它意味着我的应用程序层应该知道基础设施的工作方式。
- 对于如何管理对分区键的依赖,您有什么建议吗?或者也许我没有根据 cosmosdb 最佳实践以最佳方式对我的数据层进行建模?
如果分区键作为过滤谓词 (where) 发送,Linq 可能能够推断出分区键,这就是您不需要指定它的原因。但是,如果您不传递它,Linq 会很乐意 运行 一个扇出查询,当大规模完成时,它是缓慢且低效的,并且在高请求量时绝对避免。
存储过程的范围限定为分区键,因此需要传递它。
如果您在此处进行查询,我不会使用存储过程,因为它们仅在主副本上执行,因此只能访问所配置吞吐量的 1/4。使用 SDK 的常规查询可以访问 4 个副本中的任何一个,从而更好地利用吞吐量。这对于高并发查询尤其重要,但无论您的目标是什么,都应该提高效率。
因此,如果这确实是一个跨分区查询并且您没有为执行非常频繁的查询传递 supplierId,您可能需要查看您的分区策略并分析您对数据的访问模式以确保您正在设计一个可扩展且高效的数据库。