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 это не приведет к повышению эффективности работы за одним столом?