我是NoSQL数据库设计的新手。对于我的应用程序,我有两个实体要存储在数据库中。我将使用类似 JSON 的符号来表示结构。
User {
id: Uuid,
telegram_user_id: int64
room: Optional<Room>,
nickname: String,
}
Room {
id: Uuid,
first_user: User
second_user: Optional<User>
}
所以我基本上有User
可以创建和加入Room
.当User
创造空间时,他已经加入了里面。
我需要做几件事。
- 创建一个没有空间的新用户。
- 将文件室附加到用户。
- 通过
telegram_user_id
轻松找到用户。 - 添加
Room.second_user
当另一个用户加入房间时,当我有Room.id
和User.telegram_user_id
时。 - 找到
Room.second_user
,当我有User.telegram_user_id
时。
大多数查询都是在查询User
时telegram_id
以及使用第一个用户telegram_user_id
在房间内查找第二个用户时
。我不明白如何为 DynamoDB 设计好它。 我可以使用关系数据模型并执行多个查询。在该示例中,User.room
将只是Room.id
和Room.first_user
,Room.second_user
将是User.id
。
要找到第二个用户,通过第一个用户telegram_user_id
我必须执行几个查询。
- 查找第一个用户
- 使用
User.room
作为分区键查找Room
- 然后在
Room.second_user
中通过 id 查找第二个User
。
但是用几个独立的查询来做这件事感觉不对。
但是我不知道如何在没有关系数据模型的情况下很好地实现我的需求。
如何设计此表?
您应该基于邻接列表设计模式进行设计: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-adjacency-graphs.html
分区键 |排序键 (SK( |数据 |remain_attributes....
(1( 用户#telegram_user_id1 |用户#详细信息 |昵称1 |编号1
(2( 用户#telegram_user_id1 |房间#uuid1 |加入时间
(3( 用户#telegram_user_id1 |用户#秒#telegram_user_id2 |房间#uuid1 |加入时间
(4( 用户#telegram_user_id2 |用户#详细信息 |昵称2 |编号2
(5( 房间#UUID1 |房间#详情 |创建时间
创建- 不带空间的用户:创建记录 (1(、(4(
- 创建聊天室:作为记录 (5( 并将第一个用户作为记录附加到聊天室 (2(
- 查找用户,查询:PK=用户#telegram_user_id1,SK=用户#详细信息
- 将第二个用户作为记录附加到房间 (3(
- 按第一个用户(例如:用户telegram_user_id1(查找第二个用户,查询:PK=USER#telegram_user_id1,SK=begins_with(USER#second(
希望这对你有帮助。