用于 url 和相关关键字的 DynamoDB 数据模型
Posted
技术标签:
【中文标题】用于 url 和相关关键字的 DynamoDB 数据模型【英文标题】:DynamoDB data model for urls and associated keywords 【发布时间】:2021-12-27 16:48:35 【问题描述】:我在 DynamoDB 表中有项目。每个项目都有一个针对 URL 的列表关键字(URL 是我表中的分区键),这些词已从中提取。现在我想在表格中查询一个关键字并确定哪个 URL/s 有/有这个特定的词。
一种方法是遍历表中的每个项目,然后再次遍历相应的关键字列表以完成查询。另一种选择是我将每个单词作为分区键存储在 item 中,并针对每个单词放置相应的 URL。但在这种情况下,我的爬虫 lambda 会变慢。
您认为,还有其他方法可以达到预期的效果吗?
【问题讨论】:
【参考方案1】:与关系数据库中的数据建模相比,您设计 DynamoDB 架构的方式是读取非常快速和简单,但代价是更多(计算)昂贵的写入。
您现在所做的就是以一种写入成本低而读取成本高的方式来设计您的表。
在 DynamoDB 中,我们考虑的是您的数据模型应该服务的访问模式。在您的情况下,这将是getUrlsByKeyword
。最简单的解决方案是这样设计您的表格:
keyword (Partition Key) | url (Sort Key) |
---|---|
keyword1 | https://test.example.com |
keyword1 | https://test2.example.com |
keyword1 | https://test3.example.com |
wordkey2 | https://test.example.com |
wordkey2 | https://test3.example.com |
这允许您基于keyword=<keyword>
执行Query
,这将返回包含此关键字的所有网址。
您将如何更新此表?
假设您不从表中删除 URL,您需要担心两种情况:
-
带有关键字的新网址
带有关键字的现有网址
解决 1) 很简单:对于每个新的关键字-url 组合,您在上表中添加一条记录。
更新案例 2) 有点烦人,因为您需要弄清楚已经存在的内容才能对其进行更改。因此,我们有了一个新的访问模式 getKeywordsByUrl
,不能从我们迄今为止定义的表中轻松地提供服务,因此我们对其进行了调整。
我们可以做一个简单的技巧:我们创建一个倒排索引,即切换基表的分区和排序键的全局二级索引。 GSI 如下所示:
名称:GSI1 分区键:url 排序键:关键字如果我们查看 GSI1,我们会看到如下表格:
url (GSI1 Partition key) | keyword (GSI1 Sort Key) |
---|---|
https://test.example.com | keyword1 |
https://test.example.com | wordkey2 |
https://test2.example.com | keyword1 |
https://test3.example.com | keyword1 |
https://test3.example.com | wordkey2 |
现在我们可以在 GSI1 上使用 Query
和 url=<url>
轻松获取给定 URL 的关键字。根据其结果,您可以向基表添加新关键字,也可以删除不再存在的关键字。
【讨论】:
以上是关于用于 url 和相关关键字的 DynamoDB 数据模型的主要内容,如果未能解决你的问题,请参考以下文章
AWS SQS FIFO或AWS DynamoDB用于处理大量消息