Relay规范中edges为何用复数?node嵌套于edges的合理性疑问
背景示例
普通GraphQL查询(描述一个人拥有多顶帽子):
person{ hats{ color } }
按照Relay连接规范转换后的查询:
person{ hats{ edges{ node { color } cursor } ... } }
用树形结构理解的简化示意图:
(person) ||| |---------------|------------| | | | (hat1) (hat 2) (hat 3)
这里从person指向hat的连线就是edge。但Relay规范的结构让我产生两个疑问:
- 为什么node要嵌套在edges中?从图结构逻辑上难以理解。
- 为什么使用复数形式
edges而非单数edge?无法想象其适用场景,希望能给出示例说明。
我理解的Relay规范示意图如下(可能存在误解):
(person) _________|||____________________ |||-------------|||------------||| |||-------------|||------------||| ||| ||| ||| (hat1) (hat 2) (hat 3)
这种一人对应多顶帽子却有多条连线的结构让我困惑。
解答
1. 为什么node嵌套在edges中?
Relay设计edge嵌套node的核心目的,是为了承载关联关系本身的元数据,而非单纯传递关联节点的数据。
比如cursor是分页必需的标识,除此之外,你还可以在edge里添加属于“person与hat关联关系”的字段——比如addedAt(用户添加这顶帽子的时间)、isFavorite(是否是用户的最爱)。这些数据不属于hat本身,而是属于“某人拥有某顶帽子”这个关联行为。
如果把这些元数据和hat的字段平级,会混淆节点属性和关联关系属性,结构逻辑会变得混乱。嵌套node的方式,能清晰区分:edge里是关联相关的信息,node里是关联对象(hat)本身的信息。
2. 为什么用复数edges而非单数edge?
edges是一个数组,代表一组独立的关联实例,而非单个关联。你觉得示意图里的多连线是误解,实际上每个edge对应person和一个hat的一次独立关联,复数形式正是因为一个Connection(比如hats)对应多个这样的关联实例。
举个实际场景:假设一个用户可以多次收藏同一顶帽子(比如不同尺码的同款帽子),或者在社交平台中,用户和同一篇帖子有多次互动(点赞、评论、收藏)。这时候同一个node(帖子)会对应多个edges,每个edge携带不同的元数据:
person { postInteractions { edges { node { id title } interactionType # 可选值:LIKE/COMMENT/SAVE createdAt # 互动发生的时间 } } }
这里edges数组里会有多个条目,即使node是同一篇帖子,每个edge对应一次独立的互动行为——这就是复数edges的意义:它描述的是一组关联关系实例,而非单一的一对多关联。
内容的提问来源于stack exchange,提问作者Mondo Duke

