为分析平台设计GraphQL模式



我刚刚开始浏览器GraphQl作为我的分析平台API层的选项。

我的UI主要由表和图表构建。大多数情况下,数据表示由维度分组的一些DB列。

我找到了以下文章https://www.microsoft.com/developerblog/2017/09/28/data-data-indepentent-graphql-raphql-usis--usion-view-model-model-schemas/来自Microsoft,描述了他们的看法,关于应该如何设计吮吸QUAGRQL模式(请参见下文)。

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益处?

您可以使用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将为您提供有关您要处理的类型且是id的一些信息,但是只要这些领域在该联盟中的所有类型都很常见,您就可以将其扩展到您喜欢的任何信息(或者您可以传播它仅在某些类型上)。

如果您不想带来所有图表,则有两种方法可以使用:

  1. 仅为您想要的类型添加内联片段,但其余的仍将以空对象的形式出现。
  2. 将另一个参数传递给代表您想要的类型的解析器

P.S。您可以根据需要获得颗粒状,还有interfacesinput types

最新更新