DynamoDB:什么时候使用什么 PK 类型?
DynamoDB: When to use what PK type?
我正在尝试阅读有关 DynamoDB 的最佳实践。我看到 DynamoDB 有两种 PK 类型:
- 哈希键
- 哈希和范围键
根据我的阅读,后者似乎与前者相似,但支持有限列集的排序和索引。
所以我的问题是为什么只使用散列键而不使用范围键?只有在不搜索table的情况下才是可行的选择吗?
最好能有一些关于何时使用何种类型的键的通用指南。我已经阅读了几份指南(包括亚马逊自己的 DynamoDB 文档),但其中 none 似乎直接解决了这个问题。
谢谢
选择使用哪个密钥取决于特定场景的用例和数据要求。例如,如果您要存储 User Session 数据,使用 Range Key 可能没有多大意义,因为每条记录都可以由 GUID 引用,并且无需分组即可直接访问。一般来说,一旦您知道会话 ID,您就可以通过键查询特定项目。另一个例子可能是存储用户帐户或配置文件数据,每个用户都有自己的数据,您很可能会直接访问它(通过用户 ID 或其他方式)。
但是,如果您正在存储 Order Items,那么 Range Key 更有意义,因为您可能想要检索分组的项目根据他们的订单。
就 数据模型 而言,哈希键 允许您从 table 中唯一标识一条记录, Range Key 可以选择性地用于对通常一起检索的几条记录进行分组和排序。示例:如果您正在定义一个聚合来存储 Order Items,Order Id 可能是您的 Hash Key,以及 OrderItemId Range Key。每当您想从特定的 Order 中搜索 Order Items 时,只需通过哈希键(Order Id)进行查询,您就会得到您所有的订单商品。
您可以在下面找到使用这两个键的正式定义:
"Composite Hash Key with Range Key allows the developer to create a
primary key that is the composite of two attributes, a 'hash
attribute' and a 'range attribute.' When querying against a composite
key, the hash attribute needs to be uniquely matched but a range
operation can be specified for the range attribute: e.g. all orders
from Werner in the past 24 hours, or all games played by an individual
player in the past 24 hours." [VOGELS]
因此Range Key为Data Model增加了分组能力,然而,这两个键的使用也有一定的隐含意义存储模型:
"Dynamo uses consistent hashing to partition its key space across its
replicas and to ensure uniform load distribution. A uniform key
distribution can help us achieve uniform load distribution assuming
the access distribution of keys is not highly skewed."
[DDB-SOSP2007]
Hash Key不仅可以唯一标识记录,而且是保证负载分配的机制。 Range Key(使用时)有助于指示大部分将一起检索的记录,因此,存储也可以针对此类需求进行优化。
选择正确的键来表示您的数据是设计过程中最关键的方面之一,它直接影响您的应用程序的性能、规模和成本。
脚注:
数据模型是我们感知和操作数据的模型。它描述了我们如何与数据库中的数据交互 [FOWLER]。换句话说,它是抽象数据模型的方式、实体分组的方式、选择为主键的属性等
存储模型描述了数据库如何在内部存储和操作数据 [FOWLER]。虽然您不能直接控制它,但您肯定可以通过了解数据库内部的工作方式来优化数据的检索或写入方式。
我正在尝试阅读有关 DynamoDB 的最佳实践。我看到 DynamoDB 有两种 PK 类型:
- 哈希键
- 哈希和范围键
根据我的阅读,后者似乎与前者相似,但支持有限列集的排序和索引。
所以我的问题是为什么只使用散列键而不使用范围键?只有在不搜索table的情况下才是可行的选择吗?
最好能有一些关于何时使用何种类型的键的通用指南。我已经阅读了几份指南(包括亚马逊自己的 DynamoDB 文档),但其中 none 似乎直接解决了这个问题。
谢谢
选择使用哪个密钥取决于特定场景的用例和数据要求。例如,如果您要存储 User Session 数据,使用 Range Key 可能没有多大意义,因为每条记录都可以由 GUID 引用,并且无需分组即可直接访问。一般来说,一旦您知道会话 ID,您就可以通过键查询特定项目。另一个例子可能是存储用户帐户或配置文件数据,每个用户都有自己的数据,您很可能会直接访问它(通过用户 ID 或其他方式)。
但是,如果您正在存储 Order Items,那么 Range Key 更有意义,因为您可能想要检索分组的项目根据他们的订单。
就 数据模型 而言,哈希键 允许您从 table 中唯一标识一条记录, Range Key 可以选择性地用于对通常一起检索的几条记录进行分组和排序。示例:如果您正在定义一个聚合来存储 Order Items,Order Id 可能是您的 Hash Key,以及 OrderItemId Range Key。每当您想从特定的 Order 中搜索 Order Items 时,只需通过哈希键(Order Id)进行查询,您就会得到您所有的订单商品。
您可以在下面找到使用这两个键的正式定义:
"Composite Hash Key with Range Key allows the developer to create a primary key that is the composite of two attributes, a 'hash attribute' and a 'range attribute.' When querying against a composite key, the hash attribute needs to be uniquely matched but a range operation can be specified for the range attribute: e.g. all orders from Werner in the past 24 hours, or all games played by an individual player in the past 24 hours." [VOGELS]
因此Range Key为Data Model增加了分组能力,然而,这两个键的使用也有一定的隐含意义存储模型:
"Dynamo uses consistent hashing to partition its key space across its replicas and to ensure uniform load distribution. A uniform key distribution can help us achieve uniform load distribution assuming the access distribution of keys is not highly skewed." [DDB-SOSP2007]
Hash Key不仅可以唯一标识记录,而且是保证负载分配的机制。 Range Key(使用时)有助于指示大部分将一起检索的记录,因此,存储也可以针对此类需求进行优化。
选择正确的键来表示您的数据是设计过程中最关键的方面之一,它直接影响您的应用程序的性能、规模和成本。
脚注:
数据模型是我们感知和操作数据的模型。它描述了我们如何与数据库中的数据交互 [FOWLER]。换句话说,它是抽象数据模型的方式、实体分组的方式、选择为主键的属性等
存储模型描述了数据库如何在内部存储和操作数据 [FOWLER]。虽然您不能直接控制它,但您肯定可以通过了解数据库内部的工作方式来优化数据的检索或写入方式。