【问题标题】:How to store circular document inside table?如何在表格中存储圆形文档?
【发布时间】:2020-01-10 05:09:45
【问题描述】:

我是 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时。

大多数查询将在通过 telegram_id 查询 User 以及在房间内使用第一个用户 telegram_user_id 查找第二个用户时进行。

我不明白如何为 DynamoDB 很好地设计它。 我可能会使用关系数据模型并做几个查询。在该示例中,User.room 将只是 Room.idRoom.first_user,Room.second_user 将是 User.id

要找到第二个用户,第一个用户telegram_user_id 我必须做几个查询。

  1. 寻找第一个用户
  2. 使用User.room 作为分区键来查找Room
  3. 然后通过Room.second_user 中的id 找到第二个User

但是用几个独立的查询来做这件事感觉不对。

但是如果没有关系数据模型,我不知道如何很好地实现我的需求。

如何设计这张桌子?

【问题讨论】:

    标签: database-design nosql amazon-dynamodb


    【解决方案1】:

    您应该基于邻接表设计模式进行设计:https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-adjacency-graphs.html

    分区键 (PK) |排序键 (SK) |数据 |剩余属性 ....

    (1) 用户#telegram_user_id1 |用户#详情 |昵称1 | id1

    (2) 用户#telegram_user_id1 |房间#uuid1 |加入时间

    (3) 用户#telegram_user_id1 | USER#second#telegram_user_id2 |房间#uuid1 |加入时间

    (4) 用户#telegram_user_id2 |用户#详情 |昵称2 | id2

    (5) 房间#uuid1 |房间#详情 | createdAtTime

    1. 创建没有房间的用户:创建记录 (1), (4)
    2. 创建房间:作为记录 (5) 并将第一个用户附加到房间作为记录 (2)
    3. 查找用户,查询:PK=USER#telegram_user_id1SK=USER#detail
    4. 将第二个用户作为记录附加到房间 (3)
    5. 通过第一个用户(例如:用户telegram_user_id1)查找第二个用户,查询:PK=USER#telegram_user_id1SK=begins_with(USER#second)

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-25
      • 2013-07-13
      • 1970-01-01
      • 2011-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-18
      相关资源
      最近更新 更多