Получить все столбцы из динамо-базы данных на основе индекса GSI и ключа диапазона - PullRequest
1 голос
/ 09 июля 2019

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

Допустим, в моей таблице 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)
}

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

1 Ответ

1 голос
/ 09 июля 2019

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

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

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

...