【问题标题】:Designing a GraphQL schema for an analytics platform为分析平台设计 GraphQL 模式
【发布时间】:2018-05-05 11:50:19
【问题描述】:

我刚刚开始探索 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 优势的情况下使架构更通用?

【问题讨论】:

    标签: schema analytics graphql


    【解决方案1】:

    您可以使用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,但您可以将其扩展为您喜欢的任何内容,只要这些字段对于该联合上的所有类型都是通用的 (或者你可以只在某些类型上传播它。

    如果您不想引入所有图表,可以采用 2 种方法:

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

    附:你可以随心所欲,还有interfacesinput types

    【讨论】:

    • 好帖子,你知道任何可以与 GraphQL 一起使用的分析框架
    猜你喜欢
    • 1970-01-01
    • 2016-07-18
    • 2013-08-07
    • 1970-01-01
    • 1970-01-01
    • 2019-02-08
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多