首页 > 解决方案 > 文章应用程序的 DynamoDB GSI 数据建模

问题描述

我想使用无服务器(AWS Lambda + DynamoDB + S3 用于托管 FE)创建一个文章应用程序。我对“1 表方法”有一些疑问。我想遵循的行动:

  1. 获取按日期排序的最新 (6) 篇文章
  2. 通过id获取文章
  3. 获取与打开的文章相关的上一篇/下一篇文章(基于创建日期)
  4. 通过标签获取相关文章
  5. 按文章获取评论

我为信息创建了一个初始电子表格: 在此处输入图像描述

我遇到的第一个问题是行动 nr。1,我无法根据日期获取所有文章,我已经为文章添加了SK作为日期,但是因为PK有单独的文章,每个文章都有它的id:article-1,article-2..等等,我不知道如何仅通过 SK 获取所有文章。

然后我尝试创建一个 LSI ,但后来我注意到 LSI 需要具有与表相同的 PK,因此我可以根据 LSI type = 'ARTICLE' 进行选择,但我仍然无法选择按日期排序的它们(entities_sort 值)

我知道 AWS 说 PK 是唯一的有好处,但是在这种情况下你如何对数据进行分组呢?

我创建了一个 GSI 在此处输入图像描述

这可以帮助我按 type(GSI2PK)='ARTICLE' 获得按 entity_sort (GSI2SK) 排序的文章,但是没有更好的方法来实现这一点吗?将您的文章作为 PK 放在表格中,但不知何故仍然能够按日期对它们进行排序?

以这种方式拥有 GSI1PK、GSI1SK - 我可以使用反向查找获得一篇文章的所有评论,这很好。

但我仍然不知道如何实现第 3 条。获取与打开的文章相关的上一篇/下一篇文章(基于创建日期):通过 id 获取文章,检查其创建日期(entities_sort),然后以某种方式获取根据该创建日期(entities_sort)之前和之后的下一篇文章,DynamoDB 中是否有可以为我执行此操作的函数?

在我的方法中,我尝试查询/处理尽可能少的项目,因此我不想使用过滤器功能,而是对我的信息进行分区。

我的问题是,我应该如何实现 1 和 3?为这么少的动作创建 2 个 GSI 是不是有点矫枉过正?

在 PK 上有文章的模式是什么,具有唯一的 ID,但仍然能够按创建日期对它们进行排序?

谢谢

标签: amazon-web-servicesamazon-dynamodbserverlessserverless-architecture

解决方案


所以我最终做的是:

我详细的访问模式是:

  1. 按 ID 获取任何文章(用于编辑/删除)
  2. 按 ID 获取任何评论(用于编辑/删除)
  3. 按 ID 获取任何标签(用于编辑/删除)
  4. 获取按日期排序的所有文章
  5. 获取文章的所有标签
  6. 获取文章的所有评论,按日期排序
  7. 获取所有具有特定标签的文章,按日期排序(因为我只想显示最后 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') 我只得到评论,没有标签。

NoSQL Developer 中的数据模型如下所示: 在此处输入图像描述

GSI 反向查找如下所示: 在此处输入图像描述

这是一段旅程,但我觉得我终于掌握了如何在 DynamoDB 中进行数据建模


推荐阅读