GraphQL查询中的数据规范化
我正在使用GraphQL查询具有两种数据类型的数据库:GraphQL查询中的数据规范化,graphql,database-normalization,Graphql,Database Normalization,我正在使用GraphQL查询具有两种数据类型的数据库:User和Group 组有一个字段users,它是该组中User对象的数组。我在根目录下有一个名为groups的字段,它返回我所有组的数组 典型的查询可能如下所示: { groups { id, name, users { id, name, address, email,
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和名称查询(完整/分页)获取数据并呈现一些
组件
稍后,您可以使用自己的查询(hookuseQuery
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和名称查询(完整/分页)获取数据并呈现一些
组件
稍后,您可以使用自己的查询(hookuseQuery
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
}
}
}
我希望在一次查询中完成这项工作-我必须由拥有该实现的后端人员运行这项工作我希望在一次查询中完成这项工作-我必须由拥有该实现的后端人员运行这项工作酷-我不拥有该实现,但是我相信我可以让那些在船上工作的人很酷-我不拥有这个的实现,但是我相信我可以让那些在船上工作的人