要求是:
目前的架构是:
type Query {
movies (
first: Int
after: String
coordinates: CoordinatesInput!
date: String
): MovieConnection!
}
type Movie implements Node {
id: ID!
name: String!
venues (
first: Int
after: String
movieId: ID!
coordinates: CoordinatesInput!
date: String!
): VenueConnection!
}
type Venue {
id: ID!
name: String!
events (
date: String!
venueId: ID!
movieId: ID!
): EventConnection!
}
type Event implements Node {
id: ID!
venue: Venue!
movie: Movie!
}
其中*Connection
是cursor pagination实施细节。
实际上,我需要能够编写一个等同于:
的查询query (
$date: String!
$coordinates: CoordinatesInput!
) {
movies(
date: $date
coordinates: $coordinates
) {
edges {
node {
id
name
venues(
date: $date
coordinates: $coordinates
# WARNING! made up syntax
movieId: $parent.parent.movieId
) {
edges {
node {
id
name
events (
date: $date
# WARNING! made up syntax
movieId: $parent.parent.parent.parent.movieId
venueId: $parent.parent.venueId
) {
edges {
node {
id
date
time
timestamp
url
}
}
}
}
}
}
}
}
}
}
据我所知,graphql的规范没有描述在参数中引用父节点的方法。
什么有用...... 反转问题。
问题的反面很简单。我只需要按日期和位置定义事件,然后检索与该事件相关的场地和电影,例如
getEventsByDateAndLocation(date: "2017-05-18", location: [..]) {
id
venue {}
movie {}
}
这种方法的问题在于它会大大增加服务器响应,例如:如果我们每页显示200个事件且Movie
/ Venue
大小为1kb,则响应突然变为400kb(未经过gziped)。如果记录被标准化,响应将是~20kb。这是一个很大的不同。
一种可能的解决方案是提出两个请求:一个用于检索事件列表(连同所需的标识符),另一个用于检索实际资源,例如
getEventsByDateAndLocation(date: "2017-05-18", location: [..]) {
id
venue {
id
}
movie {
id
}
}
(后跟批量查询以按其ID检索Venue
和Movie
。
这具有数据组合复杂性的缺点。