У меня есть таблица dynamoDB, где хранятся события датчиков.
HASH KEY: идентификатор датчика
КНОПКА ДИАПАЗОНА: метка времени
информация о датчике
Теперь мне нужен запрос для последнего события каждого датчика.
Единственное решение, которое я могу придумать, - это запросить последнее событие для каждого идентификатора датчика. Но это было бы много запросов с датчиками 2000+. Я не хочу сканировать всю таблицу, чтобы потом разобраться с ней, поскольку таблица может расти довольно быстро.
Есть идеи?
Вы должны решить, что важно для вас, и разработать таблицу (таблицы) для соответствия вашим прецедентам.
Вы говорите, что хотите запросить последнее значение для каждого датчика и что имеются датчики 2000+. Что вы будете делать с этими 2000+ значениями? Как часто вам нужны эти значения и могут ли значения быть немного устаревшими?
Одним из решений было бы иметь две таблицы: одну, где вы добавляете исторические значения (данные временных рядов) и другую таблицу, в которой вы всегда обновляете последнее значение для каждого датчика. Когда вам нужны самые последние данные датчика, просто сканируйте эту вторую таблицу, чтобы получить все ваши датчики самые последние значения. Это так же эффективно, как и для чтения. Для записи это означает, что вы должны писать дважды для каждого обновления датчика.
Другим потенциальным решением было бы записать ваши временные ряды, разделенные по времени, в отличие от идентификаторов датчиков. Предполагая, что все датчики обновляются в каждый момент времени, с помощью одного запроса вы можете получить значение всех датчиков. Это работает, но только если вы обновляете значения всех датчиков каждый раз, и только если вы делаете это с обычной каденцией.
Однако, если вы сразу обновите все датчики, то дальнейшая оптимизация может быть достигнута путем объединения нескольких показаний датчика в один элемент, поэтому требуется меньше записей для обновления всего 2000 из них.
Поскольку у вас определен параметр range_key
вы можете получить последний элемент с помощью Query(hash_key=HASH_KEY, ScanIndexForward=True, limit=1)