Как выполнить отложенную загрузку или ускоренную загрузку с помощью dynamodb

#amazon-web-services #amazon-dynamodb

#amazon-веб-сервисы #amazon-dynamodb

Вопрос:

Я создаю бессерверный проект в aws. Я новичок в dynamodb и хотел бы создать 2 таблицы, публикации и лайки.

 PostsDynamoDBTable:
      Type: 'AWS::DynamoDB::Table'
      Properties:
        AttributeDefinitions:
          - AttributeName: userId
            AttributeType: S
          - AttributeName: postId
            AttributeType: S
          - AttributeName: createdAt
            AttributeType: S
        KeySchema:
          - AttributeName: postId
            KeyType: HASH
          - AttributeName: userId
            KeyType: RANGE
        BillingMode: PAY_PER_REQUEST
        TableName: ${self:provider.environment.POSTS_TABLE}
        GlobalSecondaryIndexes:
          - IndexName: ${self:provider.environment.USER_ID_INDEX}
            KeySchema:
              - AttributeName: userId
                KeyType: HASH
              - AttributeName: createdAt
                KeyType: RANGE
            Projection:
              ProjectionType: ALL

LikesDynamoDBTable:
          Type: 'AWS::DynamoDB::Table'
          Properties:
            AttributeDefinitions:
              - AttributeName: userId
                AttributeType: S
              - AttributeName: postId
                AttributeType: S
              - AttributeName: likeId
                AttributeType: S
              - AttributeName: createdAt
                AttributeType: S
            KeySchema:
              - AttributeName: likeId
                KeyType: HASH
              - AttributeName: postId
                KeyType: RANGE
            BillingMode: PAY_PER_REQUEST
            TableName: ${self:provider.environment.LIKES_TABLE}
            GlobalSecondaryIndexes:
              - IndexName: ${self:provider.environment.USER_ID_INDEX}
                KeySchema:
                  - AttributeName: userId
                    KeyType: HASH
                  - AttributeName: createdAt
                    KeyType: RANGE
                Projection:
                  ProjectionType: ALL
  

Мне интересно, как я могу запрашивать / сканировать сообщения, чтобы получать все сообщения с лайками, которые также связаны с ними?

    await this.docClient
    . scan({
      TableName: this.postsTable,
    })
    .promise()
  

Ответ №1:

DynamoDB — это совершенно иная парадигма, чем базы данных SQL. Хранение сообщений и лайков в их собственных таблицах является распространенным шаблоном в базах данных SQL, потому что у вас есть join операция SQL. У вас нет join операции в DDB, поэтому вы не продвинетесь далеко в построении своих таблиц таким образом.

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

Я бы рекомендовал уделить время просмотру этого доклада о моделировании данных в DynamoDB. Этот доклад — одно из лучших введений в моделирование даты DDB, которое я видел.