微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决文章应用程序的DynamoDB GSI数据建模

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

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

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

enter image description here

我的第一个问题是动作nr。 1,我无法获得所有基于日期的文章,我将文章的SK添加为日期,但是因为PK有单独的文章,每篇文章的ID为:article-1,article-2 ..等,我不知道如何仅通过SK获取所有文章

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

我知道AWS表示PK具有独特的优势,但是在这种情况下如何对数据分组?

我创建了一个GSI

enter image description here

这可以帮助我获取按类型(GSI2PK)='ARTICLE'的文章,并按entities_sort(GSI2SK)进行排序,但是没有更好的方法吗?将您的文章作为PK放在表中,但是仍然能够以某种方式使它们按日期排序?

具有GSI1PK和GSI1SK的这种方式-我可以使用反向查找获得文章的所有注释,所以很好。

但是我仍然也不知道如何实现数字3。获取相对于打开的文章上一篇/下一篇文章(基于创建日期):按ID获取文章,检查其创建日期(entities_sort),然后以某种方式基于创建日期(entities_sort)前后获取下一篇文章,DynamoDB中是否有一个功能可以为我做到这一点?

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

我的问题是,我应该如何实现1和3?难道不是为了这么少的动作而创建2个GSI吗?

在PK上有ID唯一但又能够按创建日期排序的文章的方式是什么?

谢谢

解决方法

所以我最终要做的是:

我的详细访问方式是:

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

enter image description here

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

此外,我所有的数据都进行了分区并且查询确实非常有效,我总是得到所需的东西,而ScannedDocuments值始终是数字或返回的对象。

全球二级索引可帮助我按文章ID进行查询,并获得该文章的所有注释和标签。

最后,我通过新记录解决了标签和文章之间的多对多问题: tag_id,article_date,arct_id,tag_id

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

要获取所有按日期排序的文章,我查询PK:文章和选项条件,如果我只想获取日期之后的文章,则可以对SK进行条件处理。

对于文章的所有注释和标签,我可以将GSI与:article_link_pk:article_id一起使用,这样我就可以获得所有注释和标签。如果我只想发表评论,我可以这样说article_link_pk:article_id和article_link_sk:begins_with(article_link_sk,'2020'),这样我只会获得评论,没有标签。

NoSQL Developer中的数据模型如下所示: enter image description here

GSI反向查找如下所示: enter image description here

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。