GraphQL查询中的数据规范化

GraphQL查询中的数据规范化,graphql,database-normalization,Graphql,Database Normalization,我正在使用GraphQL查询具有两种数据类型的数据库:User和Group 组有一个字段users,它是该组中User对象的数组。我在根目录下有一个名为groups的字段,它返回我所有组的数组 典型的查询可能如下所示: { groups { id, name, users { id, name, address, email,

我正在使用GraphQL查询具有两种数据类型的数据库:
User
Group

组有一个字段
users
,它是该组中
User
对象的数组。我在根目录下有一个名为
groups
的字段,它返回我所有组的数组

典型的查询可能如下所示:

{
    groups {
        id,
        name,
        users {
            id,
            name,
            address,
            email,
            phone,
            attitude,
            job,
            favoriteQuote,
            favoriteColor,
            birthday
        }
    }
}
问题是,这些用户中有很多可能属于多个组,而且由于
User
有很多字段,因此可能会产生很大的响应

是否有办法为对象的第一个实例获取一组字段,并为响应中的每个其他实例获取一组不同的字段?

在响应中,每个用户只需
名称
作业
电子邮件
等一次,然后只需
id
(之后我可以自己进行规范化)

或者

有没有办法只获取组中所有用户的
id
字段,并返回查询中引用的所有唯一
User
对象(并非所有
User
对象)的单独数组?

通常-通常 。。。规范化当然f、 e.使用apollo及其标准化缓存

从API返回的所有记录必须是相同的形状。

您可以仅使用ID和名称查询(完整/分页)获取数据并呈现一些
组件

稍后,您可以使用自己的查询(hook
useQuery
inside)在一些
组件中呈现细节,以从缓存/api(可控)获取额外数据

您的具体要求-可能 第一种选择: 通常,响应是一种常见的形状(根据请求),但您可以决定在解析器级别返回什么。这需要对查询结构进行更改,以允许(API、后端)对某些属性进行空值化。F.e

group {
    id
    name
    users {
        id
        name
        profile {
          photo
          email
          address
使用
profile
自定义json类型。。。您可以构造users resolver以仅返回第一条记录的完整数据,并为所有后续用户返回
null

第二种选择: 您可以在一个请求中使用两个稍有不同的查询。使用别名(参见文档),简而言之:

groupWithFullMember: group ( groupId:xxx, limitUsers:1 ) {
    id
    name
    users {
        id
        name
        address
        email
        ...
    }
}

groupMembers: group ( groupId:xxx ) {
    id
    name // not required
    users {
        id
        name
    }
}
组解析程序可以返回它的子
用户
。。。或者
用户
解析器可以访问
限制用户
参数来限制响应/修改数据库查询。

通常-通常 。。。规范化当然f、 e.使用apollo及其标准化缓存

从API返回的所有记录必须是相同的形状。

您可以仅使用ID和名称查询(完整/分页)获取数据并呈现一些
组件

稍后,您可以使用自己的查询(hook
useQuery
inside)在一些
组件中呈现细节,以从缓存/api(可控)获取额外数据

您的具体要求-可能 第一种选择: 通常,响应是一种常见的形状(根据请求),但您可以决定在解析器级别返回什么。这需要对查询结构进行更改,以允许(API、后端)对某些属性进行空值化。F.e

group {
    id
    name
    users {
        id
        name
        profile {
          photo
          email
          address
使用
profile
自定义json类型。。。您可以构造users resolver以仅返回第一条记录的完整数据,并为所有后续用户返回
null

第二种选择: 您可以在一个请求中使用两个稍有不同的查询。使用别名(参见文档),简而言之:

groupWithFullMember: group ( groupId:xxx, limitUsers:1 ) {
    id
    name
    users {
        id
        name
        address
        email
        ...
    }
}

groupMembers: group ( groupId:xxx ) {
    id
    name // not required
    users {
        id
        name
    }
}
组解析程序可以返回它的子
用户
。。。或者
用户
解析器可以访问
limitUsers
param来限制响应/修改数据库查询

有没有办法为对象的第一个实例获取一组字段,为响应中的每个其他实例获取一组不同的字段

否。除非单个项目的类型不同,否则将为列表中的每个项目返回相同的字段集,因为可以为运行时返回的每个类型指定单独的选择集

有没有办法只获取组中所有用户的id字段,并返回查询中引用的所有唯一用户对象(并非所有用户对象)的单独数组

您可以设计模式来适应这一点。差不多

{
  groups {
    nodes {
      id
      name
      users {
        id
      }
    }
    uniqueUsers {
      id
      # other fields
    }
  }
}
您的
解析器需要处理所有规范化并以适当的形状返回数据。然而,一个更简单的解决方案可能是颠倒你们的关系:

{
  users {
    id
    name
    address
    email
    phone
    attitude
    job
    favoriteQuote
    favoriteColor
    birthday
    groups {
      id
      name
    }
  }
}
有没有办法为对象的第一个实例获取一组字段,为响应中的每个其他实例获取一组不同的字段

否。除非单个项目的类型不同,否则将为列表中的每个项目返回相同的字段集,因为可以为运行时返回的每个类型指定单独的选择集

有没有办法只获取组中所有用户的id字段,并返回查询中引用的所有唯一用户对象(并非所有用户对象)的单独数组

您可以设计模式来适应这一点。差不多

{
  groups {
    nodes {
      id
      name
      users {
        id
      }
    }
    uniqueUsers {
      id
      # other fields
    }
  }
}
您的
解析器需要处理所有规范化并以适当的形状返回数据。然而,一个更简单的解决方案可能是颠倒你们的关系:

{
  users {
    id
    name
    address
    email
    phone
    attitude
    job
    favoriteQuote
    favoriteColor
    birthday
    groups {
      id
      name
    }
  }
}

我希望在一次查询中完成这项工作-我必须由拥有该实现的后端人员运行这项工作我希望在一次查询中完成这项工作-我必须由拥有该实现的后端人员运行这项工作酷-我不拥有该实现,但是我相信我可以让那些在船上工作的人很酷-我不拥有这个的实现,但是我相信我可以让那些在船上工作的人