我正在将我的持久层从Riak迁移到DynamoDB。我的数据模型包含一个可选的业务标识符字段,希望能够将其作为密钥的替代方法进行查询。
似乎DynamoDB二级索引不能是null
并且需要一个范围密钥,所以尽管名称与Riak的二级索引相似,但这看起来却是一个非常不同的野兽。
是否有一种优雅的方式来有效地查询我的可选字段,而不是将数据丢入外部搜索索引?
答案 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-45678
和3-12345
作为回复。
稀疏索引适用于DynamoDB;完全允许的是,并非所有项目都具有业务ID,并且可以允许您将索引上的预配置吞吐量保持在低于表格的位置,具体取决于您预计拥有业务ID的项目数量。
答案 1 :(得分:0)
同样也可以使用 LSI。 只要确保您不向该属性写入任何数据即可。
在我的场景中,对于 LSI,我写的是空字符串 (""),这是不允许的。我跳过了排序键的初始化,它工作正常。
基本上 DynamoDB 甚至不会为该行创建该属性。
行为细节解释如下
How can I make a sparse index if the key is always required?