Да, это возможно, но вам нужно принять во внимание каждый шаблон доступа, который вы хотите поддерживать, при разработке своей таблицы.
Этот topi c обсуждался на re: Invent несколько раз. Вот видео за несколько лет go https://youtu.be/HaEPXoXVf2k?t=2102, но подобные разговоры проводились на topi c каждый год.
Два основных варианта: использование составных клавиш или фильтры запросов.
Составные ключи очень эффективны и сводятся к созданию новых ключей syntheti c, которые просто объединяют другие поля, которые у вас есть в вашей записи, а затем используют их в вашем GSI.
Например, если у вас есть клиент, которому вы хотите получить все открытые счета-фактуры, но при этом хотите получить отдельный счет, вы можете использовать clientId в качестве ключа раздела и объединить invoiceStatus и invoiceId вместе как ключ сортировки. Затем вы можете использовать begin_with, чтобы возвращать только определенный статус счета. В этом примере вы должны знать invoiceStatus и invoiceId, что делает его не лучшим примером.
Шаблон составного ключа также полезен для дат, поскольку вы можете использовать больше или меньше, чем для поиска в определенных временные диапазоны. Однако также можно напрямую получить записи с помощью конкатенации.
Альтернативный вариант - использование фильтров запросов. Это менее эффективно, поскольку DynamoDB придется сканировать каждую запись, которая соответствует разделу и ключу сортировки. Однако фильтр можно применить к любому атрибуту и уменьшить объем данных, передаваемых из DynamoDB в ваше приложение. Это полезно, когда ваши основные ключи в основном избирательны, но возможны множественные совпадения, и фильтр поможет вам до конца.
Другой аспект использования GSI, который может помочь снизить затраты, - это проецирование только атрибуты, которые вам небезразличны. Когда запись обновляется, GSI обновляется только в том случае, если обновляется один из прогнозируемых атрибутов. Удерживая GSI тонким, он делает ранее перечисленные стратегии более экономичными.