【问题标题】:graphql, split huge query to small queriesgraphql,将大查询拆分为小查询
【发布时间】:2018-12-21 11:46:22
【问题描述】:

我正在使用https://developer.github.com/v4/

我有一个像这样的巨大查询:

query ($login: String!, $first: Int, $after: String) {
  user (login: $login){
    avatarUrl
    login
    name,
    followers(first: $first, after:$after) { 
      edges{
        cursor
        node{
          id
          name
          login
          avatarUrl
        }
      }
      totalCount
    },
    repositories(first: $first) {
      edges{
        cursor
        node{
          id
          name
        }
      }
      totalCount
    }
  }
}

但我认为从服务器查询大量数据是不好的。

我有followersrepositories 页面。所以我认为把这个庞大的查询拆分成小的查询会更好。

这里是小查询:

追随者查询:

query($login: String!, $first: Int, $after: String) {
    user(login: $login) {
      followers(first: $first, after: $after) {
        edges {
          cursor
          node {
            id
            name
            login
            avatarUrl
          }
        }
        totalCount
      }
    }
  }

存储库查询:

query($login: String!, $first: Int, $after: String) {
    user(login: $login) {
      repositories(first: $first, after: $after) {
        nodes {
          id
          name
        }
        totalCount
      }
    }
  }

用户查询:

query($login: String!, $first: Int) {
    user(login: $login) {
      avatarUrl
      login
      name
    }
  }

我说的对吗?有必要这样做吗?这种情况的最佳做法是什么?是否有任何文档可以教人们如何处理这个问题或告诉人们最佳实践?

【问题讨论】:

  • “巨大”查询有什么问题(实际上我认为它很小)?这就是最初发明 GraphQL 的原因。此外,Github 会很高兴您在单个查询中获得所需的数据 - 并且只有您需要的数据。如 Apollo 文档中所述,拆分查询有一些原因(例如,为了加快 UI 速度),但特别是在服务器到服务器的通信中,这种情况非常罕见。请重新考虑首先将它们分开。
  • 您有没有找到合适的解决方案?如果没有相关的较小查询来重新获取较大查询的碎片部分,我看不出碎片如何帮助。

标签: graphql graphql-js github-graphql


【解决方案1】:

您可以将查询发送到Fragments,这样您仍然只会触发一个请求并且拥有更小的"queries"。像这样的:

关注者片段:

fragment followers on User {
    followers(first: $first, after: $after) { 
      edges{
        cursor
        node{
          id
          name
          login
          avatarUrl
        }
      }
      totalCount
    },
}

存储库片段:

fragment repositories on User {
  repositories(first: $first) {
      edges{
        cursor
        node{
          id
          name
        }
      }
      totalCount
    }
}

将它们全部放在查询中:

query ($login: String!, $first: Int, $after: String) {
  user (login: $login){
    avatarUrl
    login
    name
    ...followers
    ...repositories
  }
}

【讨论】:

    猜你喜欢
    • 2019-08-12
    • 2021-10-04
    • 2018-06-26
    • 2018-06-30
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多