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

500*_*865 18 amazon-dynamodb

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

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

我希望能够通过标签查询 - 获取标记为android的所有项目.我怎么能在DynamoDB中做到这一点?看起来全局二级索引只能在ScalarDataTypes(Number和String)上构建,而不能在一个集合中的项目上构建.

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

500*_*865 20

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

  • 亚马逊建议为这类问题创建单独的一对多表.更多信息:使用一对多表


Sch*_*ton 9

这是一篇非常旧的帖子,很抱歉重新发布它,但我会看看“单表设计”

基本上,停止将数据视为结构化数据 - 拥抱非规范化

id(数字 - 主键)标题(字符串)created_at(数字 - 长)标签(字符串集 - 包含一组标签,例如 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
Run Code Online (Sandbox Code Playgroud)

您仍然可以通过查询&并将标签连接到应用程序逻辑中的 id 记录来返回所有内容pk=idsk begins with id

并且您可以使用 GSI 进行投影id|id+tagtag|id仍然需要您针对数据编写两个查询以获取给定标签的项目(获取 ids,然后获取项目),但您不必复制数据,您当您的访问模式不依赖标签时,您无需扫描,仍然可以通过一次查询获取您的项目。

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

干杯


Che*_*rel 5

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

这样,您可以使用非常简单的查询按标签获取所有项目。

  • hash + range =主键。Tag + id是唯一的,因为id是唯一的(根据您的问题) (6认同)
  • 使用散列作为标记会导致加载不均匀,因为没有大量不同的标记值。建议使用ID作为哈希表和标签作为新表的范围,并使用GSI将标签作为哈希表和ID作为范围。http://www.slideshare.net/AmazonWebServices/deep-dive-amazon-dynamodb(请检查幻灯片33)。 (3认同)