在具有相似类型的对象周围设计graphql模式的最佳方法是什么?

时间:2019-07-31 23:22:23

标签: graphql

我有一个与此类似的问题:schema design,除了graphql模式。我希望有一些执行graphql的经验的人能够帮助我权衡以下方法的利弊。

说我有两个类似的业务对象,即轿车和皮卡,它们具有以下属性。

轿车

  • 制作
  • 模型
  • 体重
  • 价格

提取

  • 制作
  • 模型
  • 体重
  • 价格
  • bed_length
  • 牵引能力

创建一个名为 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
}

还是有一些更好的方法来处理这些具有一些不同属性的类似对象?

1 个答案:

答案 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
    }
  }
}