Dav*_*nes 9 database amazon-dynamodb
比方说,我有一个用户表id和timestamp属性.我希望能够查询这两个参数.如果我正确理解文档,有两种方法可以使用DynamoDB:
id作为哈希和timestamp作为范围.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)
如果这不是你想要的,那么散列+范围id和timestamp分别不是你想要的.
使用id定义仅哈希主键,并使用时间戳定义全局二级索引.
使用仅哈希主键id,表示该id属性应该是唯一的.然后通过GSI仅应用哈希timestamp,您将能够查询ids与特定内容相关的列表timestamp.
这种方法的好处是,它绝对是您的用例的正确解决方案.#1是误用范围密钥(除非您打算确保在应用程序级别id不重复,这可能是一个坏主意).
该缺点使用GSI是:
GSI每个表最多只能有5 个,因此明智地选择需要索引的内容,因为GSI只能在创建表时指定,并且不能更改.GSI 由于您需要为其分配预配通量,因此将花费您额外的费用.GSI最终是一致的,这意味着DynamoDB不保证与表的散列键关联的时刻数据写入DB,数据的GSI散列键立即可用于查询.该文档指出这通常是立即的,但可能需要几秒钟才能使GSI哈希键变为可用.