Дизайн схемы DynamoDB для поддержки поиска по идентификатору и отметке времени элемента? - PullRequest
0 голосов
/ 11 апреля 2019

Мне нужно разработать схему DynamoDB для хранения элементов, атрибуты которых:

  • tid: строка UUID , которая является уникальным идентификатором элемента
  • timestamp: строка в формате ISO-8601 , представляющая дату и время, относящиеся к элементу
  • Прочие вещи ...

и для следующего запроса (действительно нужно избегать необходимости выполнять какие-либо проверки ) шаблонов:

  • Запрос по tid
  • Запрос по точному timestamp и по выражениям реляционного порядка (например, <=, BETWEEN и т. Д.) На timestamp. То есть, запросить все элементы из определенного диапазона времени и даты без , заранее зная их tid.

Возможно ли это эффективно сделать в DynamoDB, или, может быть, есть другое решение AWS, которое будет мне лучше?

1 Ответ

0 голосов
/ 12 апреля 2019

С учетом таблицы DynamoDB:

  • ключ раздела: tid, тип строки
  • ключ сортировки: timestamp, тип строки

Вы можете запросить:

  • tid = 5
  • tid = 5, отметка времени между 2018-12-21T09: 00: 00Z и 2018-12-21T15: 00: 00Z

Попробуйте использовать awscli , например, чтобы запросить все элементы с помощью tid=5:

aws dynamodb query \
    --table-name mytable \
    --key-condition-expression "tid = :tid" \
    --expression-attribute-values '{":tid":{"S":"5"}}'

Чтобы запросить все элементы для tid=5и timestamp between 09:00 and 15:00 on 2015-12-21:

aws dynamodb query \
    --table-name mytable \
    --key-condition-expression "tid = :tid AND #ts BETWEEN :ts1 AND :ts2" \
    --expression-attribute-values  '{":tid":{"S":"5"}, ":ts1":{"S":"2015-12-21T09:00:00Z"}, ":ts2":{"S":"2015-12-21T15:00:00Z"}}' \
    --expression-attribute-names '{"#ts":"timestamp"}'

Примечание: поскольку timestamp является зарезервированным ключевым словом в DynamoDB, вы должны экранировать его, используя имена атрибутов выражения.

Вы также можете создать атрибут timestamp как число, а затем сохранить время эпохи, если хотите.

Запросить все элементы с timestamp between 09:00 and 15:00 on 2015-12-21, независимо от tid, нельзя в одном разделе/ сортировать схему ключей.Вам необходимо добавить Глобальный вторичный индекс примерно так:

  • Ключ раздела GSI: yyyymmdd, введите строку
  • Ключ сортировки GSI: timestamp, введите string

Теперь вы можете запрашивать элементы с заданным диапазоном временных отметок, если они находятся в один и тот же день (у них один и тот же YYYYMMDD, что может быть разумным ограничением).Или вы можете перейти к YYYYMM в качестве ключа разделения, позволяющего более широкий диапазон временных отметок.На этом этапе вам действительно необходимо понять варианты использования запросов, чтобы решить, является ли ГГГГММДД (ограничение запросов одним днем) правильным.См. Как запросить DynamoDB по дате без очевидного хеш-ключа , чтобы узнать больше об этой идее.

...