Я пытаюсь создать таблицу DynamoDb, поддерживающую эти 3 шаблона доступа:
- Список доступа учреждений в радиусе XX от указанного почтового индекса.
- Список доступа учрежденийв радиусе XX от указанного почтового индекса для данного уровня образования (4 года, 2 года, старшая школа и т. д.).
- Доступ к списку учреждений в радиусе XX от указанного почтового индекса для данной работыкод и уровень образования.
Ключ раздела генерируется как часть Geo Library для DynamoDb ( AWS Geo Library) . Таким образом, в основном, я группирую учреждения по географическому местоположению, поддерживая возможность поиска учреждений в радиусе XX от предоставленного почтового индекса (с использованием широты / долготы почтового индекса).
Ниже приведен мой шаблон CloudFormation для моегоТаблица DynamoDb:
dynamoDbInstitutions:
Type: AWS::DynamoDB::Table
Properties:
TableName: institutions
AttributeDefinitions:
- AttributeName: hashKey
AttributeType: N
- AttributeName: rangeKey
AttributeType: S
- AttributeName: geohash
AttributeType: N
KeySchema:
- AttributeName: hashKey
KeyType: HASH
- AttributeName: rangeKey
KeyType: RANGE
ProvisionedThroughput:
ReadCapacityUnits: 50
WriteCapacityUnits: 2
LocalSecondaryIndexes:
- IndexName: geohash-index
KeySchema:
- AttributeName: hashKey
KeyType: HASH
- AttributeName: geohash
KeyType: RANGE
Projection:
ProjectionType: ALL
Вот пример данных в моей таблице:
- 176008 представляет учреждение.
- 2 представляет уровень образования (4-летнее учебное заведение).
- 11-1011.00 представляет код задания
Значение Hashkey 966762 - это первые 6 цифр из значения GeoHash. Это позволяет мне группировать учреждения по близости. Это позволяет мне искать учреждения в радиусе. У меня есть локальный вторичный индекс (LSI) с использованием Hashkey и GeoHash. Мой запрос использует LSI для поиска учреждений в радиусе.
Я также хочу иметь возможность дополнительно фильтровать учреждения в радиусе с помощью следующих схем доступа:
- уровень образования . Пример: 2 _ *
- код работы и уровень образования . Пример: 11-1011.00_2 _ *
Я наткнулся на стену, где DynamoDb позволяет выполнять запросы только на основе двух ключевых условий. Для выполнения гео-запросов (в радиусе) я должен использовать хеш-ключ и LSI (используя геохэш). Я не могу продолжать фильтрацию, используя мой ключ диапазона, который моделирует отношения, которые есть у учреждения с уровнем образования и кодами работы.
Как использовать DynamoDb для фильтрации по радиусу И , используя связанныеданные, такие как уровень образования и / или код работы?