Ron*_*dot 6 schema analytics graphql
我刚开始探索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]
}
Run Code Online (Sandbox Code Playgroud)
在我看来,这种设计是严格的,强制将任何新图表添加到根查询.在不失去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]
}
Run Code Online (Sandbox Code Playgroud)
然后你可以让你的charts解析器带来所有图表并编写你的查询,例如
fragment Identifiers on Chart {
__typename
id
}
query {
charts(...) {
...on LineChart {
...Identifiers
seriesData
}
...on PieChart {
...Identifiers
labels
values
}
...on BarChart {
...Identifiers
seriesData
}
}
}
Run Code Online (Sandbox Code Playgroud)
将为Identifiers您提供一些有关您正在处理的类型及其类型的信息id,但是您可以将其扩展为您喜欢的任何内容,只要这些字段对于该联合上的所有类型都是通用的(或者您可以仅将其传播到某些类型)的类型)。
如果您不想引入所有图表,可以采用两种方法:
PS 你可以根据自己的喜好获得粒度,还有interfaces和input types。
| 归档时间: |
|
| 查看次数: |
976 次 |
| 最近记录: |