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