DynamoDB - 设置项目的全局二级索引

时间:2015-11-06 01:09:16

标签: amazon-dynamodb

我有一个具有以下属性的发电机表:

  • id(数字 - 主键)
  • title(String)
  • created_at(数字 - 长)
  • tags(StringSet - 包含一组标签,例如android,ios等),

我希望能够按标签查询 - 为我提供标记为android 的所有项目。我怎么能在DynamoDB中做到这一点?似乎全局二级索引只能在ScalarDataTypes(数字和字符串)上构建,而不能在集合中的项目上构建。

如果我采取的方法是错误的,通过创建不同的表或更改属性来实现它的另一种方法也没关系。

3 个答案:

答案 0 :(得分:15)

  

索引的关键架构。索引键架构中的每个属性   必须是String,Number或Binary类型的顶级属性。   不允许嵌套属性和多值集。其他   密钥模式的要求取决于索引的类型:对于a   全局二级索引,哈希属性可以是任何标量表   属性。范围属性是可选的,它也可以是任何标量   表属性。对于本地二级索引,hash属性必须   与表的哈希属性和范围属性相同   必须是非键表属性。

答案 1 :(得分:3)

您需要为此查询创建单独的表。 如果您有兴趣根据标签获取所有项目,那么我建议保留一个带有主键的表:
哈希:标签
范围:id

通过这种方式,您可以使用非常简单的Query按标记获取所有项目。

答案 2 :(得分:1)

这是一个非常老的帖子,很抱歉要复活,但我来看看“单表设计”

基本上,不要再将数据视为结构化数据了-接受非规范化

id(数字-主键) 标题(字符串) created_at(数字-长) 标签(StringSet-包含一组标签,例如android,ios等)

代替带有“标头”的nosql表:
id|title|created_at|tags

这样想:

pk|sk    |data....
id|id    |{title, created_at}
id|id+tag|{id, tag} <- create one record per tag

您仍然可以通过查询pk=idsk begins with id并返回所有内容,并将标记加入应用逻辑中的id记录

,您可以使用GSI将id|id+tag投影到tag|id中,这仍然需要您针对数据编写两个查询以获取给定标签的项(获取ID然后获取项) ,但是您不必重复数据,也不必扫描,并且当您的访问模式不依赖标签时,仍然可以在一个查询中获取项目。

首先,我将首先考虑您的所有访问模式,然后再考虑如何构造复合键和/或GSI

欢呼