我刚刚开始浏览器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
的一些信息,但是只要这些领域在该联盟中的所有类型都很常见,您就可以将其扩展到您喜欢的任何信息(或者您可以传播它仅在某些类型上)。
如果您不想带来所有图表,则有两种方法可以使用:
- 仅为您想要的类型添加内联片段,但其余的仍将以空对象的形式出现。
- 将另一个参数传递给代表您想要的类型的解析器
P.S。您可以根据需要获得颗粒状,还有interfaces
和input types
。