13

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

似乎 DynamoDB 二级索引不能null并且需要范围键,因此尽管名称与 Riak 的二级索引相似,但它看起来是完全不同的野兽。

有没有一种优雅的方法可以有效地查询我的可选字段,而不是将数据放入外部搜索索引中?

4

2 回答 2

26

当您问这个问题时,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。

于 2014-02-22T17:28:53.597 回答
0

使用 LSI 也可以做到这一点。只要确保您没有向该属性写入任何数据即可。

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

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

行为细节解释如下

如果始终需要密钥,如何创建稀疏索引?

于 2021-06-21T17:35:16.080 回答