DynamoDB эквивалент многих ко многим - PullRequest
1 голос
/ 11 июня 2019

Я хочу повторить следующие отношения в DynamoDB

У пользователя может быть много медалей

Медаль может быть предоставлена ​​многим пользователям

Я читал, что вы должны использовать только одну таблицу в DynamoDB, но я еще не думал о решении этой проблемы.

Сначала я подумал о создании таблицы медалей, а затем в таблице пользователей,пусть у пользователей будет список идентификаторов медалей.

Это требует больше запросов к базе данных и все равно не очень хорошо звучит.

Любой совет?

Ответы [ 2 ]

1 голос
/ 12 июня 2019

Посмотрите на шаблон списка смежности для многих-многих отношений в DynamoDB. Это должно помочь вам. Также ознакомьтесь с передовыми выступлениями Рика Хулихана по моделированию данных в 2017 и 2018 годах.

0 голосов
/ 12 июня 2019

Реляционная база данных

Для простого случая использования при обычных Relational Database настройках это может быть достигнуто с помощью:

Users

ID  | Name
----+---------------
U01 | John
----+---------------
U02 | Richard


Medals

ID  | Name        | Points
----+-------------+--------
M01 | Gold        | 500
----+-------------+--------
M02 | Sliver      | 200


Users_Medals

User ID  | Medal ID | Attainment
---------+----------+-------------
U01      | M01      | Apr 2, 2019
---------+----------+-------------
U01      | M02      | Jun 3, 2019
---------+----------+-------------
U02      | M02      | Jun 2, 2019

DynamoDB

Однако с DynamoDB цель состоит в том, чтобы сгладить данные для быстрого извлечения (миллисекунды из одной цифры) с помощью Hash Key (представьте, что это первичный ключ), в DynamoDB * 1015 строго нет соединений между таблицами. *

Данные слегка дублируются (т. Е. Имя медали дублируется для каждого пользователя), что может повлечь за собой серьезное наказание в течение update, delete (т. Е. Если имя медали необходимо изменить с «Золотого» на «Платиновый» позже все записи должны быть отсканированы и обновлены индивидуально)

<!-- Hash and Range Key -->

Users_Medals

User ID (HashKey)  | Medal ID (Range Key) | Medal Name  | Attainment
-------------------+----------------------+-------------+--------------
U01                | M01                  | Gold        | Jun 3, 2019
-------------------+----------------------+-------------+--------------
U01                | M02                  | Silver      | Jun 2, 2019
-------------------+----------------------+-------------+--------------
U02                | M02                  | Gold        | Apr 1, 2019


<!--- Hash Key Only --->

Users_Medals

UserID_MedalID (HashKey) | Medal Name  | Attainment
-------------------------+-------------+--------------
U01#M01                  | Gold        | Jun 3, 2019
-------------------------+-------------+--------------
U01#M02                  | Silver      | Jun 2, 2019
-------------------------+-------------+--------------
U02#M02                  | Gold        | Apr 1, 2019


Стремитесь структурировать таблицы и данные приложения для быстрого поиска, надеюсь, это даст вам представление

Обновление

Если в вашем заявлении есть требование отобразить или получить список медалей, то следует использовать отдельную отдельную таблицу Medals

Medals

ID (Hash Key)  | Name        | Points
---------------+-------------+--------
M01            | Gold        | 500
---------------+-------------+--------
M02            | Sliver      | 200
---------------+-------------+--------
M03            | Bronze      | 200

Чтобы получить полный список медалей, необходимо Scan

Чтобы получить информацию о медали (то есть имя, очки) по идентификатору (хэш-ключу), необходимо использовать Get Item

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...