Я собираюсь дать этот ответ, предполагая, что вам необходимо выполнить следующие запросы.
- Для данного аккаунта найдите все профили
- Для данного профилянайти все предметы
- По заданному профилю и конкретному типу предмета найти все предметы
- По заданному предмету найти принадлежащий ему профиль
- По заданному профилю найти личный аккаунт
Одной из прелестей DynamoDB (и, возможно, также является бичом) является то, что он в основном не содержит схем.У вас должны быть обязательные атрибуты первичного ключа для каждого элемента в таблице, но все остальные атрибуты могут быть любыми.Чтобы иметь дизайн DynamoDB только с одной таблицей, вам обычно нужно привыкнуть к идее смешивания типов объектов в одной и той же таблице.
При этом, вот возможная схема для вашего варианта использования,Мое предложение предполагает, что вы используете что-то вроде UUID для своих идентификаторов.
Ключ раздела - это поле, которое просто называется pkey
(или как вы хотите).Мы также назовем ключ сортировки skey
(но опять же, это не имеет значения).Теперь для учетной записи значение pkey
равно Account-{{uuid}}
, а значение skey
будет таким же.Для профиля значение pkey
также равно Account-{{uuid}}
, но значение skey
равно Profile-{{uuid}}
.Наконец, для Предмета pkey
равно Profile-{{uuid}}
, а skey
равно Item-{{type}}-{{uuid}}
.Для всех атрибутов элемента не беспокойтесь об этом, просто используйте любые атрибуты, которые вы хотите использовать.
Поскольку «родительский» объект всегда является ключом раздела, вы можете получить любой из «дочерние объекты просто запросив идентификатор родительского объекта.Например, выражение вашего ключевого условия для получения всех ItemType2 для профиля будет
pkey = “Profile-{{uuid}}” AND begins_with(skey, “Item-Type2”)
В этой схеме ваш GSI имеет те же ключи, что и таблица, но в обратном порядке.Вы можете запросить GSI для «Item - {{type}} - {{uuid}}», чтобы получить собственный профиль, и аналогично с профилем - получить собственный счет.
То, что я иллюстрировал здесьэто шаблон списка смежности .В DynamoDB также есть статья, описывающая, как использовать составные ключи сортировки для иерархических данных , которые также подойдут для ваших данных, и в зависимости от ваших ожидаемых запросов это может быть более подходящим, чем использование списка смежности.
Вам не нужно складывать все в одну таблицу.Да, DynamoDB рекомендует это, но гораздо важнее убедиться, что ваше приложение корректно и поддерживается.Если наличие нескольких таблиц означает, что проще написать приложение без дефектов, используйте несколько таблиц.