我是DynamoDB的新手,目前我们正在考虑使用DynamoDB将现有项目迁移到无服务器应用程序,我们希望从RDMS数据库调整以下设置:
表:
-
项目( ProjectID )
-
个文件( FileID ,ProjectID,文件名)
-
标签(FileID,标签)
我们希望使用DynamoDB进行查询,以使用一个或多个 Tags (按标签)获取特定 Project (通过ProjectID)的所有 Files . 在RDMS中,这个查询很简单,例如:
SELECT * FROM Files JOIN Tags ON Tags.FileID = Files.FileID WHERE Files.ProjectID = ?PROJECT AND Tags.Tag = ?TAG_1 OR ?TAG_2 ...
目前,我们有以下DynamoDB设置(但仍可以更改):
-
Projects(ProjectID [HashKey],...)
-
文件(ProjectID [HashKey],FileID [RangeKey],...)
还请考虑项目条目的数量很大(在1000-30000之间)以及每个项目的文件数(在50到100.000之间),查询应该非常快 .
如何使用DynamoDB查询实现这一点,最好不使用过滤器表达式,因为它们是在数据选择后应用的?如果表 Files 可以将StringSet标签作为列,那将是完美的,但我想这不能用于有效的DynamoDB查询(因此不使用DynamoDB扫描),因为DynamoDB索引只能是String,Binary和String类型数字而不是StringSet类型?这可能是Global Secondary Index(GSI)的适用用例吗?
1 回答
有点晚了,只是看到了另一个提到的这个问题 .
我猜你已经解决了这样的问题?
DynamoDB表
Projects(ProjectID [HashKey],...)
文件(ProjectID [HashKey],FileID [RangeKey],...)
标签(标签[HashKey],FileID [RangeKey],ProjectID [LSI排序键])
在FileTags上,您需要FileID使主键唯一,但您可以将ProjectID添加为本地二级索引的排序键,以便您可以搜索Tag ProjectID .
它是某种数据非规范化,但这就是去NoSQL所需要的:-(例如,如果你的文件将切换到另一个项目,你需要不仅在文件上更新ProjectID,而且还需要在所有标签上更新ProjectID .