dynamodb table 中哈希范围的用途是什么?

What is the use of a Hash range in a dynamodb table?

我是 dynamodb (ddb) 的新手。我正在浏览它的文档,它说要添加 Hash Key 和 Hash Range key。在文档中它说 ddb 将在哈希键上创建一个排序索引,在哈希范围上创建一个排序索引。

拥有这 2 把钥匙而不是只有一把钥匙的目的是什么。是不是因为第一个键的使用方式如下: 一个哈希表,其中包含: key - 哈希范围中每个值的键范围

第二个哈希表 哈希范围键 - 实际数据值。

这将有助于隔离数据并加快查找速度。但是为什么只有 2 层 HashMap,我可以对 n 层执行此操作并获得更快的查找。

提前谢谢你。

问:"What is the purpose of having these 2 keys rather than just one key?"

数据模型而言,Hash Key 允许您从您的 table 中唯一标识一条记录,Range Key 可以选择性地用于分组并对通常一起检索的几条记录进行排序。示例:如果您正在定义一个聚合来存储订单项,OrderId 可以是您的 Hash Key,而 OrderItemId 可以是 Range Key。您可以在下面找到使用这两个键的正式定义:

"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 KeyData Model增加了分组能力,然而,这两个key的使用也有一定的隐含意义存储模型

"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(使用时)有助于指示大部分将一起检索的记录,因此,存储也可以针对此类需求进行优化。

问:"But then why only 2 levels of HashMaps? I could do this for n number of layers and get the faster lookups."

拥有多层查找会增加指数级的复杂性,从而有效地 运行 集群环境中的数据库,这是大多数 NOSQL 数据库最重要的用例之一。数据库必须具有高可用性、防故障、有效的可扩展性,并且仍然在分布式环境中运行。

"One of the key design requirements for Dynamo is that it must scale incrementally. This requires a mechanism to dynamically partition the data over the set of nodes (i.e., storage hosts) in the system. Dynamo’s partitioning scheme relies on consistent hashing to distribute the load across multiple storage hosts."[DDB-SOSP2007]

这总是一个折衷,您在 NOSQL 数据库中看到的每一个限制很可能是由存储模型要求引入的。尽管关系数据库在数据建模方面非常灵活,但在分布式环境中 运行 时它们有一些限制。

选择正确的键来表示您的数据是设计过程中最关键的方面之一,它直接影响您的应用程序的性能、规模和成本。


脚注:

  • 数据模型是我们感知和操作数据的模型。它描述了我们如何与数据库中的数据交互 [FOWLER]。换句话说,它是您抽象数据模型的方式、对实体进行分组的方式、您选择作为主键的属性等

  • 存储模型描述了数据库如何在内部存储和操作数据 [FOWLER]。虽然您不能直接控制它,但您肯定可以通过了解数据库内部的工作方式来优化数据的检索或写入方式。