我有一个具有以下属性的发电机表:
我希望能够按标签查询 - 为我提供标记为android 的所有项目。我怎么能在DynamoDB中做到这一点?似乎全局二级索引只能在ScalarDataTypes(数字和字符串)上构建,而不能在集合中的项目上构建。
如果我采取的方法是错误的,通过创建不同的表或更改属性来实现它的另一种方法也没关系。
答案 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=id
和sk begins with id
并返回所有内容,并将标记加入应用逻辑中的id记录
,您可以使用GSI将id|id+tag
投影到tag|id
中,这仍然需要您针对数据编写两个查询以获取给定标签的项(获取ID然后获取项) ,但是您不必重复数据,也不必扫描,并且当您的访问模式不依赖标签时,仍然可以在一个查询中获取项目。
首先,我将首先考虑您的所有访问模式,然后再考虑如何构造复合键和/或GSI
欢呼