在不提供散列键的情况下查询DynamoDB(使用散列和范围主键)

时间:2014-11-21 01:53:14

标签: amazon-web-services amazon-dynamodb nosql

在DynamoDB中查询(使用散列和范围主键)时,是否必须提供散列键,或者只需通过提供范围键进行搜索?这是我的用例:我有一个包含以下“schema”的表:Category#Domain(String) - Hash key GroupType#GroupName(String) - Range键一些其他字符串字段,如UpdatedOn,UpdatedBy等。

我必须经常做两件事:1。给定一个Category#Domain,获取所有匹配的项目。 2.给定GroupType#GroupName,获取所有匹配项。

这两个操作都很频繁,所以我不想使用扫描。在DynamoDB中有一种有效的方法吗?有没有更好的方法来设计架构(更多的表,二级索引等)?任何建议都会有所帮助。 有人建议使用全局二级索引但是我的问题是我能将主表的范围键作为我的gsi的哈希键吗?我知道所有的“密钥”都是自动复制的,但这只有在我可以将GroupType#GroupName作为gsi中的散列键以便能够对其进行查询时才有用。另外,有没有什么特殊的方法来处理DynamoDBMapper中的gsi?我需要创建一个新的POJO吗?

1 个答案:

答案 0 :(得分:3)

  

在DynamoDB中有一种有效的方法吗?

听起来你正在寻找Global Secondary Indexes (GSI)。你的桌子有:

  • 哈希键:类别#Domain
  • 范围键:GroupType#GroupName
  • 其他属性

基于此表,听起来你想拥有一个GSI:

  • 哈希键:GroupType#GroupName
  • 范围键:取决于设计(GSI中不需要)
  • 需要的其他属性
  

我能否将主表的范围键作为哈希键   我的gsi?

是的,developer guide does just this上的示例。

由于表的主键属性始终投影到索引中,因此也存在Category#Domain属性。您还可以选择要在此索引上投影的属性。 GSI还do not need to have a range key

  

另外,有没有什么特殊的方法可以处理来自DynamoDBMapper的gsi?将   我需要创建一个新的POJO?

DynamoDBMapper提供了执行此操作的功能。我不确定它发布的AWS SDK版本(可能是1.7?)。您不需要创建新的POJO,但如果您正在尝试处理现有的表,您将无法立即向其添加GSI(上个月宣布支持online indexing)。您可以使用POJO中的注释DynamoDBIndexHashKeyDynamoDBIndexRangeKey注释,就像您当前使用它们一样。

更新2015/1/27 Online Indexing is now available