DynamoDB中的可选二级索引

时间:2013-09-10 09:17:23

标签: amazon-web-services amazon-dynamodb secondary-indexes

我正在将我的持久层从Riak迁移到DynamoDB。我的数据模型包含一个可选的业务标识符字段,希望能够将其作为密钥的替代方法进行查询。

似乎DynamoDB二级索引不能是null并且需要一个范围密钥,所以尽管名称与Riak的二级索引相似,但这看起来却是一个非常不同的野兽。

是否有一种优雅的方式来有效地查询我的可选字段,而不是将数据丢入外部搜索索引?

2 个答案:

答案 0 :(得分:15)

当您提出此问题时,DynamoDB没有全局二级索引:http://aws.amazon.com/about-aws/whats-new/2013/12/12/announcing-amazon-dynamodb-global-secondary-indexes/

现在,确实如此。

最好考虑本地二级索引,并将其作为辅助范围键。 @andreimarinescu是对的:您仍然必须按项目的哈希键查询,只有二级索引可以使用该范围键上的DynamoDB查询的比较运算符的有限子集(例如,大于,等于,所以,你仍然需要知道你正在进行比较的“哈希桶”。

全球二级指数是一个不同的野兽。它们更像是您桌子的二级版本(亚马逊在预配置吞吐量方面向您收取类似费用)。您可以将表的非主键属性用作全局二级索引中索引的主键属性,并相应地查询它们。

例如,如果您的表格如下:

|**Hash key**: Item ID | **Range Key**: Serial No | **Attribute**: Business ID |
--------------------------------------------------------------------------------
|           1          |        12345             |             1A             |
--------------------------------------------------------------------------------    
|           2          |        45678             |             2B             |
-------------------------------------------------------------------------------- 
|           3          |        34567             |            (empty)         |
--------------------------------------------------------------------------------
|           3          |        12345             |             2B             |
--------------------------------------------------------------------------------

然后,使用Business ID上的本地二级索引,您可以执行以下查询:“查找散列密钥为3且业务ID等于2B”的所有项目,但您无法“查找业务ID等于2B”的所有项目,因为辅助索引需要哈希密钥。

如果要使用业务ID添加全局二级索引,则可以执行此类查询。您基本上将为表提供备用主键。您可以执行“查找商家ID等于2B的所有商品”的查询,并将商品2-456783-12345作为回复。

稀疏索引适用于DynamoDB;完全允许的是,并非所有项目都具有业务ID,并且可以允许您将索引上的预配置吞吐量保持在低于表格的位置,具体取决于您预计拥有业务ID的项目数量。

答案 1 :(得分:0)

同样也可以使用 LSI。 只要确保您不向该属性写入任何数据即可。

在我的场景中,对于 LSI,我写的是空字符串 (""),这是不允许的。我跳过了排序键的初始化,它工作正常。

基本上 DynamoDB 甚至不会为该行创建该属性。

行为细节解释如下

How can I make a sparse index if the key is always required?