Home Articles

具有多个标记的DynamoDB查询

Asked
Viewed 327 times
0

我是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 Answer

  • 1

    有点晚了,只是看到了另一个提到的这个问题 .

    我猜你已经解决了这样的问题?

    DynamoDB表

    • Projects(ProjectID [HashKey],...)

    • 文件(ProjectID [HashKey],FileID [RangeKey],...)

    • 标签(标签[HashKey],FileID [RangeKey],ProjectID [LSI排序键])

    在FileTags上,您需要FileID使主键唯一,但您可以将ProjectID添加为本地二级索引的排序键,以便您可以搜索Tag ProjectID .

    它是某种数据非规范化,但这就是去NoSQL所需要的:-(例如,如果你的文件将切换到另一个项目,你需要不仅在文件上更新ProjectID,而且还需要在所有标签上更新ProjectID .

Related