【问题标题】:DynamoDB GSI data modelling for an articles app文章应用程序的 DynamoDB GSI 数据建模
【发布时间】:2020-10-21 11:22:43
【问题描述】:

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

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

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

我遇到的第一个问题是行动 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 - 我可以使用反向查找获得一篇文章的所有 cmets,这很好。

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

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

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

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

谢谢

【问题讨论】:

    标签: amazon-web-services amazon-dynamodb serverless serverless-architecture


    【解决方案1】:

    所以我最终做的是:

    我的详细访问模式是:

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

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

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

    全局二级索引帮助我通过文章 ID 进行查询,我得到了该文章的所有 cmets 和标签。

    我最终通过一条新记录解决了标签和文章之间的多对多: tag_id、article_date、arct_id、tag_id

    所以,如果我想要所有具有按日期排序的特定标签的文章,我可以查询表的 PK 并按 SK 排序。如果我想获得一个标签(用于编辑/删除),我可以通过以下方式使用 GSI:article_id、tag_id .. 并获得它们之间的关系。

    为了获取按日期排序的所有文章,我查询 PK: ARTICLE 和一个选项条件,如果我只想获取某个日期之后的文章,我可以设置 SK。

    对于一篇文章的所有 cmets 和标签,我可以将 GSI 与:article_link_pk:article_id 一起使用,然后我得到所有 cmets 和标签。如果我只想要 cmets,我可以这样说 article_link_pk: article_id 和 article_link_sk:begins_with(article_link_sk, '2020') 我只得到 cmets,没有标签。

    NoSQL Developer 中的数据模型如下所示:

    GSI 反向查找如下所示:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-30
      • 1970-01-01
      • 2021-03-25
      • 1970-01-01
      • 2016-10-18
      • 2015-04-08
      • 2020-05-20
      • 1970-01-01
      相关资源
      最近更新 更多