我正在将我的持久层从 Riak 迁移到 DynamoDB。我的数据模型包含一个可选的业务标识符字段,希望能够作为键的替代项进行查询。
似乎 DynamoDB 二级索引不能null
并且需要范围键,因此尽管名称与 Riak 的二级索引相似,但它看起来是完全不同的野兽。
有没有一种优雅的方法可以有效地查询我的可选字段,而不是将数据放入外部搜索索引中?
我正在将我的持久层从 Riak 迁移到 DynamoDB。我的数据模型包含一个可选的业务标识符字段,希望能够作为键的替代项进行查询。
似乎 DynamoDB 二级索引不能null
并且需要范围键,因此尽管名称与 Riak 的二级索引相似,但它看起来是完全不同的野兽。
有没有一种优雅的方法可以有效地查询我的可选字段,而不是将数据放入外部搜索索引中?
当您问这个问题时,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。
使用 LSI 也可以做到这一点。只要确保您没有向该属性写入任何数据即可。
在我的场景中,对于 LSI,我正在编写空字符串 (""),这是不允许的。我跳过了排序键的初始化,它工作正常。
基本上 DynamoDB 甚至不会为该行创建该属性。
行为细节解释如下