什么是哈希和范围主键?

Man*_*nnu 194 database hash primary-key nosql amazon-dynamodb

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

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

它是如何工作的?

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

mko*_*bit 522

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

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

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


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

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

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

我可能错过了一些东西,因为我输入了这个,我只是划伤了表面.还有很多方面与DynamoDB表格时要考虑到(吞吐量,一致性,容量,其他指数,密钥分发等).您应该查看示例表和数据页面以获取示例.

  • 这是我读过的最有用的堆栈溢出答案之一. (44认同)
  • 请注意:散列键和范围键现在称为分区键和排序键。写得很好,谢谢! (7认同)
  • 为什么没有选项只使用没有哈希的范围?例如,如果我的所有数据都以其时间戳作为主键存储,我希望能够选择"2015年10月15日下午2点到4点之间的所有数据" (6认同)
  • @Teofrostus,哈希键用于标识包含项目的分区.没有它,DynamoDB就不会查看哪个分区.不知道在哪里查看会使查询失败,并且是扫描(或全局二级索引)的用例,但这不适合您只使用时间的用例系列选择数据). (3认同)

Adi*_*iii 22

@mkobit 已经给出了一个很好解释的答案,但我将添加范围键和哈希键的大图。

在简单的话range + hash key = composite primary key Dynamodb的CoreComponents 在此处输入图片说明

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

所以两者都有不同的目的,共同帮助进行复杂的查询。上面例子hashkey1 can have multiple n-range.中range和hashkey的另一个例子是game,userA(hashkey)可以玩Ngame(range)

在此处输入图片说明

Tables、Items 和 Attributes 中描述的 Music 表是具有复合主键(Artist 和 SongTitle)的表的示例。如果您提供该项目的 Artist 和 SongTitle 值,您可以直接访问 Music 表中的任何项目。

在查询数据时,复合主键为您提供了额外的灵活性。例如,如果您只提供 Artist 的值,DynamoDB 将检索该艺术家的所有歌曲。要仅检索特定艺术家的歌曲子集,您可以提供 Artist 的值以及 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


Tom*_*vid 13

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

  1. 项目
  2. KV属性.

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

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

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

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

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

// and in thids case
getRow(somePartitionKey): Row
Run Code Online (Sandbox Code Playgroud)

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

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

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