Дизайн единой таблицы DynamoDB как для элемента «сумма», так и для отдельных элементов «запись обновления суммы»

#amazon-web-services #database-design #nosql #amazon-dynamodb #dynamodb-queries

#amazon-web-services #database-design #nosql #amazon-dynamodb #dynamodb-запросы

Вопрос:

Я новичок в DynamoDB и пытаюсь смоделировать / индексировать единый дизайн таблицы для отслеживания одного числового значения, но с отдельными записями обновления для каждого изменения числа. Каждый раз, когда обновляется числовое значение, запись обновления должна сохраняться в таблице (как отдельный элемент, а не как свойство отдельного элемента «отслеживаемый номер»), и, конечно, значение отслеживаемого номера также должно обновляться. Я хочу иметь возможность запрашивать и сортировать записи обновлений по дате и значению изменения номера. И, конечно, я хочу иметь возможность просматривать текущее числовое значение.

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

Ответ №1:

Вы можете создать таблицу с двумя типами записей:

  1. Текущая сумма с идентификатором значения в качестве ключа раздела, литеральной строкой CURRENT_AMOUNT в качестве ключа сортировки и атрибутом current_amount , который содержит фактическое значение.
  2. Запись обновления с идентификатором значения (таким же, как в 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          |
 -----------------------------------------------------------------------