Дизайн таблицы DynamoDB будет в значительной степени зависеть от ваших шаблонов доступа.Не зная полных требований и запросов, необходимых вашему приложению, невозможно будет дать правильный ответ.Но, учитывая ваш пример, вот схема таблицы, которая может работать:
| (GSI PK) |
(P. Key) | (Sort) | (GSI Sort)
studentId | itemType | name | age | address | phone | year
----------+----------+--------+-----+---------+-------+------
1 | Details | Alex | 18 | aaaaaa | 88888 |
1 | Class_A1 | | | | | 2018
2 | Details | Tome | 19 | bbbbbb | 99999 |
2 | Class_B1 | | | | | 2018
3 | Details | Mary | 18 | ccccc | 00000 |
3 | Class_A1 | | | | | 2018
4 | Details | Peter | 20 | dddddd | 00000 |
4 | Class_A1 | | | | | 2017
Обратите внимание на глобальный вторичный индекс с ключом раздела для типа элемента и ключом сортировки для года.С этим дизайном у нас есть несколько вариантов запроса:
1) Получить студента по заданному идентификатору: GetItem (partitionKey: studentId, sortkey: Details)
2) Получить все классы для данного студентаid: Query (partitionKey: studentId, sortkey: STARTS_WITH ("Class"));
3) Получить всех учащихся в классе A1 и 2018 году: Query (GSI partitionkey: "Class_A1", sortkey: equals (2018)))
Для глобальных вторичных индексов раздел и ключ сортировки не обязательно должны быть уникальными, поэтому вы можете иметь много комбинаций Class_A1, 2018.Если вы еще не прочитали Best Practices для DyanmoDB , я настоятельно рекомендую прочитать его полностью.