Amazon dynamodb DynamoDB-集合项目的全局二级索引

Amazon dynamodb DynamoDB-集合项目的全局二级索引,amazon-dynamodb,Amazon Dynamodb,我有一个具有以下属性的dynamo表: id(编号-主键) 标题(字符串) 在(编号-长度)处创建 标签(StringSet-包含一组标签,如android、ios等) 我想能够查询的标签-让我所有的项目标记安卓。我怎样才能在DynamoDB中做到这一点?似乎只能在ScalarDataTypes(数字和字符串)上构建全局二级索引,而不能在集合中的项上构建全局二级索引 如果我所采用的方法是错误的,那么通过创建不同的表或更改属性的替代方法也可以。您需要为此查询创建一个单独的表。 如果您对基于标记

我有一个具有以下属性的dynamo表:

  • id(编号-主键)
  • 标题(字符串)
  • 在(编号-长度)处创建
  • 标签(StringSet-包含一组标签,如android、ios等)
我想能够查询的标签-让我所有的项目标记安卓。我怎样才能在DynamoDB中做到这一点?似乎只能在ScalarDataTypes(数字和字符串)上构建全局二级索引,而不能在集合中的项上构建全局二级索引


如果我所采用的方法是错误的,那么通过创建不同的表或更改属性的替代方法也可以。

您需要为此查询创建一个单独的表。 如果您对基于标记获取所有项目感兴趣,那么我建议保留一个带有主键的表:
散列:标记
范围:id

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

  • DynamoDB不是为优化设置值的索引而设计的。下面是亚马逊相关文档的副本(来自)
索引的键架构。索引键模式中的每个属性 必须是字符串、数字或二进制类型的顶级属性。 不允许嵌套属性和多值集。其他 键模式的要求取决于索引的类型:对于 全局二级索引,哈希属性可以是任何标量表 属性范围属性是可选的,它也可以是任何标量 表属性。对于本地二级索引,哈希属性必须为 与表的hash属性和range属性相同 必须是非键表属性

  • Amazon建议为此类问题创建一个单独的一对多表。更多信息请点击此处:

这是一篇非常古老的帖子,很抱歉让它死灰复燃,但我想看看“单表设计”

基本上,停止将数据视为结构化数据——接受非规范化

id(编号-主键) 标题(字符串) 在(编号-长度)处创建 标签(StringSet-包含一组标签,如android、ios等)

而不是一个带有“header”的nosql表:
id | title |创建|标签

这样想:

pk|sk    |data....
id|id    |{title, created_at}
id|id+tag|{id, tag} <- create one record per tag
pk | sk |数据。。。。
id | id |{标题,创建于}

id | id+tag |{id,tag}tag不能是主键。它只能是索引的键。主键必须是唯一标识符。哈希+范围=主键。Tag+id是唯一的,因为id是唯一的(根据您的问题),使用散列作为标记会导致非均匀负载,因为没有大量不同的标记值。建议使用id作为哈希,标记作为新表的范围,GSI使用标记作为哈希,id作为范围。(查看幻灯片33)。我应该在原始问题中详细说明。谢谢你的建议。我希望设计对你有用,但请记住,GSI与主键在非均匀负载方面存在相同的问题。这意味着,从理论上讲,无论标记哈希是否为主键/GSI,使用标记哈希都会付出更多的代价/获得糟糕的性能。有人知道2018年的情况是否仍然如此吗?@cryanbhu是的,如果你想索引属性,它们不能嵌套