Как манипулировать AWS AppSync и GraphQL, чтобы соответствовать рекомендациям DynamoDB? - PullRequest
0 голосов
/ 19 января 2019

DynamoDB лучше всего работает с одной таблицей на приложение (https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-general-nosql-design.html),, но AppSync по умолчанию нарушает это правило, так как он автоматически генерирует код из схемы GraphQL (что AWS рекомендует пользователям разрешить API). Поэтому, чтобы использовать AppSync с GraphQL, поддерживая при этом лучшие практики DynamoDB (при условии, что DynamoDB является единственным источником данных для API GraphQL), этот подход будет работать?

Сначала создайте пустую таблицу DynamoDB (TheTable в этом примере) и передайте ей ключ раздела (partitionKey) и ключ сортировки (sortKey).

Во-вторых, вручную принудительно установите каждый тип GraphQL для поддержки этой таблицы (TheTable). Именно здесь автоматическая генерация кода AppSync пойдет в другом направлении.

Схема GraphQL:

type Pineapple {
    partitionKey: String!
    sortKey: String!
    name: String!
}

# create varying types as long as they all map to the same table
type MachineGun {
    partitionKey: String!
    sortKey: String!
    name: String!
}

input CreatePineappleInput {
    partitionKey: String!
    sortKey: String!
    name: String!
}

type Mutation {
    createPineapple(input: CreatePineappleInput!): Pineapple
}

В-третьих, настройте собственные средства распознавания для обработки схемы (снова избегайте автоматически сгенерированного кода):

Резольвер:

{
    "version" : "2017-02-28",
    "operation" : "PutItem",
    "key" : {
        "partitionKey": $util.dynamodb.toDynamoDBJson($ctx.args.input.partitionKey),
        "sortKey": $util.dynamodb.toDynamoDBJson($ctx.args.input.sortKey),
    },
    "attributeValues" : $util.dynamodb.toMapValuesJson($ctx.args.input),
}

А когда мы запускаем мутацию в консоли AppSync:

Операция GraphQL:

mutation createPineapple($createPineappleInput: CreatePineappleInput!) {
  createPineapple(input: $createPineappleInput) {
    name
  }
}

{
  "createPineappleInput": {
    "partitionKey": "attraction123",
    "sortKey": "meta",
    "name": "Looking OK"
  }
}

Мы получаем результат, на который надеялись:

{
  "data": {
    "createPineapple": {
      "name": "Looking OK"
    }
  }
}

Есть ли причина, по которой при использовании AppSync это не приведет к повышению эффективности работы за одним столом?

1 Ответ

0 голосов
/ 19 января 2019

Я не уверен, что это утверждение верно

DynamoDB лучше всего работает с одной таблицей на приложение

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

...