首页 > 解决方案 > 用于 url 和相关关键字的 DynamoDB 数据模型

问题描述

我在 DynamoDB 表中有项目。每个项目都有一个针对 URL 的列表关键字(URL 是我表中的分区键),这些词已从中提取。现在我想在表中查询一个关键字并确定哪个 URL/s 有/有这个特定的词。

一种方法是遍历表中的每个项目,然后再次遍历相应的关键字列表以完成查询。另一种选择是我将每个单词作为分区键存储在 item 中,并针对每个单词放置相应的 URL。但在这种情况下,我的爬虫 lambda 会变慢。

您认为,还有其他方法可以达到预期的效果吗?

标签: databaseamazon-web-servicesnosqlamazon-dynamodb

解决方案


与关系数据库中的数据建模相比,您设计 DynamoDB 模式的方式是读取非常快速和简单,但代价是更多(计算)昂贵的写入。

您现在所做的是以写入便宜而读取昂贵的方式设计您的表。

在 DynamoDB 中,我们根据您的数据模型应该服务的访问模式来考虑。在你的情况下,那将是getUrlsByKeyword. 最简单的解决方案是像这样设计您的表格:

关键字(分区键) url(排序键)
关键字1 https://test.example.com
关键字1 https://test2.example.com
关键字1 https://test3.example.com
wordkey2 https://test.example.com
wordkey2 https://test3.example.com

这使您可以Query根据keyword=<keyword>它返回包含此关键字的所有 URL。

您将如何更新此表?

假设您不从表中删除 URL,您需要担心两种情况:

  1. 带有关键字的新网址
  2. 包含关键字的现有 URL

解决 1) 很简单:对于每个新的关键字 URL 组合,您都在上表中添加一条记录。

更新案例 2) 有点烦人,因为您需要弄清楚已经存在的内容来更改它。因此,我们有一个新的访问模式getKeywordsByUrl,目前我们定义的表不能轻易地提供这种模式,因此我们对其进行了调整。

我们可以做一个简单的技巧:我们创建一个倒排索引,即切换基表的分区和排序键的全局二级索引。GSI 看起来像这样:

  • 名称:GSI1
  • 分区键:url
  • 排序键:关键字

如果我们查看 GSI1,我们会看到如下表格:

url(GSI1 分区键) 关键字(GSI1 排序键)
https://test.example.com 关键字1
https://test.example.com wordkey2
https://test2.example.com 关键字1
https://test3.example.com 关键字1
https://test3.example.com wordkey2

现在我们可以使用GSI1Query上的 a和.轻松获取给定 URL 的关键字。根据其结果,您可以向基表添加新关键字,也可以删除不再存在的关键字。url=<url>


推荐阅读