来自SQL背景,尝试解决NoSQL特别是DynamoDB选项。鉴于此架构:
{
"publist": [{
"Author": "John Scalzi",
"Title": "Old Man's War",
"Publisher": "Tor Books",
"Tags": [
"DeepSpace",
"SciFi"
]
},
{
"Author": "Ursula Le Guin",
"Title": "Wizard of Earthsea",
"Publisher": "Mifflin Harcourt",
"Tags": [
"MustRead",
"Fantasy"
]
},
{
"Author": "Cory Doctorow",
"Title": "Little Brother",
"Publisher": "Doherty"
}
]
}
我可以让主表将作者/标题作为散列/范围键。全局二级索引可以是Publisher / Title。这里有什么最好的做法。如何在没有全表扫描的情况下获取发布者的所有作者列表?不能有二级索引,因为发布者/作者不是唯一的!如果我想要所有带有DeepSpace标签的标题,我还有什么选择?
编辑:参见RPM& Vikdor回答如下。 GSI不一定是唯一的,因此发布者/作者是可能的。但问题仍然存在:是否有任何解决方法可以通过标记获取所有作者,而无需进行全表扫描?
答案 0 :(得分:1)
不能有二级索引,因为发布者/作者不是唯一的!
当然可以,只需确保您的发布者/标题索引将作者作为投影 - 然后您可以通过发布者进行查询,只需迭代结果并收集作者。
设置索引时,可以选择将哪些属性投影到索引中。拥有发布者或发布者/标题密钥并不意味着您只能查看发布者或发布者和标题,这意味着您只能按发布者或标题查询,因此,如果您拥有所有属性或投影到索引中的作者属性,您可以使用查询而不是全表扫描获取发布者的作者列表。
答案 1 :(得分:1)
不能有二级索引,因为发布者/作者不是唯一的!
(散列主键,范围主键)元组不一定是唯一的,用于定义全局二级索引。这只是表级别键定义的要求,即表不能有多个具有相同(散列主键,范围主键)元组值的行。
如何在没有全表扫描的情况下获取发布者的所有作者列表
您在发布服务器(Hash PK),作者(范围PK)上定义GSI,并在GSI上使用DynamoDB查询,并将Publisher属性设置为哈希键值。
与可以根据检索模式在任意列上创建非聚集索引的SQL不同,在DynamoDB中,由于每个表限制本地二级索引和全局二级索引的数量,因此列出以下内容非常重要在识别表的哈希主键和范围主键之前检索数据的用例,并尽可能地利用本地二级索引,因为它们使用表的读取和读取。写入容量并且非常一致(您可以选择在LSI上运行最终一致的查询以节省容量)。 GSI需要自己的阅读和阅读写能力并最终保持一致。
答案 2 :(得分:0)
不幸的是,DynamoDB目前不支持此功能。 DDB不提供像MongoDB一样查询嵌套文档的功能。
在这种情况下,请考虑对数据进行不同的建模,并将嵌套文档放在单独的表中。
希望这会有所帮助。干杯,