我无法理解Range主键在这里 -
它是如何工作的?
“散列属性上的无序散列索引和范围属性上的排序范围索引”是什么意思?
“散列和范围主键”表示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页面以获取示例。
因为整个事情正在混淆。首先,构建块是:
将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 ||
| +-----------+ +---------------+ | ||
| +--------------------------+|
+----------------------------------------------------------------------------------+
那么上面发生了什么。请注意以下观察结果。正如我们所说,我们的数据属于(Table,Item,KVAttribute)。然后每个项目都有一个主键。现在,您构建主键的方式对于如何访问数据非常有意义。
如果您确定您的PrimaryKey只是一个哈希键,那么您可以从中获得单个项目。如果您确定主键是hashKey + SortKey,那么您还可以对主键执行范围查询,因为您将通过(HashKey + SomeRangeFunction(在范围键上)获取项目)。因此,您可以使用主键查询获取多个项目。
注意:我没有引用二级索引。
@vnr只需使用partion键查询,就可以检索与分区键关联的所有排序键。无需扫描。这里的要点是分区键在查询中是必需的。排序键仅用于获取数据范围