У меня есть набор данных из миллионов строк, которые я хочу сохранить в DynamoDB.
Набор данных имеет 3 столбца, и первые два столбца вместе уникальны, как показано ниже:
C1 C2 C3
A 1 15
B 1 20
C 1 5
A 2 17
B 2 10
A 5 5
B 5 25
C 5 5
C 6 5
Запросы Я хочу использовать эти данные следующим образом:
Для C1 = A
, для C2 >= 2
получить максимальное значение C3
.
Ожидаемый результат: 17
Для C1 = A
получите значения C2
и C3
с сортировкой C2
.
Ожидаемый результат: [[1,15],[2,17],[5,5]]
Этот запрос будет выполняться очень часто, поскольку элементы в БД часто меняются , Поэтому сканирование или фильтрация во время запроса не являются опцией.
То, что я пробовал:
Я установил C1 в качестве первичного ключа, C2 в качестве ключа сортировки, чтобы я мог достичь 2-й запрос.
Мне нужно как-то сохранить максимальное значение C3, чтобы я мог получить его без сканирования. Поскольку я не могу установить и C2, и C3 в качестве ключа сортировки (диапазона), я создал локальный вторичный индекс с ключом сортировки C3. Благодаря этому я мог сохранить C3 отсортированным, но это было бы независимо от C2. Это требует от меня сканирования C2, чтобы найти значение C2, которое больше, чем мой параметр в запросе.
Я создал разреженный глобальный вторичный индекс, чтобы обозначить значение строки, имеющей самое высокое значение. И я обновил этот столбец по мере добавления новых элементов. Тем не менее, этот подход ограничивает меня в предположении значения C2, с которым я хочу запросить >=
для этого индекса.
Я думал о слиянии двух столбцов в один, поскольку предлагал похожие проблемы. Но оба столбца являются скалярными, и я не делаю операции равенства ни для одного из этих столбцов. Следовательно, я не мог объединить два скалярных столбца.
Возможно, я что-то пропустил в своих испытаниях. Или я могу создать больше таблиц, если это необходимо. Я знаю, что это длинный вопрос, спасибо за любую помощь заранее.