什么是哈希和范围主键?

问题描述 投票:173回答:3

我无法理解Range主键在这里 -

http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithTables.html#WorkingWithTables.primary.key

它是如何工作的?

“散列属性上的无序散列索引和范围属性上的排序范围索引”是什么意思?

hash amazon-dynamodb primary-key database nosql
3个回答
478
投票

“散列和范围主键”表示DynamoDB中的单行具有由散列和范围键组成的唯一主键。例如,使用X的散列键和Y的范围键,您的主键实际上是XY。您也可以为同一个哈希键使用多个范围键,但组合必须是唯一的,如XZ和XA。让我们为每种类型的表使用他们的例子:

散列主键 - 主键由一个属性(散列属性)组成。例如,ProductCatalog表可以将ProductID作为其主键。 DynamoDB在此主键属性上构建无序哈希索引。

这意味着每一行都键入此值。 DynamoDB中的每一行都具有此属性所需的唯一值。无序哈希索引意味着所说的内容 - 数据未被排序,并且您无法保证数据的存储方式。您将无法对无序索引进行查询,例如将产品ID大于X的所有行获取。您可以根据哈希键编写和获取项目。例如,从该表中获取具有ProductID X的行。您正在对无序索引进行查询,因此您对它的反对基本上是键值查找,非常快,并且使用非常少的吞吐量。


散列和范围主键 - 主键由两个属性组成。第一个属性是哈希属性,第二个属性是范围属性。例如,论坛的Thread表可以将ForumName和Subject作为其主键,其中ForumName是hash属性,Subject是range属性。 DynamoDB在哈希属性上构建无序哈希索引,在范围属性上构建有序范围索引。

这意味着每行的主键是散列和范围键的组合。如果同时具有散列和范围键,则可以直接获取单行,或者可以对排序的范围索引进行查询。例如,从表中获取具有范围键大于Y的哈希键X的所有行,或者对该影响的其他查询。与针对未编制索引的字段的扫描和查询相比,它们具有更好的性能和更少的容量使用。来自their documentation

查询结果始终按范围键排序。如果范围键的数据类型是Number,则以数字顺序返回结果;否则,结果按ASCII字符代码值的顺序返回。默认情况下,排序顺序为升序。要反转顺序,请将ScanIndexForward参数设置为false

我可能错过了一些东西,因为我输入了这个,我只是划伤了表面。还有更多的aspects to take into consideration when working with DynamoDB tables(吞吐量,一致性,容量,其他指数,密钥分配等)。您应该查看sample tables and data页面以获取示例。


9
投票

因为整个事情正在混淆。首先,构建块是:

  1. 项目
  2. KV属性。

将Item视为一行,将KV Attribute视为该行中的单元格。

  1. 您可以通过主键获取项目(一行)。
  2. 您可以通过指定(哈希键,范围键查询)来获取多个项目(多行)

只有在您确定PK由(HashKey,SortKey)组成时,才能执行(2)。

我看到它的方式在视觉上更复杂:

+----------------------------------------------------------------------------------+
|Table                                                                             |
|+------------------------------------------------------------------------------+  |
||Item                                                                          |  |
||+-----------+ +-----------+ +-----------+ +-----------+                       |  |
|||primaryKey | |kv attr    | |kv attr ...| |kv attr ...|                       |  |
||+-----------+ +-----------+ +-----------+ +-----------+                       |  |
|+------------------------------------------------------------------------------+  |
|+------------------------------------------------------------------------------+  |
||Item                                                                          |  |
||+-----------+ +-----------+ +-----------+ +-----------+ +-----------+         |  |
|||primaryKey | |kv attr    | |kv attr ...| |kv attr ...| |kv attr ...|         |  |
||+-----------+ +-----------+ +-----------+ +-----------+ +-----------+         |  |
|+------------------------------------------------------------------------------+  |
|                                                                                  |
+----------------------------------------------------------------------------------+

+----------------------------------------------------------------------------------+
|1. Always get item by PrimaryKey                                                  |
|2. PK is (Hash,RangeKey), great get MULTIPLE Items by Hash, filter/sort by range     |
|3. PK is HashKey: just get a SINGLE ITEM by hashKey                               |
|                                                      +--------------------------+|
|                                 +---------------+    |getByPK => getBy(1        ||
|                 +-----------+ +>|(HashKey,Range)|--->|hashKey, > < or startWith ||
|              +->|Composite  |-+ +---------------+    |of rangeKeys)             ||
|              |  +-----------+                        +--------------------------+|
|+-----------+ |                                                                   |
||PrimaryKey |-+                                                                   |
|+-----------+ |                                       +--------------------------+|
|              |  +-----------+   +---------------+    |getByPK => get by specific||
|              +->|HashType   |-->|get one item   |--->|hashKey                   ||
|                 +-----------+   +---------------+    |                          ||
|                                                      +--------------------------+|
+----------------------------------------------------------------------------------+

那么上面发生了什么。请注意以下观察结果。正如我们所说,我们的数据属于(Table,Item,KVAttribute)。然后每个项目都有一个主键。现在,您构建主键的方式对于如何访问数据非常有意义。

如果您确定您的PrimaryKey只是一个哈希键,那么您可以从中获得单个项目。如果您确定主键是hashKey + SortKey,那么您还可以对主键执行范围查询,因为您将通过(HashKey + SomeRangeFunction(在范围键上)获取项目)。因此,您可以使用主键查询获取多个项目。

注意:我没有引用二级索引。


0
投票

@vnr只需使用partion键查询,就可以检索与分区键关联的所有排序键。无需扫描。这里的要点是分区键在查询中是必需的。排序键仅用于获取数据范围

© www.soinside.com 2019 - 2024. All rights reserved.