通过仅包含具有值的字段来优化 GraphQL 查询?
Optimizing GraphQL queries by including fields only if they hold a value?
我完全不知道这是否是个好主意,真的很糟糕,所以这就是我想知道的。
假设我有一个 graphql 服务器,它发回这样的东西:
[
{
name: "John"
age: 55
isSingle: false
hasChildren: false
lovesMusic: false #imagine more fields like these
{,
# ...loads of records of the same format here
]
假设文件很大并且有很多记录:将它从错误的值中删除并且仅发回一些东西不是一个好主意吗每当 isSingle / hasChildren / lovesMusic
为真时,为了节省带宽?或者这是一个坏主意,让一切都容易出错?
所以在这个例子中,我只是发回:
[
{
name: "John"
age: 55
{,
...
]
我很担心,因为我的查询返回了很大的 graphql 对象,其中很多只是未填写的字段,因此我的前端不需要。
根据我的理解,GraphQL 的全部意义在于准确接收指定的类型和字段集 - 不多也不少。
使用某些中间件更改结果或删除包含 0
、null
、false
或 undefined
的字段将违反 Graphql 规范。如果你无论如何都要违反某种约定,那么使用它是没有意义的。
然而,对于性能和带宽优化,有一些选项需要考虑:
使用较短的名称
您可以在 GraphQL 架构中使用较短的字段名称。你甚至可以想出某种你自己的压缩算法。例如,您可以用字符替换逻辑名称,然后在前端将它们映射回常规名称。
{
name: "John"
age: 55
isSingle: false
hasChildren: false
lovesMusic: false
{
会变成这样:
{
n: "John"
a: 55
s: f
hC: f
lM: f
}
然后您可以将字段名称和值映射回前端,当然会牺牲一些性能。您只需要在 javascript 中有一些字典对象,它将较短的字段名称存储为键,将较长的字段名称存储为值:
const adict = {
"hC": "hasChildren",
"lM": "lovesMusic",
"n": "name",
...
}
虽然这种方法会缩小您的数据并为您节省一些带宽,但它不是应用程序方面的最佳做法。我认为它会以某种方式降低您的代码的灵活性和可读性。
外部图书馆
有很多外部库可以帮助您减少数据负载。最受欢迎的是 Message Pack and Protocol buffers。这些都是非常高效且巧妙构建的技术,但研究它们并将它们集成到您的解决方案中可能需要一些时间。
我完全不知道这是否是个好主意,真的很糟糕,所以这就是我想知道的。
假设我有一个 graphql 服务器,它发回这样的东西:
[
{
name: "John"
age: 55
isSingle: false
hasChildren: false
lovesMusic: false #imagine more fields like these
{,
# ...loads of records of the same format here
]
假设文件很大并且有很多记录:将它从错误的值中删除并且仅发回一些东西不是一个好主意吗每当 isSingle / hasChildren / lovesMusic
为真时,为了节省带宽?或者这是一个坏主意,让一切都容易出错?
所以在这个例子中,我只是发回:
[
{
name: "John"
age: 55
{,
...
]
我很担心,因为我的查询返回了很大的 graphql 对象,其中很多只是未填写的字段,因此我的前端不需要。
根据我的理解,GraphQL 的全部意义在于准确接收指定的类型和字段集 - 不多也不少。
使用某些中间件更改结果或删除包含 0
、null
、false
或 undefined
的字段将违反 Graphql 规范。如果你无论如何都要违反某种约定,那么使用它是没有意义的。
然而,对于性能和带宽优化,有一些选项需要考虑:
使用较短的名称
您可以在 GraphQL 架构中使用较短的字段名称。你甚至可以想出某种你自己的压缩算法。例如,您可以用字符替换逻辑名称,然后在前端将它们映射回常规名称。
{
name: "John"
age: 55
isSingle: false
hasChildren: false
lovesMusic: false
{
会变成这样:
{
n: "John"
a: 55
s: f
hC: f
lM: f
}
然后您可以将字段名称和值映射回前端,当然会牺牲一些性能。您只需要在 javascript 中有一些字典对象,它将较短的字段名称存储为键,将较长的字段名称存储为值:
const adict = {
"hC": "hasChildren",
"lM": "lovesMusic",
"n": "name",
...
}
虽然这种方法会缩小您的数据并为您节省一些带宽,但它不是应用程序方面的最佳做法。我认为它会以某种方式降低您的代码的灵活性和可读性。
外部图书馆
有很多外部库可以帮助您减少数据负载。最受欢迎的是 Message Pack and Protocol buffers。这些都是非常高效且巧妙构建的技术,但研究它们并将它们集成到您的解决方案中可能需要一些时间。