In a Relay/GraphQL schema configuration, one-to-many relationships (with pagination) are specified as in the tutorial example
type ShipConnection {
edges: [ShipEdge]
pageInfo: PageInfo!
}
type ShipEdge {
cursor: String!
node: Ship
}
However, the one-to-one connection made by ShipEdge
seems redundant. Why can't we move the cursor to ShipConnection
and store an array of Ship
IDs as edges?
type ShipConnection {
edges: [Ship]
pageInfo: PageInfo!
cursor: String!
}
What were the design decisions to require one extra object for every edge
in a one-to-many relationship?
The edges
field provides you with a place to put per-edge data. For example, you might want to put a creator
or priority
field on there, describing who added the edge and how important the relationship is, respectively.
If you don't require this kind of flexibility (or the other features that you get with connections, such as pagination), you could use a simple GraphQLList
type. See this answer for more on the difference between between connections and lists.