文章应用程序的 DynamoDB GSI 数据建模

DynamoDB GSI data modelling for an articles app

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

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

我已经为信息创建了一个初始电子表格:

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

然后我尝试创建一个 LSI,但后来我注意到 LSI 需要具有与 table 相同的 PK,因此我可以 select 基于 LSI 类型 = 'ARTICLE',但我仍然无法 select 按日期排序它们(entities_sort 值)

我知道 AWS 说 PK 最好是独一无二的,但在这种情况下如何对数据进行分组?

我创建了一个 GSI

这有助于我按类型 (GSI2PK)='ARTICLE' 获取按 entities_sort (GSI2SK) 排序的文章,但是否有更好的方法来实现此目的?将您的文章作为 PK 在 table 中,但不知何故仍然能够按日期对它们进行排序?

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

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

在我的方法中,我尝试 query/process 尽可能少的项目,所以我不想使用过滤功能,而是对我的信息进行分区。

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

在 PK 上拥有文章的模式是什么,具有独特的 ID,但仍然能够让它们按创建日期排序?

谢谢

所以我最后做的是:

我的详细访问模式是:

  1. 按 ID 获取任何文章(edit/delete)
  2. 按 ID 获取任何评论(edit/delete)
  3. 通过 ID 获取任何标签(edit/delete)
  4. 获取所有按日期排序的文章
  5. 获取一篇文章的所有标签
  6. 获取文章的所有评论,按日期排序
  7. 获取所有具有特定标签的文章,按日期排序(因为我只想显示最后 3 个)

这是我实现模型的方式,我可以获得所有需要的信息。

此外,我的所有数据都已分区,查询非常高效,我总是能准确获得我需要的数据,ScannedDocuments 值始终是数字或返回的对象。

Global Secondary Index 帮助我通过文章 ID 进行查询,我得到了该文章的所有评论和标签。

我终于解决了Tags和Articles之间的many-to-many一条新记录: tag_id、article_date、arct_id、tag_id

因此,如果我希望所有具有特定标签的文章按日期排序,我可以查询 table 的 PK 并按 SK 排序。如果我想获得单个标签(对于 edit/delete),我可以通过以下方式使用 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 中进行数据建模