Получить все столбцы из базы данных Dynamo на основе индекса GSI и ключа диапазона

у меня есть только две проекции, определенные на уровне индекса Dynamo db GSI. но для создания ожидаемого ответа мне нужно получить и другие столбцы из Dynamo db.

Допустим, в моей таблице 20 столбцов, и только два из них упомянуты в глобальном вторичном индексе. Как я могу добиться этого с помощью GSI и загрузки данных из главной таблицы.

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

    public List<DynamoDBObject> getData(String gsiHashKey) {


        DynamoDBObject dynamoDBObject= new DynamoDBObject();

        command.setgsiHashKey(gsiHashKey);

     final DynamoDBQueryExpression<DynamoDBObject> queryExpression = 
new DynamoDBQueryExpression<>();

  queryExpression.setIndexName("gsi_index_name");

      queryExpression.setHashKeyValues(dynamoDBObject);
return mapper.query(DynamoDBObject.class,queryExpression)
}

Пожалуйста, предложите лучший способ добиться этого.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
1 580
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как вы заметили, в GSI, если вы решили не проецировать все столбцы базовой таблицы в индексную таблицу, эти другие столбцы будут недоступны при запросе индекса. Причина этого не в лени разработчиков, а в эффективности: в GSI индексная таблица распределяется по всему кластеру DynamoDB иначе, чем базовая таблица, поэтому при чтении данных индексной таблицы нет способа эффективный также прочитать из базовой таблицы одновременно. Кстати, именно этим LSI отличается от GSI — в LSI индексная и базовая таблицы расположены вместе и могут читаться вместе, поэтому DynamoDB дает вам возможность запрашивать также непроецируемые столбцы.

Так что я думаю, что у вас осталось два варианта. Один из них — использовать запрос BatchGetItem для чтения данных базовой таблицы после чтения данных индекса. Обратите внимание, что при запросе к индексу вы всегда можете получить атрибуты ключа базовой таблицы, поэтому вы можете использовать их для чтения полных элементов из базовой таблицы. BatchGetItem, вероятно, является наиболее эффективным способом чтения, вместо извлечения элементов по одному с помощью GetItem.

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

Спасибо. Я попробую запрос BatchGetItem. Но еще один запрос относительно того же, поскольку у меня есть только один столбец проекции в GSI, т.е. скажем, идентификатор заказа, но это не хэш-ключ в базовой таблице. Я не уверен, будет ли работать операция получения базовой таблицы динамо БД, потому что я не есть хэш базовой таблицы или ключ диапазона для извлечения записи. Я правильно понимаю?

divyanayan awasthi 09.07.2019 13:40

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

Nadav Har'El 09.07.2019 13:45

Что вы имеете в виду, что это работает для LSI, а не для GSI? Я только что проверил, создал таблицу с хэш-ключом "p" и вторичным индексом Глобальный с хэш-ключом "x" и проекцией "ProjectionType: 'INCLUDE', NonKeyAttributes: ['a', 'b']", и, конечно же, это в индексе были не только атрибуты a и b, там были и p, и x. А так как, в частности, есть «p», я могу теперь читать элементы из исходной таблицы.

Nadav Har'El 09.07.2019 15:02

то, что вы говорите, правильно ... но для меня есть и другие столбцы, а ПРОЕКЦИОННЫЙ УРОВЕНЬ - это только ключи. Итак, скажем, у меня есть хэш-ключ базовой таблицы "p" и столбцы "a", "b", " c". затем, если я запрошу GSI, то есть x, я также должен получить p, но получу ли я и другие столбцы. иначе я думаю, как вы предложили, мне нужно снова запросить базовую таблицу.

divyanayan awasthi 09.07.2019 16:19

Да, пожалуйста, перечитайте мой ответ. Запрос GSI будет включать p, но не "a", "b" или "c". Если они вам нужны, вам нужно либо спроецировать их в GSI (с проекцией ВСЕХ или ВКЛЮЧИТЬ эти конкретные атрибуты), либо, если вы не хотите этого делать, вам также нужно прочитать из базовой таблицы (я дал несколько советов как).

Nadav Har'El 09.07.2019 16:32

Другие вопросы по теме