Как хранить круговой документ внутри таблицы? - PullRequest
0 голосов
/ 10 января 2020

Я новичок в дизайне базы данных No SQL. Для моего приложения у меня есть две сущности для хранения в базе данных. Я буду использовать 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.id и User.telegram_user_id.
  5. Найти 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 Мне нужно будет сделать несколько запросов .

  1. Поиск первого пользователя
  2. Использование User.room в качестве ключа раздела для поиска Room
  3. Затем поиск второго User по идентификатору в Room.second_user .

Но кажется неправильным делать это с несколькими независимыми запросами.

Но я не знаю, как правильно реализовать мои требования без реляционной модели данных.

Как оформить этот стол?

1 Ответ

1 голос
/ 10 января 2020

Вы должны создать базу на основе шаблона проектирования списка смежности: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-adjacency-graphs.html

Ключ раздела (PK) | Сортировать Ключ (SK) | данные | stay_attributes ....

(1) USER # telegram_user_id1 | USER # деталь | ник1 | id1

(2) USER # telegram_user_id1 | КОМНАТА # uuid1 | joinAtTime

(3) USER # telegram_user_id1 | USER # second # telegram_user_id2 | КОМНАТА # uuid1 | joinAtTime

(4) USER # telegram_user_id2 | USER # деталь | ник2 | id2

(5) ROOM # uuid1 | КОМНАТА # подробно | createAtTime

  1. Создать пользователя без комнаты: создать запись (1), (4)
  2. Создать комнату: как запись (5) и присоединить первого пользователя к комнате как запись (2)
  3. Найти пользователя, запрос: PK = USER # telegram_user_id1 , SK = USER # detail
  4. Присоединить второго пользователя к комнате как запись (3 )
  5. Поиск вторых пользователей по первому пользователю (например, user telegram_user_id1), запрос: PK = USER # telegram_user_id1 , SK = begin_with (USER # second)

Надеюсь, это поможет вам.

...