用于聊天应用程序的 Dynamo DB ERD

Abh*_*ngh 1 primary-key amazon-web-services amazon-dynamodb secondary-indexes google-cloud-firestore

我正在尝试将我的聊天应用程序从 Firestore 迁移到 DynamoDB。

目前我在 firebase 中有 2 个集合:RoomsUsers. Users集合包含用户所属的所有 roomsId。 Rooms集合有一些元数据,例如名称、图标等以及Messages子集合。Messages子集合具有与消息相关的整个有效负载。

我在为此设计 Dynamo DB ERD 时感到困惑。我已经开发了以下 ERD 以及列出的访问模式,但我无法计算出 PK、SK 和二级索引(如果需要)。

ERD

2021 年 6 月 14 日更新:根据我收到的答案和帮助,我成功地进行了以下设计,我认为这将支持我所有的访问模式。

我想要运行的一个主要查询是通过用户 ID 获取所有房间的配置项,我不确定是否能够在单个查询中获取它。现在,简单的解决方案是获取用户的所有房间,然后获取所有获取的房间的所有配置(SK),我认为这不是一个好的解决方案。

表格1

支持的访问模式:

  1. 获取房间中的所有用户 (PK= ROOM#rid&& SK= Begins_with(USER#))
  2. 获取单个房间的配置(PK= ROOM#rid&& SK= CONFIG
  3. 获取单个房间的消息(PK= ROOM#rid&& SK= Begins_with( MESSAGE#)

GSI

支持的访问模式:

  1. 获取用户的所有房间 (PK= USER#uid&& SK= Begins_with(ROOM#))

Set*_*gan 6

实体建模和列出访问模式做得很好。这是成功进行 NoSQL 数据建模的第一步!

我将概述一种对该应用程序进行建模的方法。请记住,这并不是对该应用程序的访问模式进行建模的唯一方法,并且它可能无法处理您将遇到的所有边缘情况。不过,我希望这个例子能让你摆脱困境!

以下是我在基表中定义 PK/SK 模式的方法。请注意,我type为每个项目添加了一个字段。由于每个项目可以是任何类型,因此我喜欢添加此字段来帮助我理解每个项目代表什么!

在此输入图像描述

该表支持以下访问模式:

  • 为用户获取房间(查询 PK=USER#userId SK beings_with ROOM)
  • 按 ID 获取消息(获取项目,其中 PK=MSG#messageId SK=MSG#messageId

我选择使用 KSUID 作为消息 ID。KSUID 是按创建时间排序的唯一标识。当我们获取房间的消息时,这将很有用。

我还在属性 GSI1PK 和 GSI1SK 上创建了一个名为 GSI1 的全局二级索引。

在此输入图像描述

GSI1 支持:

  • 按房间获取消息,按创建日期排序(查询 GSI1 的 PK=ROOM#roomId SK begin_with MSG#)。由于我们使用 KSUID,消息将按创建日期/时间排序返回!
  • 按房间获取所有用户(查询 GSI1 的 PK=ROOM#roomId SK begin_with USER)

  • 如果您的应用程序只需要显示房间名称和图标,则在将用户添加到房间分区时,可以将这些字段复制到用户项 (PK=ROOM#rid SK=USER#uid)。通过这样做,您将确保房间字段在 GSI1 中可用。当您复制的属性不经常更改时(房间名称和图标可能就是这种情况),这是一个有用的模式。 (2认同)