我们正在开发一个基于blazor和Cosmos DB服务器的人事管理系统。每个数据库将有一个客户,大约30“docTypes”。按数量和数据量计算,最大的类别是“用户”和“雇员”。当我们查询时,我们会同时得到用户和员工的所有数据。所以可以是几千。其他文档类型要小得多,查询频率较低。
每个客户的数据量将不超过5 GByte。最常见的查询是对3 docTypes的查询。
使用customerId (所以所有数据都在一个分区中)还是使用docType作为分区键更有意义吗?
谢谢
发布于 2021-12-30 15:13:18
根据您提供的信息,它听起来像是一个很好的属性,可以用作分区键,因为它可以用来避免跨分区查询。特别是由于您声明了这将经常用于您的查询。随着您说的最大大小,它也不会引起您的问题,因为一个分区可以包含多达20 it的数据。
需要注意的一件事是热分区。您可以声明您的users分区可能比其他分区大得多。这可能导致一个分区执行所有提升,而其他分区则主要处于空闲状态,这会导致您的总吞吐量无效。
另一方面,这对您的用例并不重要。由于没有一个数据库将超过5GB,所以您将始终停留在单个分区中,但最好事先考虑一下,因为情况可能会发生变化,您最终会得到一个分割成分区的数据库。
最后,我永远不会对所有数据使用一个分区。它没有好处。如果您没有可以用作分区键的属性,那么id是更好的选择(因此每个文档都有一个逻辑分区)。它不会受到存储限制,并且在分区之间平均分配吞吐量。
发布于 2022-01-01 15:34:53
我强烈建议您先看一下由Cosmos DB程序经理Thomas编写的这个数据建模和分区表示的片段。在我看来,这是理解如何考虑分区的最好资源之一。
请务必同意的观点,即您没有提供足够的数据。例如,我们知道每个数据库有30个doc类型--给定的cosmosdb数据库使用容器,我实际上希望每个docType都有自己的容器--与您所写的相反:
使用customerId (所以所有数据都在一个分区中)还是使用docType作为分区键更有意义吗?
这意味着您希望对所有数据使用单个容器。我不会将用户和员工作为文档保存在同一个容器中。它们是独立的域,应该有自己的容器。请参阅分区策略上的Azure docs页面和关于访问模式的后续段落。建议如下:
选择一个分区键,使访问模式能够均匀地分布在逻辑分区之间。
在访问模式一节中,所提到的良好做法是将数据分为热数据、中数据和冷数据,并将其放入自己的容器中。一个警告是,根据这个页面,每个具有共享吞吐量的数据库的最大容器数是25个。
如果这是不可能的,并且所有数据都必须放在一个容器中,那么docType似乎是正确的分区键,因为如果我正确理解的话,您的查询将由docType获得数据。
正如404所写的,您希望避免热分区,即将容器中的大多数文档阻塞到单个或几个逻辑分区中。因此,您希望根据最频繁的操作选择分区键。
https://stackoverflow.com/questions/70532412
复制相似问题