GraphQL:这两种模式中有哪一种更好/更差?

GraphQL:这两种模式中有哪一种更好/更差?,graphql,Graphql,我对GraphQL比较陌生,我注意到可以用两种不同的方式之一选择相关字段。假设我们有一个机器人表和一个人类表,机器人有一个所有者,这是人类表中的记录。有(至少)两种方式可以表达这一点: query DroidsQuery { id name owner { id } } 或: 乍一看,前者似乎更为惯用,显然如果您选择多个字段,它有优势(owner{id name}vs.必须创建新的ownerName以便您可以执行ownerName)。然而,ownerId样式有一定的明确

我对GraphQL比较陌生,我注意到可以用两种不同的方式之一选择相关字段。假设我们有一个
机器人
表和一个
人类
表,
机器人
有一个
所有者
,这是
人类
表中的记录。有(至少)两种方式可以表达这一点:

query DroidsQuery {
  id
  name
  owner {
    id
  }
}
或:

乍一看,前者似乎更为惯用,显然如果您选择多个字段,它有优势(
owner{id name}
vs.必须创建新的
ownerName
以便您可以执行
ownerName
)。然而,
ownerId
样式有一定的明确性,因为您表达的是“这是我特别希望您选择的东西”

另外,从实现的角度来看,
owner{id}
似乎会让解析器生成一个不必要的
JOIN
,因为它会将
owner{id}
转换为
humans
表的
id
列(与
ownerId
字段相比,该字段使用自己的解析器知道不需要联接即可获取
droids
表的
ownerId
列)


正如我所说的,我是GraphQL新手,所以我相信如果我使用它的时间更长,我会很感激这个问题的很多细微差别。因此,我希望从使用GraphQL的人那里了解这两种方法的优点/缺点。为了清楚(并避免这个答案被关闭),我正在寻找明确的答案“这是一种方法在客观上比另一种方法好/坏的地方”,而不是主观的“我更喜欢一种方法”的答案。

您应该理解GraphQL只是一种查询语言+执行语义。对于如何显示数据以及如何解析数据没有任何限制

没有什么可以阻止您执行所描述的操作,并返回所有者对象和所有者ID

type Droid {
  id: ID!
  name: String!
  owner: Human! # use it when you want to expand owner detail
  ownerId: ID! # use it when you just want to get id of owner
}
您已经指出了主要问题:前一个实现似乎更为惯用

在GraphQL中设计字段分页时的真实示例:

type Droid {
  id: ID!
  name: String!
  friends(first: Int, after: String): [Human]
}
第一次,你查询一个droid+朋友,这很好

{
  query DroidsQuery {
    id
    name
    friends(first: 2) {
      name      
    }
  }
}
然后,单击“更多”以加载更多朋友;在解析下一个朋友之前,它再次点击
droidquery
以查询上一个droid对象:

{
  query DroidsQuery {
    id
    friends(first: 2, after: "dfasdf") {
      name      
    }
  }
}

因此,使用另一个
DroidFriendsQuery
query直接解析droid id中的好友是可行的。

谢谢你的详细回答,但我觉得你说的是“你可以用任何一种方式来做”。问题是,我已经知道我可以用任何一种方式来做;我真正想了解的是优点/缺点(即权衡)以这种或那种方式做这件事。
{
  query DroidsQuery {
    id
    friends(first: 2, after: "dfasdf") {
      name      
    }
  }
}