gpt4 book ai didi

amazon-web-services - 如何操作 AWS AppSync 和 GraphQL 以符合 DynamoDB 最佳实践?

转载 作者:行者123 更新时间:2023-12-04 08:09:43 27 4
gpt4 key购买 nike

DynamoDB 在每个应用程序使用单个表 ( https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-general-nosql-design.html ) 时运行最佳,但 AppSync 默认通过从 GraphQL 架构自动生成代码的方式打破了该规则(AWS 建议用户允许 API 这样做)。因此,要在坚持 DynamoDB 的最佳实践的同时将 AppSync 与 GraphQL 结合使用(假设 DynamoDB 是 GraphQL API 的唯一数据源),这种方法是否可行?

首先,创建一个空白的 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 无法实现单表效率?

最佳答案

我不确定这个说法是不是真的

DynamoDB operates best with a single table per application



你介意分享你在哪里看到的吗?
如果表架构是基于应用程序访问模式构建的,那么 DynamoDB 确实效果最好。这并不一定意味着您必须将所有内容都放在一张 table 上。

关于amazon-web-services - 如何操作 AWS AppSync 和 GraphQL 以符合 DynamoDB 最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54261482/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com