[英]What is the best way to design a graphql schema around objects with similar types?
我有一个类似的问题: 架构设计除了graphql架构。 我希望有一些有一些实现graphql经验的人可以帮我衡量下面方法的优缺点。
假设我有两个类似的业务对象,轿车和皮卡,具有以下属性。
四门轿车
拾起
制作一个名为Vehicle的通用类型并给它所有属性更有意义,即使某些类型不适用于轿车?
type Vehicle {
make
model
weight
price
bed_length
towing_capacity
}
或者最好将每个人分解成自己独特的类型,这样:
type Sedan {
make
model
weight
price
}
type Pickup {
make
model
weight
price
bed_length
towing_capacity
}
还是有一些更好的方法来处理这些类似的对象,只有一些不同的属性?
是的,您可以定义一个泛型类型的Vehicle
但我建议只使用公共属性而不是将所有属性限制在基本模型中 - 这是设计类的一种不好的方法。 如果有更多具体类型(或将来添加),例如轿车,皮卡,卡车,SUV等等,你会怎么做?你会在这个基础车辆对象中添加所有字段吗? 这可能会在以后引起您的问题。
最好的方法是使用接口类型 ,您可以在其中定义具有所有公共字段/属性的基本接口类型,并且可以通过其他具体的GraphQL类型实现。
让我用例子解释你:
将base / iterface类型的Vehicle定义为:
interface Vehicle {
make: String
model: String
weight: String
price: Int
}
现在,定义实现Vehicle接口的具体类型Sedan和Pickup以及它自己的非公共属性 :
type Sedan implements Vehicle {
make: String
model: String
weight: String
price: Int
other_info: String
}
type Pickup implements Vehicle {
make: String
model: String
weight: String
price: Int
bed_length: Int
towing_capacity: Int
}
以这种方式定义对象类型为数据字段投影提供了更大的灵活性。 这意味着,在查询此对象类型时,您可以灵活地使用片段查询Vehicle
中存在的公共字段以及属于子对象类型(实现Vehicle
类型)的其他字段。
query VehiclesList {
vehicles {
make
model
weight
price
... on Sedan {
other_info
}
... on Pickup {
bed_length
towing_capacity
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.