发布
社区首页 >问答首页 >DynamoDB一对多的设计思想和问题

DynamoDB一对多的设计思想和问题
EN

Stack Overflow用户
提问于 2021-05-24 19:37:56
回答 1查看 92关注 0票数 1

我正在构建一个使用AWS DynamoDB作为我的应用程序数据库的web应用程序。老实说,我是AWS DyanmoDB的新手。我使用DynamoDB的原因之一是因为我想学习它。现在,我在设计一对多的关系时遇到了一些问题。

现在,我有一个具有以下属性的表。

代码语言:javascript
代码运行次数:0
复制
RegionName (PK) | PostId (RK) | ExpiresAt (LSI) | Message | CreateAt | Topic (LSI) | Status (LSI) |

我把所有的数据放在一张桌子上。我在关于DynamoDB的文章中提到,在设计表之前,理解访问模式始终是第一步。下面是对我的数据库的访问模式。

所有区域(

  • )--来自一个区域的所有帖子(
  • )--在
  • 之前到期的区域的所有帖子--在状态打开并以“天文”(天文)为主题(

F 210)的区域中的所有帖子

当然还有一些。但是,我发现将所有数据或属性存储在一个表中存在以下问题。

  • I无法更新RegionName,因为它是分区键。
  • I无法更新主题或状态或ExpiresAt属性,因为它们是本地辅助索引。由于使用复合主键,
  • 无法在不添加post的情况下添加新区域。例如,我可能会添加新的区域作为网站的管理。然后我的网站的某些部分将显示一个区域列表。

那么,我该如何解决这些问题呢?我的设计正确吗?

为了解决区域问题,作为DynamoDB的新手,我尝试将表分成两部分。区域表和后表。那么Post表将拥有region_id。这样,我可以单独添加新的区域。但这是否解决问题的正确方法呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-25 15:27:09

我觉得你的开局很好。以下是我对实现您的前三种访问模式的看法。请记住,在DynamoDB中有许多建模方法,这只是其中之一。

我正在使用两个全局辅助索引实现您的访问模式。基表如下所示:

基表将实现您的“按区域获取职位”访问模式。

对于第二个访问模式,“按到期日期获取帖子”,我使用基表的PK和过期时间的SK创建了GSI2。这将使您可以根据expires_at时间筛选区域中的帖子:

您的第三种访问模式,“按状态和主题在区域内获取帖子”,我选择了一种稍微不同的方法。我创建了一个名为status_topic的新字段,它连接状态字段和主题字段。然后,我使用主表的PK和status_topic的SK定义了另一个GSI。该视图如下:

这允许您通过搜索GSI1 where PK = REGION#<region_id> and SK = OPEN#ASTRONOMY来实现第三种访问模式。注意,此模式还允许您按状态搜索帖子:PK = REGION#<region_id> and SK begins_with OPEN#PK = REGION#<region_id> and SK begins_with CLOSED#

您还提到了列出所有区域的访问模式。这样做的一个简单方法是创建一个列出所有可用区域的单独分区:

如果您在区域(例如,按名称获取区域)或多个区域周围有访问模式,您可以考虑创建一个项集合来存储这些区域:

注意,我用数字ID替换了区域名称,并将名称移到属性中。这是为了说明您可以将区域名称与唯一的主键分开。

希望这能帮你摆脱困境!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67678018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档