具有多个标签的 DynamoDB 查询

Tom*_*Tom 5 amazon-web-services amazon-dynamodb

我对 DynamoDB 相当陌生,目前我们正在考虑使用 DynamoDB 将现有项目迁移到无服务器应用程序,我们希望从 RDMS 数据库调整以下设置:

表格:

  • 项目(项目ID
  • 文件(文件 ID项目 ID、文件名)
  • 标签(文件 ID、标签)

我们希望使用 DynamoDB 进行查询,以获取具有一个或多个标签(按标签)的特定项目(按 ProjectID)的所有文件。在 RDMS 中,此查询很简单,如下所示:

SELECT * FROM Files JOIN Tags ON Tags.FileID = Files.FileID WHERE Files.ProjectID = ?PROJECT AND Tags.Tag = ?TAG_1 OR ?TAG_2 ...

目前,我们有以下 DynamoDB 设置(但仍然可以更改):

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

另请考虑项目条目数量巨大(1000 - 30000 之间)以及每个项目的文件数量(50 到 100.000 之间),并且查询应该非常快。

如何使用 DynamoDB 查询来实现这一点,最好不使用过滤表达式,因为它们是在数据选择后应用的?如果表Files可以有一个 StringSet Tags 作为列,那就完美了,但我猜这不能用于高效的 DynamoDB 查询(因此不使用 DynamoDB 扫描),因为 DynamoDB 索引只能是 String、Binary 和数字而不是 StringSet 类型?这可能是全球二级指数(GSI)的适用用例吗?

Gee*_*nte 6

有点晚了,刚刚看到另一个问题引用了这个问题。

我猜你已经解决了类似的问题?

DynamoDB 表

  • 项目(ProjectID [HashKey],...)
  • 文件(ProjectID [HashKey]、FileID [RangeKey]、...)
  • 标签(标签 [HashKey]、文件 ID [RangeKey]、项目 ID [LSI 排序键])

在 FileTags 上,您需要 FileID 来使主键唯一,但您可以添加 ProjectID 作为本地二级索引的排序键,这样您就可以按 Tag + ProjectID 进行搜索。

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