#amazon-web-services #database-design #nosql #amazon-dynamodb #dynamodb-queries
#amazon-web-services #database-design #nosql #amazon-dynamodb #dynamodb-запросы
Вопрос:
Я новичок в DynamoDB и пытаюсь смоделировать / индексировать единый дизайн таблицы для отслеживания одного числового значения, но с отдельными записями обновления для каждого изменения числа. Каждый раз, когда обновляется числовое значение, запись обновления должна сохраняться в таблице (как отдельный элемент, а не как свойство отдельного элемента «отслеживаемый номер»), и, конечно, значение отслеживаемого номера также должно обновляться. Я хочу иметь возможность запрашивать и сортировать записи обновлений по дате и значению изменения номера. И, конечно, я хочу иметь возможность просматривать текущее числовое значение.
Каков хороший дизайн единой таблицы для этого шаблона данных и доступа? Я пробовал несколько разных способов, но оказался заблокированным, потому что либо не удается получить / записать в глобальный вторичный индекс, либо всегда возвращать элемент с текущим числовым значением при попытке запросить только сами записи обновления. Я мог бы очень легко создать отдельные таблицы для отслеживаемых номеров и обновлений номеров, но это, похоже, противоречит принципам DynamoDB.
Ответ №1:
Вы можете создать таблицу с двумя типами записей:
- Текущая сумма с идентификатором значения в качестве ключа раздела, литеральной строкой
CURRENT_AMOUNT
в качестве ключа сортировки и атрибутомcurrent_amount
, который содержит фактическое значение. - Запись обновления с идентификатором значения (таким же, как в 1.) в качестве ключа раздела, меткой времени в качестве ключа сортировки и двумя атрибутами
new_amount
иold_amount
для представления измененных значений.
Таким образом, вы можете получить:
- Текущая сумма элемента:
pk={{ID}} AND sk="CURRENT_AMOUNT"
- История элемента:
pk={{ID}} AND sk <> "CURRENT_AMOUNT"
- Одновременно отображается как текущая сумма, так и история элемента:
pk={{ID}}
Дополнительные шаблоны доступа потенциально могут быть удовлетворены с помощью вторичных индексов.
Вот пример того, как может выглядеть таблица с некоторыми записями:
-----------------------------------------------------------------------
| pk | sk | current_amount | new_amount | old_amount |
-----------------------------------------------------------------------
| ID1 | "CURRENT_AMOUNT" | 7 |-------------------------|
| | 2020-12-19T14:01:42Z |----------------| 7 | 5 |
| | 2020-12-17T19:07:32Z |----------------| 5 | 9 |
-----------------------------------------------------------------------|
| ID2 | "CURRENT_AMOUNT" | 3 |-------------------------|
| | 2020-12-19T08:01:12Z |----------------| 3 | 7 |
-----------------------------------------------------------------------