如何在表格内存储循环文档?



我是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创造空间时,他已经加入了里面。

我需要做几件事。

  1. 创建一个没有空间的新用户。
  2. 将文件室附加到用户。
  3. 通过telegram_user_id轻松找到用户。
  4. 添加Room.second_user当另一个用户加入房间时,当我有Room.idUser.telegram_user_id时。
  5. 找到Room.second_user,当我有User.telegram_user_id时。

大多数查询都是在查询Usertelegram_id以及使用第一个用户telegram_user_id在房间内查找第二个用户时

。我不明白如何为 DynamoDB 设计好它。 我可以使用关系数据模型并执行多个查询。在该示例中,User.room将只是Room.idRoom.first_userRoom.second_user将是User.id

要找到第二个用户,通过第一个用户telegram_user_id我必须执行几个查询。

  1. 查找第一个用户
  2. 使用User.room作为分区键查找Room
  3. 然后在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. 不带空间的用户:创建记录 (1(、(4(
  2. 创建聊天室:作为记录 (5( 并将第一个用户作为记录附加到聊天室 (2(
  3. 查找用户,查询:PK=用户#telegram_user_id1,SK=用户#详细信息
  4. 将第二个用户作为记录附加到房间 (3(
  5. 按第一个用户(例如:用户telegram_user_id1(查找第二个用户,查询:PK=USER#telegram_user_id1,SK=begins_with(USER#second(

希望这对你有帮助。

最新更新