#amazon-web-services #amazon-dynamodb #dynamodb-queries #aws-dynamodb
#amazon-веб-сервисы #amazon-dynamodb #dynamodb-запросы #aws-dynamodb
Вопрос:
Я пытаюсь запросить DynamoDB и получить результат, аналогичный select distinct(address) from ...
SQL.
Я знаю, что DynamoDB-это база данных, ориентированная на документы, и, возможно, мне нужно изменить структуру данных.
Я пытаюсь избежать получения всех данных сначала и последующей фильтрации.
Мои данные выглядят так:
Атрибут | Тип данных |
---|---|
ID | Строка |
Var1 | Карта |
ВарН | Карта |
Адрес | Строка |
Поэтому я хочу получить отдельные адреса во всей таблице.
Как это лучше всего сделать?
Комментарии:
1. Если вам будет очень нужен этот запрос, возможно, вам захочется ввести дополнительный адрес таблицы, содержащий (уникальный) Адрес, идентификатор и количество. Настройте потоки DynamoDB в исходной таблице и обновите таблицу количества адресов, используя лямбда-функцию для атомарной вставки, увеличения/уменьшения количества, удаления при вставке/изменении/удалении элементов в исходной таблице. Затем простое сканирование этой таблицы даст вам, как минимум, уникальные адреса.
2. Я буду выполнять запрос раз в неделю, может быть, два. Я думаю, что это не так уж много, но количество адресов увеличивается с каждым днем. Поэтому я рассматриваю ваш подход, спасибо
Ответ №1:
К сожалению, нет. Вам понадобится Scan
вся таблица (вы можете использовать параметры ProjectionExpression
или AttributesToGet
, чтобы запросить только атрибут «Адрес», но в любом случае вы заплатите за сканирование всего содержимого таблицы).
Если вам нужно часто выполнять это сканирование, вы можете добавить вторичный индекс, который отображает только ключи и атрибут «Адрес», чтобы упростить сканирование. Но, к сожалению, с помощью которого ГСИ ключ раздела-это «адрес» не даст вам возможность исключить повторы: каждый раздел содержит список повторяющихся элементов, и, к сожалению, нет никакого способа, чтобы просто перечисление разных раздела ключи в индексе — Scan
ную индекс даст вам тот же раздел клавишу несколько раз, поскольку многие предметы в этом разделе.
Комментарии:
1. Я боялся это подтвердить. Вы подали мне идею добавить второй индекс, чтобы снизить затраты. Другой способ, я думаю, это создать новую таблицу, но затраты на разработку вторичного процесса для вставки / вставки и обслуживания вторичной таблицы этого не стоят. Спасибо за вашу помощь
2. Если вы хотите сохранить вторую таблицу, просто не забудьте обработать случай удаления элемента — вы не можете просто удалить адрес из второй таблицы, потому что он может быть использован другим элементом. Одна вещь, которую вы можете сделать, чтобы решить эту проблему, — это сохранить атрибут «количество ссылок» для каждого адреса во второй таблице, уменьшить его вместо удаления адреса и при сканировании второй таблицы отфильтровать адрес с количеством ссылок 0. Все это легко сделать в DynamoDB, но на самом деле не безопасно для параллелизма, потому что задействованы две разные таблицы: — (