amazon-web-services - 文章应用程序的 DynamoDB GSI 数据建模
问题描述
我想使用无服务器(AWS Lambda + DynamoDB + S3 用于托管 FE)创建一个文章应用程序。我对“1 表方法”有一些疑问。我想遵循的行动:
- 获取按日期排序的最新 (6) 篇文章
- 通过id获取文章
- 获取与打开的文章相关的上一篇/下一篇文章(基于创建日期)
- 通过标签获取相关文章
- 按文章获取评论
我遇到的第一个问题是行动 nr。1,我无法根据日期获取所有文章,我已经为文章添加了SK作为日期,但是因为PK有单独的文章,每个文章都有它的id:article-1,article-2..等等,我不知道如何仅通过 SK 获取所有文章。
然后我尝试创建一个 LSI ,但后来我注意到 LSI 需要具有与表相同的 PK,因此我可以根据 LSI type = 'ARTICLE' 进行选择,但我仍然无法选择按日期排序的它们(entities_sort 值)
我知道 AWS 说 PK 是唯一的有好处,但是在这种情况下你如何对数据进行分组呢?
这可以帮助我按 type(GSI2PK)='ARTICLE' 获得按 entity_sort (GSI2SK) 排序的文章,但是没有更好的方法来实现这一点吗?将您的文章作为 PK 放在表格中,但不知何故仍然能够按日期对它们进行排序?
以这种方式拥有 GSI1PK、GSI1SK - 我可以使用反向查找获得一篇文章的所有评论,这很好。
但我仍然不知道如何实现第 3 条。获取与打开的文章相关的上一篇/下一篇文章(基于创建日期):通过 id 获取文章,检查其创建日期(entities_sort),然后以某种方式获取根据该创建日期(entities_sort)之前和之后的下一篇文章,DynamoDB 中是否有可以为我执行此操作的函数?
在我的方法中,我尝试查询/处理尽可能少的项目,因此我不想使用过滤器功能,而是对我的信息进行分区。
我的问题是,我应该如何实现 1 和 3?为这么少的动作创建 2 个 GSI 是不是有点矫枉过正?
在 PK 上有文章的模式是什么,具有唯一的 ID,但仍然能够按创建日期对它们进行排序?
谢谢
解决方案
所以我最终做的是:
我详细的访问模式是:
- 按 ID 获取任何文章(用于编辑/删除)
- 按 ID 获取任何评论(用于编辑/删除)
- 按 ID 获取任何标签(用于编辑/删除)
- 获取按日期排序的所有文章
- 获取文章的所有标签
- 获取文章的所有评论,按日期排序
- 获取所有具有特定标签的文章,按日期排序(因为我只想显示最后 3 个)
这就是我实现模型的方式,我可以获得所需的所有信息。
此外,我的所有数据都已分区,查询非常高效,我总是能得到我需要的东西,并且 ScannedDocuments 值始终是数字或返回的对象。
全球二级索引帮助我通过文章 ID 进行查询,我得到了该文章的所有评论和标签。
我最后通过一条新记录解决了标签和文章之间的多对多:tag_id,article_date,arct_id,tag_id
因此,如果我想要所有具有按日期排序的特定标签的文章,我可以查询表的 PK 并按 SK 排序。如果我想获得一个标签(用于编辑/删除),我可以通过以下方式使用 GSI:article_id、tag_id .. 并获得它们之间的关系。
为了获取按日期排序的所有文章,我查询 PK: ARTICLE 和一个选项条件,如果我只想获取某个日期之后的文章,我可以调整 SK。
对于一篇文章的所有评论和标签,我可以将 GSI 与:article_link_pk:article_id 一起使用,我会得到所有评论和标签。如果我只想要评论,我可以这样说 article_link_pk: article_id 和 article_link_sk:begins_with(article_link_sk, '2020') 我只得到评论,没有标签。
这是一段旅程,但我觉得我终于掌握了如何在 DynamoDB 中进行数据建模
推荐阅读
- r - 有没有办法在不从 GitHub 下载的情况下在 packrat 中安装本地包?
- php - 计算在php中反转的复利
- julia - Julia 1.0 在线文档搜索引擎
- python - Pandas-在文件夹中附加 Excel 文件,但也附加它们各自的工作表,因此输出文件具有每个附加工作表
- mysql - MySql 中的 datetime 列使用 dbGetQuery() 返回为 chr
- visual-c++ - 为什么它不完全输出我的字符串变量值?
- c++builder - 如何修改 teechart 系列值?
- python - 适合没有 y 值的 keras 模型
- javascript - 如何通过代理发送 fetch() 请求?
- tensorflow - 如何在 tensorboard 中跟踪完成百分比和平均训练迭代运行时间?