我有一个与此类似的问题:schema design,除了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
}
还是有一些更好的方法来处理这些具有一些不同属性的类似对象?
答案 0 :(得分:3)
是的,您可以定义通用类型Vehicle
,但是 我只建议使用通用属性,而不是将所有属性都限制在基本模型中-这是设计类的一种不好的方法。 如果有更多具体类型(或将来添加),您将怎么办?轿车,皮卡,卡车,SUV等..您要在此基本Vehicle对象中添加所有字段吗?稍后可能会导致您出现问题。
最好的方法是使用Interface Type,您可以在其中定义具有所有公共字段/属性的基本接口类型,并且可以由其他具体的GraphQL类型实现。
让我用示例向您解释:
将基本/底面类型车辆定义为:
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
}
以这种方式定义您的对象类型可以为数据字段投影提供更大的灵活性。这意味着,在查询该对象类型时,您可以使用{{3}来查询Vehicle
中存在的公共字段以及属于子对象类型(实现Vehicle
类型的其他字段)的其他字段。 }}。
query VehiclesList {
vehicles {
make
model
weight
price
... on Sedan {
other_info
}
... on Pickup {
bed_length
towing_capacity
}
}
}