什么是哈希和范围主键?

时间:2014-12-06 07:35:57

标签: hash amazon-dynamodb primary-key database nosql

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

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

它是如何运作的?

"哈希属性上的无序哈希索引和范围属性的排序范围索引"是什么意思?

4 个答案:

答案 0 :(得分:472)

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

  

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

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


  

哈希和范围主键 - 主键由两个组成   属性。第一个属性是哈希属性,第二个属性   attribute是范围属性。例如,论坛的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页面中的示例。

答案 1 :(得分:9)

整个事情都在混乱。首先,构建基块是:

  1. 项目
  2. KV属性。

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

  1. 您可以通过主键获取一项(一行)。
  2. 您可以通过指定(HashKey,RangeKeyQuery)来获取多个项目(多行)

仅当您确定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                   ||
|                 +-----------+   +---------------+    |                          ||
|                                                      +--------------------------+|
+----------------------------------------------------------------------------------+

那么上面发生了什么。请注意以下几点。正如我们所说的,数据属于(表,项目,KVAttribute)。然后,每个项目都有一个主键。现在,构成主键的方式对于访问数据非常有意义。

如果您确定PrimaryKey只是一个哈希键,那太好了,您可以从中获取单个项。但是,如果您确定主键为hashKey + SortKey,则还可以对主键进行范围查询,因为您将通过(HashKey + SomeRangeFunction(on range key))获得项。因此,您可以通过主键查询获得多个项目。

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

答案 2 :(得分:1)

@mkobit已经给出了一个很好的解释答案,但是我将大范围地介绍一下范围键和哈希键。

简单地说range + hash key = composite primary key CoreComponents of Dynamodb enter image description here

  

主键由一个哈希键和一个可选的范围键组成。   哈希键用于选择DynamoDB分区。分区是   表数据的一部分。范围键用于对项目中的项目进行排序   分区(如果存在)。

因此两者都有不同的目的,并且一起有助于执行复杂的查询。 在上面的示例hashkey1 can have multiple n-range.中,范围和哈希键的另一个示例是游戏,用户A (hashkey)可以玩Ngame (range)

enter image description here

  

表,项目和属性中描述的音乐表是   具有复合主键的表格示例(Artist和   歌名)。您可以直接访问“音乐”表中的任何项目,如果   您可以提供该项目的Artist和SongTitle值。

     

复合主键在查询时为您提供了更多的灵活性   数据。例如,如果您仅提供Artist,DynamoDB的值   检索该艺术家的所有歌曲。只检索一个子集   特定歌手的歌曲,您可以为歌手提供价值   以及SongTitle的一系列值。

enter image description here

https://www.slideshare.net/InfoQ/amazon-dynamodb-design-patterns-best-practices https://www.slideshare.net/AmazonWebServices/awsome-day-2016-module-4-databases-amazon-dynamodb-and-amazon-rds https://ceyhunozgun.blogspot.com/2017/04/implementing-object-persistence-with-dynamodb.html

答案 3 :(得分:0)

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