我无法理解Range主键在这里 -
它是如何运作的?
"哈希属性上的无序哈希索引和范围属性的排序范围索引"是什么意思?
答案 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)
整个事情都在混乱。首先,构建基块是:
将Item视为一行,将KV Attribute视为该行中的单元格。
仅当您确定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
主键由一个哈希键和一个可选的范围键组成。 哈希键用于选择DynamoDB分区。分区是 表数据的一部分。范围键用于对项目中的项目进行排序 分区(如果存在)。
因此两者都有不同的目的,并且一起有助于执行复杂的查询。
在上面的示例hashkey1 can have multiple n-range.
中,范围和哈希键的另一个示例是游戏,用户A (hashkey)
可以玩Ngame (range)
表,项目和属性中描述的音乐表是 具有复合主键的表格示例(Artist和 歌名)。您可以直接访问“音乐”表中的任何项目,如果 您可以提供该项目的Artist和SongTitle值。
复合主键在查询时为您提供了更多的灵活性 数据。例如,如果您仅提供Artist,DynamoDB的值 检索该艺术家的所有歌曲。只检索一个子集 特定歌手的歌曲,您可以为歌手提供价值 以及SongTitle的一系列值。
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键查询,就可以检索与分区键关联的所有排序键。无需扫描。这里的要点是分区键在查询中是必需的。排序键仅用于获取数据范围