Hash 什么是散列和范围主键?

Hash 什么是散列和范围主键?,hash,amazon-dynamodb,primary-key,database,nosql,Hash,Amazon Dynamodb,Primary Key,Database,Nosql,我无法理解上的文档中的范围/主键 它是如何工作的 “散列属性上的无序散列索引和范围属性上的排序范围索引”是什么意思?“散列和范围主键”表示DynamoDB中的一行具有唯一的主键,主键由散列和范围主键组成。例如,如果散列键为X,范围键为Y,则主键实际上是XY。同样的散列键也可以有多个范围键,但组合必须是唯一的,如XZ和XA。让我们对每种类型的表使用它们的示例: 散列主键–主键由一个属性(散列)组成 属性例如,ProductCatalog表可以将ProductID设置为 它的主键。DynamoDB在

我无法理解上的文档中的范围/主键

它是如何工作的

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

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

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

这意味着每一行都被设置为该值的关键帧DynamoDB中的每一行都有一个该属性所需的唯一值。无序散列索引意味着所说的内容——数据没有排序,也没有任何关于数据存储方式的保证您将无法对无序索引进行查询,例如获取ProductID大于X的所有行。您可以根据哈希键写入和获取项目。例如,从该表中获取ProductID为X的行。您正在对无序索引进行查询,因此对它的查询基本上是键值查找,速度非常快,使用的吞吐量非常小


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

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

查询结果始终按范围键排序。如果 范围键为数字,结果按数字顺序返回; 否则,结果将按ASCII字符代码的顺序返回 价值观默认情况下,排序顺序为升序。颠倒顺序,, 将ScanIndexForward参数设置为false


我可能在打字时漏掉了一些东西,我只触及了表面。还有很多(吞吐量、一致性、容量、其他指标、密钥分配等)。您应该查看页面中的示例。

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

,因为整个过程都在混乱中,让我们看看它的函数和代码,以一致地模拟它的含义

获取行的唯一方法是通过主键

getRow(主键:PrimaryKey):Row

主键数据结构可以是这样的:

// If you decide your primary key is just the partition key.
class PrimaryKey(partitionKey: String)

// and in thids case
getRow(somePartitionKey): Row
但是,在这种情况下,您可以决定主键是分区键+排序键:

// if you decide your primary key is partition key + sort key
class PrimaryKey(partitionKey: String, sortKey: String)

getRow(partitionKey, sortKey): Row
getMultipleRows(partitionKey): Row[]
因此,底线是:

  • 决定您的主键仅为分区键?按分区键获取单行

  • 决定您的主键是分区键+排序键? 2.1按(分区键、排序键)获取单行或按(分区键)获取行范围

  • 无论哪种方式,您都可以通过主键获得一行唯一的问题是您是否将主键定义为仅分区键或分区键+排序键

    构建模块包括:

  • 桌子
  • 项目
  • KV属性
  • 将项目视为一行,将KV属性视为该行中的单元格

  • 您可以通过主键获取项目(一行)
  • 通过指定(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                   ||
    |                 +-----------+   +---------------+    |                          ||
    |                                                      +--------------------------+|
    +----------------------------------------------------------------------------------+
    
    +----------------------------------------------------------------------------------+
    |桌子|
    |+------------------------------------------------------------------------------+  |
    ||项目||
    ||+-----------+ +-----------+ +-----------+ +-----------+                       |  |
    |||primaryKey | | | | | kv属性| | | | kv属性| ||
    ||+-----------+ +-----------+ +-----------+ +-----------+                       |  |
    |+------------------------------------------------------------------------------+  |
    |+------------------------------------------------------------------------------+  |
    ||项目||
    ||+-----------+ +-----------+ +-----------+ +-----------+ +-----------+         |  |
    |||primaryKey | | | | | | kv属性| | kv属性| | | kv属性||
    ||+-----------+ +-----------+ +-----------+ +-----------+ +-----------+         |  |
    |+------------------------------------------------------------------------------+  |
    |