我刚刚开始探索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优势的情况下,架构如何更通用?
1 回答
您可以使用
union
类型和inline/fragments
执行某些操作然后你可以让你的
charts
解析器带来所有的图表并写下你的查询Identifiers
将为您提供有关您所使用的类型的一些信息,但您可以将其扩展为您喜欢的任何内容,只要这些字段对该联合上的所有类型都是通用的(或者您只能在某些类型上传播它) ) .如果您不想引入所有图表,有两种方法可以解决:
仅为所需类型添加内联片段,但其余部分仍将以空对象的形式添加 .
将另一个参数传递给表示所需类型的解析程序
附:你可以按照你想要的那样细化,也有
interfaces
和input types
.