如何使用 Amazon DynamoDB 在没有热分区的情况下对论坛进行建模?

Xeo*_*oss 4 database database-design amazon-web-services nosql amazon-dynamodb

AWS DynamoDB 文档包含论坛的示例架构。然而,该模式能够回答的问题数量似乎很少。此外,该表似乎还存在热键问题(同一分区上的大量回复备份)。

在题为“Amazon DynamoDB 的高级设计模式”的演讲中,演示者用了大约 43 分钟的时间,仅使用具有 3 个 GSI(索引)的单个表分解了Audible 的复杂用例。

我正在尝试从标准 RDBMS 3NF 背景学习正确的 DynamoDB 建模。如何设计论坛来防止热分区,同时仍然满足这些常见用例?

查询:

  • 按论坛列出的主题(按发布日期或最近回复排序)
  • 按主题回复(按分页发布日期排序)
  • 用户回复(按发布日期排序)
  • 按用户划分的主题(按发布日期排序)
  • 得票最多的主题

基本架构(?):

  • 论坛:分区键:Forum_GUID。属性:名称、描述
  • 用户:分区键:User_GUID。属性:电子邮件、加入日期
  • 主题:复合键:Forum_GUID、Topic_GUID。属性:posted_by、日期、投票、正文、主题
  • 回复:复合键:Topic_GUID、Reply_GUID。属性:posted_by、日期、投票、正文

我假设有多种解决方案(包括使用单个表)。我正在寻找任何可以解决此问题的答案,同时提供有关何时以及如何正确使用索引来扩展应用程序写入的指导。

bes*_*hes 5

在此输入图像描述

您可以使用上面的架构。现在为您解答疑问

  1. 按论坛列出的主题(按发布日期或最近回复排序)

     Select from GSI1 where GSI1 pk=Forum123 and sortby GSI1 SK
    
    Run Code Online (Sandbox Code Playgroud)

    您可以根据经常询问的用例选择在 GSI1 Sk 最近发布的回复/日期中保留哪些人。

  2. 按主题回复(按分页发布日期排序)

     Select where pk=topic and sk startswith reply and sortby sk
    
    Run Code Online (Sandbox Code Playgroud)
  3. 用户回复(按发布日期排序)

     Select from GSI2 where pk=User123 and sk startswith reply and sortby sk
    
    Run Code Online (Sandbox Code Playgroud)
  4. 按用户划分的主题(按发布日期排序)

     Select from GSI2 where pk=User123 and sk startswith topic and sortby sk
    
    Run Code Online (Sandbox Code Playgroud)
  5. 得票最多的主题

This will require another GSI if you want to do this operation across multiple forums. but This GSI will certainly suffer from hot key issue. since there will be only one key. Instead of doing that, you can keep one fixed key value in your table who keeps these counts. and these values are updated by an async process.
Run Code Online (Sandbox Code Playgroud)