【发布时间】:2018-06-26 21:42:10
【问题描述】:
我正在使用本机图形数据库。
我的数据对象由许多较小的属性集组成,我希望能够一次查询所有这些属性,而无需在我的架构中添加额外的人工层。属性定义得很好,但它们的组成却没有。
假设我很容易(微不足道)从查询中输出此对象:
{
"name": "Zapdos",
"wingspan": 40,
"airspeed": 120,
"maxVoltage": 100000000
}
假设wingspan 和airVelocity 属性来自FlyingType 属性,maxVoltage 来自ElectricType 属性。这些和其他属性都已明确定义。其他口袋妖怪可能会混合和匹配适用于它们的属性,定义它们的所有组合可能没有意义。
理想场景
是否可以运行以下查询并返回相同格式的数据?
graphql-js 是否必须处理由resolveType 函数返回的数组?默认的resolveType 函数是否在调用isTypeOf 的第一个真值处停止?
query {
Pokemon(name: "Zapdos") {
name
... on isFlyingType {
wingspan
airVelocity
}
... on isElectricType {
maxVoltage
}
}
}
大概是什么情况
我真的需要用我需要的一切来构建一个新类型吗?我有许多属性组成我的数据,这意味着有很多类型来说明每种接口组合。例如。我必须执行以下操作吗?
type FlyingElectricPokemon implements isPokemon, isFlyingType, isElectricType {
name: String!
wingspan: Int
airVelocity: Int
maxVoltage: Int
}
query {
Pokemon(name: "Zapdos") {
name
... on FlyingElectricPokemon {
wingspan
airVelocity
maxVoltage
}
}
}
我是否过于努力地避免 GraphQL 对我相当弱类型的图形数据进行强类型化?
解决方法,但增加了复杂性
我希望避免以下增加复杂性:
type Query {
Pokemon(name: String): Pokemon
}
type Pokemon {
name: String!
attributes: [isAttribute!]
}
interface isAttribute {
type: String!
}
type FlyingType implements isAttribute {
type: String!
wingspan: Int
}
type ElectricType implements isAttribute {
type: String!
maxVoltage: Int
}
query {
Pokemon(name: "Zapdos") {
name
attributes {
... on FlyingType {
wingspan
airVelocity
}
... on ElectricType {
maxVoltage
}
}
}
}
需要以下格式的数据
{
"name": "Zapdos",
"attributes": [
{ "type": "flying", "wingspan": 40 },
{ "type": "electric", "maxVoltage": 100000000 }
]
}
后一点我实际上是在处理Launchpad。
【问题讨论】:
-
我只能建议将相关类型分组到接口中,然后使用联合来弥补任何差距。当有选择时,我会选择工会,因为他们不需要太多的开销来推理。我不能给出具体的建议,因为你没有给出整个 API,但看起来有点尴尬。有时重新审视 1000 英尺的照片会很有帮助(如果您还没有投入太多)
标签: graphql graph-databases graphql-js