Дизайн таблицы в DynamoDB - PullRequest
       88

Дизайн таблицы в DynamoDB

1 голос
/ 24 апреля 2020

Я новичок в No SQL DB и без сервера. В моем приложении есть таблица с именем Trips. Параметры таблиц: {id, route, cost, selling, type, date, LR, asset } и куча других не относящихся к делу номеров документов, где идентификатор генерируется с помощью uuid.

Теперь я хочу запросить базу данных для получения

  1. Возврат всех поездок в диапазоне дат с использованием параметра даты.
  2. Возврат всех поездок для актива за данный период времени с использованием параметра даты и актива.
  3. Возврат всех поездок для маршрута в заданный промежуток времени, используя параметр маршрута даты.

2 и 3 работают нормально, используя keyConditionExpression, но для 1 мне нужно использовать filterExpression для сканирования вместо запроса, который может сделать его относительно медленным, так как он выполняется после завершения запроса. Есть ли лучший способ сформировать схему?

В таблице Trips схема как таковая

 tripTable:
  Type: "AWS::DynamoDB::Table"
  Properties:
    AttributeDefinitions:
      [
        { "AttributeName": "id", "AttributeType": "S" },
        { "AttributeName": "date", "AttributeType": "S" },
        { "AttributeName": "Asset", "AttributeType": "S" },
        { "AttributeName": "Route", "AttributeType": "S" },
      ]

    KeySchema:
      [
        { "AttributeName": "date", "KeyType": "HASH" },
        { "AttributeName": "id", "KeyType": "RANGE" },
      ]
    ProvisionedThroughput:
      ReadCapacityUnits: 5
      WriteCapacityUnits: 5
    StreamSpecification:
      StreamViewType: "NEW_AND_OLD_IMAGES"
    TableName: ${self:provider.environment.TRIPS}
    GlobalSecondaryIndexes:
      - IndexName: TripsVSAssets
        KeySchema:
          - AttributeName: asset
            KeyType: HASH
          - AttributeName: date
            KeyType: RANGE
        Projection:
          ProjectionType: ALL
        ProvisionedThroughput:
          ReadCapacityUnits: "5"
          WriteCapacityUnits: "5"
        GlobalSecondaryIndexes:
      - IndexName: RoutesVSAssets
        KeySchema:
          - AttributeName: route
            KeyType: HASH
          - AttributeName: date
            KeyType: RANGE
        Projection:
          ProjectionType: ALL
        ProvisionedThroughput:
          ReadCapacityUnits: "5"
          WriteCapacityUnits: "5"

1 Ответ

0 голосов
/ 24 апреля 2020

Вам нужен еще один столбец индекса, где ключом раздела (тип Ha sh) будет случайное число, скажем, от 0 до 20. И ключом сортировки (типом диапазона) снова введите туда дату.

Таким образом, для запроса всех отключений между определенным временем вам нужно будет выполнить 20 запросов параллельно с ключом раздела в качестве каждого числа от 0 до 20 и ключом сортировки в качестве временного диапазона.

https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-modeling-nosql-B.html

Проверьте приведенное выше руководство, go к таблице в конце страницы и проверьте 5-ую запись

enter image description here

Если вы выполните сканирование здесь, то DynamoDB будет взимать плату за каждый ключ раздела. В вышеупомянутой технике параллельных запросов с вас будет взиматься плата только за N запросов (20 в вышеупомянутом случае).

...