gpt4 book ai didi

schema - 为分析平台设计 GraphQL 模式

转载 作者:行者123 更新时间:2023-12-04 12:39:35 24 4
gpt4 key购买 nike

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

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

我找到了以下文章 https://www.microsoft.com/developerblog/2017/09/28/data-independent-graphql-using-view-model-based-schemas/来自 Microsoft,描述了他们对 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 的好处?

最佳答案

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

如果您不想引入所有图表,可以采用两种方法:
  • 只为你想要的类型添加内联片段,但其余的仍然会以空对象的形式存在。
  • 将另一个参数传递给表示您想要的类型的解析器

  • 附言您可以随心所欲地细化,还有 interfacesinput types .

    关于schema - 为分析平台设计 GraphQL 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47422865/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com