DynamoDB верхний элемент на раздел - PullRequest
0 голосов
/ 31 декабря 2018

Мы новички в DynamoDB и боремся с тем, что кажется, что это будет простая задача.

На самом деле это не связано с запасами (речь идет о записи результатов станка с течением времени), но пример со склада является самым простымЯ могу подумать, что это иллюстрирует цель и проблемы, с которыми мы сталкиваемся.

Два сценария запроса:

  • Все исторические значения данного биржевого символа <= Мы думаем, что у нас есть этовыяснил </li>
  • последнее значение всех биржевых символов <= У нас нет хорошего решения здесь! </li>

Предположим, что обновления не синхронизированы, например,Момент последнего обновления записи для TSLA может отличаться от момента для AMZN.

3 атрибута - это просто {Символ, Момент, Значение}.Мы могли бы создать символ hash_key, range_key Moment и полагать, что могли бы легко / эффективно выполнить первый запрос.

Мы также предполагаем, что можем получить последнее значение для одного указанного символа после https://stackoverflow.com/a/12008398

Решение SQL для получения последнего значения для каждого символа будет выглядеть примерно так: https://stackoverflow.com/a/6841644

Но ... мы не можем придумать ничего эффективного для DynamoDB.

Можно ли сделать это, не извлекая все или не совершая многократных циклов?

Наилучшая идея, которую мы пока имеем, состоит в том, чтобы каким-то образом использовать триггеры обновления или потоки для отслеживания последней записи по символуи, по сути, держать это в кэше.Это может быть в отдельной таблице или в той же таблице с дополнительной информацией, такой как столбец IsLatestForMachineKey (фактически, bool).При каждой вставке вы должны получить тот, где IsLatestForMachineKey = 1, сравнить момент и, если вставка новее, установить новую равную 1, а более старую - 0.

Это начинает казаться сложнымДостаточно того, что я задаюсь вопросом, правильно ли мы применяем подход, или, может быть, сама DynamoDB плохо подходит для этого, хотя сценарий использования кажется таким простым и распространенным.

1 Ответ

0 голосов
/ 30 января 2019

Есть способ, который довольно прост, на мой взгляд.

Вместо того, чтобы использовать GSI, просто используйте две таблицы с (почти) одинаковой схемой.Ключ хеша обоих должен быть symbol.Они оба должны иметь moment и value.Выберите одну из таблиц, равную stocks-current, а другую - stocks-historical.stocks-current не имеет ключа диапазона.stocks-historical использует moment в качестве клавиши диапазона.

Всякий раз, когда вы пишете элемент, запишите его в обе таблицы.Если вам нужна строгая согласованность между двумя таблицами, используйте API TransactWriteItems.

Если ваши данные могут поступить не по порядку, вы можете добавить выражение ConditionExpression, чтобы предотвратить перезапись более новых данных в stocks-current данными, вышедшими из строя.

Операции чтения довольно просты, но я все равно их изложу.Чтобы получить последнее значение для всего, отсканируйте таблицу stocks-current.Чтобы получить исторические данные для акции, запросите таблицу stocks-historical без условия ключа диапазона.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...