【发布时间】:2020-09-07 02:30:15
【问题描述】:
我将 GraphQL 和 DynamoDB 与邻接列表模式一起使用,因为我只使用一个表。
假设我有架构 -
type GrandParent {
id: ID!
children: [Parent]
}
type Parent {
id: ID!
children: [Child]
}
type Child {
id: ID!
}
type Query {
getGrandParent(id: ID): GrandParent
}
对于 dynamodb,我有以下主键结构 -
为祖父母
pk = GRANDPARENT_<id>, sk = GRANDPARENT
为家长
pk = PARENT_<ID>, sk = GRANDPARENT_<id>
为孩子
pk = CHILD_<id>, sk = PARENT_<id>
使用将反转密钥的 GSI。
所以,给定一个祖父母 ID,我可以使用 GSI 找到所有父母,因为我知道祖父母 ID,所以我可以这样做 - where sk = GRANDPARENT_<id> and pk begins with PARENT_ID 这将把我带回所有父母,但是我怎么能得到这些父母的ID,现在去获取所有的孩子记录吗?是否可以在一个 graphql 请求中多次访问数据库?
【问题讨论】:
-
更好地使用Amazon Neptune 来建立关系。 Neptune 是一个图形数据库,而 DynamoDB 是一个键值数据库。
-
我明白你为什么要考虑使用图表。虽然这是我在现有应用程序上遇到的一个一次性问题,但不幸的是我无法更改数据库
-
如果我正确理解了您的问题,您可以附加一个带有 Parent 类型子代的解析器,并编写一个查询来获取 id = ctx.source.id (即父 ID)的子代。所以这样一来,就只有一个请求有多个DB事务了。
-
一个查询没问题(graphql的基本特性)
...getGrandParent(id: $id) { id children { id children { id ......问题是每个级别解析器中没有太多的db请求来返回所有数据...github.com/graphql/dataloader
标签: graphql amazon-dynamodb aws-appsync