В предыдущем модуле осуществлялось добавление инвертированного индекса к таблице. Инвертированный индекс используется для добавления дополнительных шаблонов запроса для реляционных данных. Но мы увидели, что одна проблема все же осталась. Хотя можно было отправить запрос ко всем сущностям Friendship для определенной сущности User, в сущности Friendship отсутствовала информация об отслеживаемом пользователе.
Этот модуль посвящен частичной нормализации.
Во втором модуле было продемонстрировано, что не стоит пытаться подделать реляционный шаблон при моделировании с помощью DynamoDB. Одним базовым клиентом реляционной модели является нормализация данных, при которой не допускается дублирование данных в нескольких местах. Нормализация – это прекрасный шаблон в реляционных базах данных, но при отправке запросов могут потребоваться дорогостоящие операции объединения для повторного сбора данных.
При использовании DynamoDB часто нужно проводить денормализацию данных. Денормализация помогает избежать операций объединения и повысить производительность при отправке запросов. Для этого можно скопировать атрибуты одного элемента в другой, который к нему относится, чтобы избежать получения данных о двух элементах при отправке запроса.
Но в некоторых случаях денормализация может усложнить модель данных. Например, когда модель данных содержит сущность Friendship, относящуюся одновременно к отслеживаемому пользователю и к пользователю, являющемуся подписчиком. Можно скопировать все атрибуты каждой сущности User в сущность Friendship при создании сущности Friendship. Затем при извлечении сущности Friendship будут также получены все сведения об обоих пользователях.
Это может создать проблему, когда пользователь захочет изменить информацию в своем профиле. Например, если пользователь изменит изображение своего профиля, данные в каждой сущности Friendship, содержащей имя этого пользователя, устареют. Потребуется обновлять каждую сущность Friendship, в которой содержалось имя пользователя, при каждом изменении данных.
В приведенных ниже шагах будет продемонстрировано, как использовать частичную нормализацию и вызов API BatchGetItem для урегулирования этой ситуации.
Время, необходимое для прохождения модуля: 20 минут