具有多个标签的 DynamoDB 查询

Posted

技术标签:

【中文标题】具有多个标签的 DynamoDB 查询【英文标题】:DynamoDB Query with multiple tags 【发布时间】:2017-07-29 02:11:36 【问题描述】:

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

表格:

项目(ProjectID) 文件(FileIDProjectID、文件名) 标签(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 设置(但仍可以更改):

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

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

如何使用 DynamoDB 查询来实现这一点,最好不使用过滤器表达式,因为它们是在数据选择之后应用的?如果表 Files 可以有一个 StringSet Tags 作为列,那将是完美的,但我想这不能用于高效的 DynamoDB 查询(因此不使用 DynamoDB-scan),因为 DynamoDB-indices 只能是 String、Binary 和 Number 类型,而不是 StringSet 类型?这可能是Global Secondary Index (GSI) 的适用用例吗?

【问题讨论】:

【参考方案1】:

有点晚了,刚看到这个问题是从另一个人那里引用的。

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

DynamoDB 表

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

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

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

【讨论】:

【参考方案2】:

这个问题已经***年了,但它仍在 Google 搜索结果中。因此,如果其他人来到这里,也许 DynamoDB 文档中的以下页面可以提供帮助。只是自己找到了它,还没有尝试过,但它看起来很有希望。似乎比这里的其他回复更新,并显示了解决问题的好方法。

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

【讨论】:

以上是关于具有多个标签的 DynamoDB 查询的主要内容,如果未能解决你的问题,请参考以下文章

您如何查询 DynamoDB?

如何进行地理距离查询仅返回我尚未“喜欢”的结果、Elastic Search、Dynamo DB

无法在{tableName}查询Dynamo

DynamoDb 查询存储日期

带标签的 AWS S3、DynamoDB、Redshift?

在Dynamo DB中选择where语句