Запрос DynamoDB на логический ключ

Я новичок в DynamoDB (и вообще в noSQL), и немного борюсь за то, чтобы окунуться в некоторые из концепций. Одна вещь, в частности, дает мне некоторые проблемы, связанные с запросом таблицы на основе логического ключа.

Я понимаю, что я не могу создать первичный или вторичный индекс для логического ключа, но я не вижу, как я должен идеально индексировать и запрашивать таблицу со следующей структурой:

reportId: string (uuid)
reportText: string
isActive: boolean
category: string

Я хотел бы иметь возможность выполнить следующие поисковые запросы:

  • Доступ к конкретному отчету напрямую (первичный хеш-индекс reportId)
  • Список отчетов определенной категории (первичный хеш-индекс на категория)

Это просто, но я хотел бы выполнить два других запроса:

  • Список всех отчетов, отмеченных как isActive = true
  • Список всех отчетов определенной категории, помеченных как isActive = true

Моим первым подходом было бы создать первичный индекс hashkey на isActive, с ключом range на category, но я могу выбрать String, Number of Boolean как тип ключа.

Сохранение isActive в виде строки (сохраняется как "истина", а не логическая истина) решает проблему, но ее ужасно использует строку для логического свойства.

Я что-то упустил? Есть ли простой способ запросить таблицу непосредственно по логическому значению?

Любые советы, должным образом оцененные.

Спасибо заранее.

Ответ 1

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

Table: reportId (string, hash key) || reportText (string) || isActive (string, marked as "x") || category (string)

ActiveReportsIndex (Local Secondary Index): reportID (hash key) || isActive (range key)

ActiveReportsByCategoryIndex (Global Secondary Index): category (hash key) || isActive (range key) || reportId

Идея разреженных индексов состоит в том, что в ваших индексах будут отображаться только сообщения, помеченные как isActive: "x", поэтому они должны требовать меньше хранения и обработки, чем ваша основная таблица. Вместо того, чтобы атрибут isActive представляет собой логический тип, который всегда будет хранить значение true или false, используйте строку типа "x" или что-то еще, что вы хотите, когда отчет активен, и DELETE атрибут полностью, когда отчет не активен. Имеет смысл?