在GraphQL中建立关系的优良作法是将 connection 模型与 edge 和 node 元素一起使用。对于 edge 和 node ,建议也是可空的。这就是例如我使用的graphene-sqlalchemy将映射SQL关系。
我的问题是:为什么?就从SQL数据库提供关系数据的API而言,我看不到任何边缘或节点为null
的情况。因此,如果我在前端使用静态类型的语言(例如Typescript或Elm),我会发现自己写的样板可以处理永远不会发生的情况。
我应该如何从抽象数据模型的角度来理解这些null
?对我来说,“没有任何联系”会转化为没有边缘的联系。为什么需要null
边? null
节点使我更加困扰“存在连接,但另一端没有任何东西”?请在这里向我解释理由。
答案 0 :(得分:1)
使用连接将您的架构与Relay specification对齐-是否在不使用Relay的情况下这是一种好习惯还是有争议的。
在Relay中,边缘和节点可以为空,因为这是规范隐式指定的。
这样做的实际原因是因为GraphQL错误work。解决字段时遇到执行错误时,该字段将解析为null。但是,如果该字段也不为空,则它实际上不能解析为null,因此GraphQL会将整个父字段设置为null。如果父字段也不为null,则它将使其父对象为null ...依此类推。 GraphQL错误将以这种方式“冒泡”,直到遇到可为空的字段或到达data
根字段(始终为可为空)为止。
换句话说,通过使字段和边为空,我们允许节点在解析时出错,同时仍返回有关边本身的信息,更重要的是,仍返回所有其他边 >。如果节点和边缘都不为空,则单个节点内的错误将导致edges
字段本身解析为null。通过使这些字段为空,我们可以有效地支持GraphQL返回部分响应,即使它在执行过程中遇到错误也是如此。