database - 用于 url 和相关关键字的 DynamoDB 数据模型
问题描述
我在 DynamoDB 表中有项目。每个项目都有一个针对 URL 的列表关键字(URL 是我表中的分区键),这些词已从中提取。现在我想在表中查询一个关键字并确定哪个 URL/s 有/有这个特定的词。
一种方法是遍历表中的每个项目,然后再次遍历相应的关键字列表以完成查询。另一种选择是我将每个单词作为分区键存储在 item 中,并针对每个单词放置相应的 URL。但在这种情况下,我的爬虫 lambda 会变慢。
您认为,还有其他方法可以达到预期的效果吗?
解决方案
与关系数据库中的数据建模相比,您设计 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,您需要担心两种情况:
- 带有关键字的新网址
- 包含关键字的现有 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>
推荐阅读
- ruby-on-rails - 没有模型的 Rails Active Storage
- docker - 如何在独立 Selenium 容器旁边的 Docker 容器中运行刮板代码?
- amazon-web-services - 如何为 Postman 获取不记名令牌 AWS
- python - Python中的最近邻算法 - 澄清
- centos - 需要帮助来设置 Samba 服务器
- amazon-web-services - 在 EC2 启动并处于运行状态后立即运行 jenkins
- sql - 如何让 BigQuery 过滤带有 IN 和 NOT IN 的重复 STRING 字段?
- java - 在树莓派上运行 Spring 应用程序的 Docker 性能问题
- android - Android Paging 3 库,分组项目
- python - 如何使用 DataFrame 比较 2 个 Excel 列,然后将其输出到另一个 Excel 文件?