首页 文章

为分析平台设计GraphQL架构

提问于
浏览
5

我刚刚开始探索GraphQL作为我的分析平台API层的选项 .

我的UI主要是从表格和图表构建的 . 大多数情况下,数据表示按维度分组的某些数据库列 .

我从Microsoft找到了以下文章https://www.microsoft.com/developerblog/2017/09/28/data-independent-graphql-using-view-model-based-schemas/,描述了他们对如何设计糟糕的GraphQL模式的看法(见下文) .

type Query {
  channels(source: String!, query:String!, appId:String!, apiKey:String!): [Channel]
  lineCharts(source: String!, query:String!, appId:String!, apiKey:String!, filterKey:String, filterValues:[String]): [LineChart]
  pieCharts(source: String!, query:String!, appId:String!, apiKey:String!): [PieChart]
  barCharts(source: String!, query:String!, appId:String!, apiKey:String!, filterKey:String, filterValues:[String]): [BarChart]
}

type Channel {
  name: String
  id: Int
}

type LineChart {
  id: String
  seriesData : [Series]
}

type PieChart {
  id: String
  labels: [String]
  values: [Int]
}

type BarChart {
  id: String
  seriesData : [Series]
}

type Series {
  label: String
  x_values: [String]
  y_values: [Int]
}

在我看来,这种设计是严格的,强制将任何新图表添加到根查询中 . 在不失去GraphQL优势的情况下,架构如何更通用?

1 回答

  • 3

    您可以使用 union 类型和 inline/fragments 执行某些操作

    union Chart = LineChart | PieChart | BarChart
    
    type Query {
      charts(
        source: String!
        query: String!
        appId: String!
        apiKey: String!
        filterKey: String
        filterValues: [String]
      ): [Chart]
    }
    

    然后你可以让你的 charts 解析器带来所有的图表并写下你的查询

    fragment Identifiers on Chart {
      __typename
      id
    }
    query {
      charts(...) {
        ...on LineChart {
          ...Identifiers
          seriesData
        }
        ...on PieChart {
          ...Identifiers
          labels
          values
        }
        ...on BarChart {
          ...Identifiers
          seriesData
        }
      }
    }
    

    Identifiers 将为您提供有关您所使用的类型的一些信息,但您可以将其扩展为您喜欢的任何内容,只要这些字段对该联合上的所有类型都是通用的(或者您只能在某些类型上传播它) ) .

    如果您不想引入所有图表,有两种方法可以解决:

    • 仅为所需类型添加内联片段,但其余部分仍将以空对象的形式添加 .

    • 将另一个参数传递给表示所需类型的解析程序

    附:你可以按照你想要的那样细化,也有 interfacesinput types .

相关问题