具有多个标记的DynamoDB查询

时间:2017-03-08 13:23:08

标签: amazon-web-services amazon-dynamodb

我是DynamoDB的新手,目前我们正考虑使用DynamoDB将现有项目迁移到无服务器应用程序,我们希望从RDMS数据库调整以下设置:

表:

  • 项目( ProjectID
  • 文件( FileID ProjectID ,文件名)
  • 标签( FileID ,标签)

我们希望使用DynamoDB进行查询,以获取具有一个或多个标记的特定项目(通过ProjectID)的所有文件(通过Tag)。在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标签​​作为列,那将是完美的,但我想这不能用于有效的DynamoDB查询(因此不使用DynamoDB-scan),因为DynamoDB-indices只能是String,Binary和Number类型而不是StringSet类型?这可能是Global Secondary Index(GSI)的适用用例吗?

2 个答案:

答案 0 :(得分:2)

有点晚了,只是从另一个问题中看到了这个问题。

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

DynamoDB表

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

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

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

答案 1 :(得分:2)

这个问题已经存在了将近三年,但仍然存在于Google的调查结果中。因此,如果有人落在这里,DynamoDB文档的以下页面可能会有所帮助。只是自己发现它,还没有尝试过,但是看起来很有希望。似乎比这里的其他回复新,并且显示了一种解决此问题的好方法。

https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-adjacency-graphs.html