繁体   English   中英

围绕具有相似类型的对象设计graphql架构的最佳方法是什么?

[英]What is the best way to design a graphql schema around objects with similar types?

我有一个类似的问题: 架构设计除了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
}

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

是的,您可以定义一个泛型类型的Vehicle我建议只使用公共属性而不是将所有属性限制在基本模型中 - 这是设计类的一种不好的方法。 如果有更多具体类型(或将来添加),例如轿车,皮卡,卡车,SUV等等,你会怎么做?你会在这个基础车辆对象中添加所有字段吗? 这可能会在以后引起您的问题。

最好的方法是使用接口类型 ,您可以在其中定义具有所有公共字段/属性的基本接口类型,并且可以通过其他具体的GraphQL类型实现。

让我用例子解释你:

将base / iterface类型的Vehicle定义为:

interface Vehicle {
    make: String
    model: String
    weight: String
    price: Int
}

现在,定义实现Vehicle接口的具体类型SedanPickup以及它自己的非公共属性

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM