DynamoDB 上聊天应用程序的单个 table 设计,检查方向是否正确
Single table design of a chat app on DynamoDB, checking if on the right direction
我是 NoSQL 的新手,特别是 DynamoDB 单一 table 设计。在互联网上浏览了很多关于单一table设计的视频和文章,最后我为我计划在未来构建的聊天应用程序整理了一个小设计。
到目前为止,我考虑过的访问模式是 -
- 通过用户 ID 获取用户详细信息。
- 获取用户参与的对话列表。
- 获取用户创建的消息列表
- 获取对话的所有成员
- 获取对话的所有消息
还想按日期范围访问对话的消息,到目前为止我还没有想出那个。
按照下面的设计,如果我要拉取一个会话的所有消息,是否会拉取消息分区中消息属性中的实际消息?
这是我用一些示例数据创建的模型的片段。如果我的方向正确,请告诉我。
As per the below design, if I were to pull all messages of a conversation, is that going to pull the actual message in the message attribute which is in the message partition?
不,它只会 return 消息的 ID,因为实际内容位于单独的分区中。
我建议使用一个不同的模型 - 它由 table 和全球二级索引 (GSI1) 组成。布局是这样的:
基础Table:
- 分区键:PK
- 排序键:SK
全球二级指数 GSI1:
- 分区键:GSI1PK
- 排序键:GSI1SK
基地Table
GSI 1
访问模式
1.) Get user details by User Id.
GetItem on Base Table with Partition Key = PK = U#<id>
and Sort Key SK = USER
2.) Get list of conversations the user is part of.
在分区键 = PK = U#<id>
和排序键 SK = starts_with(CONV#)
上查询基 Table
3.) Get list of messages the user has created
使用分区键查询 GSI1 GSI1PK = U#<id>
4.) Get all members of a conversation
查询基 Table,分区键 = PK = CONV#<id>
和排序键 SK starts_with(U#)
5.) Get all messages of a conversation
使用分区键 PK = CONV#<id>
和排序键 SK starts_with(MSG#)
在基 Table 上查询
6.) Also want to access messages of a conversation by a date range, so far I haven't figured out that one.
DynamoDB 在分区中进行字节顺序排序 - 如果您根据 UTC 时区中的 ISO 8601 格式化所有日期,则可以进行范围查询,例如:
使用分区键 PK = CONV#<id>
和排序键 SK between(MSG#2021-09-20, MSG#2021-09-30)
在基 Table 上查询
我是 NoSQL 的新手,特别是 DynamoDB 单一 table 设计。在互联网上浏览了很多关于单一table设计的视频和文章,最后我为我计划在未来构建的聊天应用程序整理了一个小设计。
到目前为止,我考虑过的访问模式是 -
- 通过用户 ID 获取用户详细信息。
- 获取用户参与的对话列表。
- 获取用户创建的消息列表
- 获取对话的所有成员
- 获取对话的所有消息
还想按日期范围访问对话的消息,到目前为止我还没有想出那个。
按照下面的设计,如果我要拉取一个会话的所有消息,是否会拉取消息分区中消息属性中的实际消息?
这是我用一些示例数据创建的模型的片段。如果我的方向正确,请告诉我。
As per the below design, if I were to pull all messages of a conversation, is that going to pull the actual message in the message attribute which is in the message partition?
不,它只会 return 消息的 ID,因为实际内容位于单独的分区中。
我建议使用一个不同的模型 - 它由 table 和全球二级索引 (GSI1) 组成。布局是这样的:
基础Table:
- 分区键:PK
- 排序键:SK
全球二级指数 GSI1:
- 分区键:GSI1PK
- 排序键:GSI1SK
基地Table
GSI 1
访问模式
1.) Get user details by User Id.
GetItem on Base Table with Partition Key = PK = U#<id>
and Sort Key SK = USER
2.) Get list of conversations the user is part of.
在分区键 = PK = U#<id>
和排序键 SK = starts_with(CONV#)
3.) Get list of messages the user has created
使用分区键查询 GSI1 GSI1PK = U#<id>
4.) Get all members of a conversation
查询基 Table,分区键 = PK = CONV#<id>
和排序键 SK starts_with(U#)
5.) Get all messages of a conversation
使用分区键 PK = CONV#<id>
和排序键 SK starts_with(MSG#)
6.) Also want to access messages of a conversation by a date range, so far I haven't figured out that one.
DynamoDB 在分区中进行字节顺序排序 - 如果您根据 UTC 时区中的 ISO 8601 格式化所有日期,则可以进行范围查询,例如:
使用分区键 PK = CONV#<id>
和排序键 SK between(MSG#2021-09-20, MSG#2021-09-30)