Каков рекомендуемый способ создания таблицы статистики в DynamoDB? - PullRequest
0 голосов
/ 06 марта 2019

Я хотел бы сохранить следующие атрибуты данных в DynamoDB в качестве статистики:

deviceId, property, value, timestamp

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

При получении я бы хотел запросить вышеупомянутую таблицу:

  • получить все value и timestamp для заданных deviceId и property.
  • получить все property, value и timestamp для данного deviceId

Мне нужно часто получать эту статистику.

deviceId уникален.

Как мне создать мою схему?Что нужно учитывать?DynamoDB лучше для этого?

Ответы [ 2 ]

1 голос
/ 06 марта 2019

DynamoDB - хороший выбор для хранения большого количества данных, которые вы не знаете, как их хранить. но не оптимально, когда мы говорим о действительно больших таблицах, отношения которых как в реляционных базах данных.

Первый вопрос, который вы должны задать себе, знаете ли вы все возможные свойства? или может быть как 10+ уникальных свойств на устройство?

Вы можете сделать две таблицы:

  • устройств: с идентификатором (номером) первичного ключа раздела и атрибутом (не являющимся частью предварительно определенной схемы), представляющим собой список строк, представляющий все свойства устройства. , каждый запрос должен начинаться с запроса этой таблицы, но результаты должны быть получены очень быстро, и цена хранения и возможность пропустить запросы сканирования должны быть достаточными.

  • значения: с первичным ключом раздела, который является объединением идентификатора устройства и свойства. и сортировка ключа метки времени. значение должно быть атрибутом.

вы также можете сделать это объединение числовым, а затем вы можете запросить с помощью оператора between, если вы хотите ускорить процесс и сэкономить на хранении.

Это решение может быть намного дешевле, чем ответ Мэтью, но гораздо менее читабельно для человека и, возможно, сложнее для отладки и реализации. Поэтому я рекомендую вам рассмотреть оба варианта с умом.

Кроме того, недавно Amazon выпустила свою DocumentDB. У меня нет опыта работы с этим продуктом, но из моего опыта работы с документно-ориентированными базами данных, это может быть хорошим вариантом, который вы должны проверить. Общая идея должна быть с ключом для каждого устройства, которое содержит вложенные коллекции (я думаю, это называется встроенные или вложенные документы) свойств. чем если вам нужны все свойства, вы можете запросить все вложенные коллекции ключа, и если вам нужно определенное свойство, вы можете запросить вложенную коллекцию. но опять же, у меня нет опыта работы с DocumentDB. Но опять же, это новый продукт, и у меня нет особого опыта, я просто указываю, что он существует.

1 голос
/ 06 марта 2019

Я не могу ответить, является ли DynamoDB лучшим для этого или нет.

Однако вы можете легко спроектировать таблицу для поддержки этих запросов.Вы можете использовать deviceId в качестве ключа хеша и составной ключ свойства + метка времени в качестве ключа диапазона.

Чтобы получить все свойство, метку времени и значения для идентификатора устройства, выражение условия ключа запроса будет иметь вид

deviceId = :deviceId

Чтобы получить все метки времени и значения для идентификатора устройства и свойства, онобудет

deviceId = :deviceId AND begins_with(prop_timestamp, :propertyName)

Если вы действительно обеспокоены пространством и уверены, что другие запросы вам не понадобятся, вы можете выбрать только три атрибута, например

 deviceId | prop_timestamp             | value
--------------------------------------------------------
 38b518f5 | speed_2019-03-05T12:15:00Z | 25.3 m/s
 38b518f5 |  temp_2019-03-05T12:30:00Z | 65°F

Если вы не уверены на 100%, что вам не понадобятся никакие другие запросы, я бы рекомендовал включить propertyName и timestamp в качестве собственных атрибутов верхнего уровня в дополнение к тому, чтобы быть частью составного ключа диапазона.

...