DynamoDB:范围与全局二级索引

Dav*_*nes 9 database amazon-dynamodb

比方说,我有一个用户表idtimestamp属性.我希望能够查询这两个参数.如果我正确理解文档,有两种方法可以使用DynamoDB:

  1. 定义的散列+使用范围的主键id作为哈希和timestamp作为范围.
  2. 使用定义仅哈希主键id并使用定义全局二级索引timestamp.

每种方法有哪些优点和缺点?

Oh *_*oon 11

使用id作为散列并使用时间戳作为范围来定义散列+范围主键.

当您有效地创建id哈希键和timestamp范围键时,您允许它们两者形成"复合主键".

换句话说,您的DynamoDB架构将允许以下数据(注意'john'重复三次?)

id      | timestamp
--------|-------------------------
john    | 2014-04-28T07:53:29.000Z
john    | 2014-04-28T08:53:29.000Z
john    | 2014-04-28T09:53:29.000Z
mary    | 2014-04-28T07:53:29.000Z
jane    | 2014-04-28T07:53:29.000Z
Run Code Online (Sandbox Code Playgroud)

如果这不是你想要的,那么散列+范围idtimestamp分别不是你想要的.

使用id定义仅哈希主键,并使用时间戳定义全局二级索引.

使用仅哈希主键id,表示该id属性应该是唯一的.然后通过GSI仅应用哈希timestamp,您将能够查询ids与特定内容相关的列表timestamp.

这种方法的好处是,它绝对是您的用例的正确解决方案.#1是误用范围密钥(除非您打算确保在应用程序级别id不重复,这可能是一个坏主意).

缺点使用GSI是:

  1. GSI每个表最多只能有5 个,因此明智地选择需要索引的内容,因为GSI只能在创建表时指定,并且不能更改.
  2. GSI 由于您需要为其分配预配通量,因此将花费您额外的费用.
  3. GSI最终是一致的,这意味着DynamoDB不保证与表的散列键关联的时刻数据写入DB,数据的GSI散列键立即可用于查询.该文档指出这通常是立即的,但可能需要几秒钟才能使GSI哈希键变为可用.


rpm*_*rtz 5

这个答案可能有些用处,但你可以通过两种方式来完成它.

假设您使用id哈希键作为哈希键,那么为了仅使用时间戳检索项目,您将需要一个全局二级索引.您仍然可以创建timestamp范围键,这将有用,因为DynamoDB将使用它来对查询结果进行排序id.

使用全局二级索引的主要缺点是您需要在表上提供额外的预配置吞吐量.

  • @batmaci - 是的,每当你想在DynamoDB中执行查询时,你都需要指定哈希键,无论是表的主哈希键还是索引的哈希键.将DynamoDB视为哈希表 - 如果您没有密钥,那么您必须扫描整个表. (3认同)