创建合成分区键

适用范围: NoSQL

采用具有大量(例如,几百甚至几千个)非重复性值的分区键是最佳做法。 目标是在与这些分区键值关联的项之间均匀分配数据和工作负荷。 如果数据中不存在此类属性,可以构造一个合成分区键。 本文档介绍为 Azure Cosmos DB 容器生成合成分区键的几种基本方法。

连接某个项的多个属性

将多个属性值连接成单个人工 partitionKey 属性可以构成一个分区键。 这些键称为合成键。 例如,考虑以下示例文档:

{
"deviceId": "abc-123",
"date": 2018
}

对于上面的文档,一种做法是将 /deviceId 或 /date 设为分区键。 若要根据设备 ID 或日期将容器分区,可使用这种做法。 另一种做法是将这两个值连接成用作分区键的合成 partitionKey 属性。

{
"deviceId": "abc-123",
"date": 2018,
"partitionKey": "abc-123-2018"
}

在实际方案中,数据库可能包含数千个项。 请不要手动添加合成键,而应该定义客户端逻辑来连接值,并将合成键插入 Azure Cosmos DB 容器的项中。

使用具有随机后缀的分区键

另一种更均匀地分配工作负荷的可行策略是,在分区键值的末尾追加一个随机数。 以这种方式分配项时,可以跨分区执行并行写入操作。

例如,如果某个分区键表示日期, 则你可以选择介于 1 和 400 之间的随机数,并将其作为后缀连接到该日期。 此方法通过 2018-08-09.400 产生分区键值,如 2018-08-09.12018-08-09.2等。 由于随机化了分区键,每日针对容器执行的写入操作将均匀分散在多个分区之间。 此方法可以提高并行度和总体吞吐量。

使用具有预先计算的后缀的分区键

尽管随机后缀策略能够大幅提高写入吞吐量,但却难以读取特定的项。 你不知道写入该项时使用的后缀值。 若要更轻松地读取单个项,请使用预先计算的后缀策略。 此策略不是使用随机数在分区之间分配项,而是使用根据想要查询的内容计算的某个数字。

沿用前面的示例,其中的某个容器使用日期作为分区键。 现在假设每个项都有一个我们需要访问的 Vehicle-Identification-Number (VIN) 属性。 此外,假设你经常运行查询来按 VIN 和日期查找项。 在应用程序将项写入容器之前,它可以基于 VIN 计算哈希后缀,并将其追加到分区键日期。 这种计算可以生成介于 1 和 400 之间的均匀分布数字。 此结果类似于随机后缀策略方法生成的结果。 分区键值将是与计算结果相连接的日期。

使用此策略可在分区键值之间以及分区之间均匀分散写入。 由于可以计算特定 Vehicle-Identification-Number 的分区键值,因此可以轻松读取特定的项和日期。 此方法的好处是可以避免创建单个热分区键(即,取所有工作负荷值的分区键)。

后续步骤

可通过以下文章详细了解分区的概念: