【问题标题】:What is the best way to design a graphql schema around objects with similar types?围绕具有相似类型的对象设计 graphql 模式的最佳方法是什么?
【发布时间】:2019-08-01 15:54:40
【问题描述】:

我有一个类似的问题:schema design 除了 graphql 模式。我希望有一些实施 graphql 经验的人可以帮助我权衡以下方法的优缺点。

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

轿车

  • 制作
  • 型号
  • 重量
  • 价格

取货

  • 制作
  • 型号
  • 重量
  • 价格
  • 床长
  • 牵引能力

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

或者有没有更好的方法来处理这些只有一些不同属性的相似对象?

【问题讨论】:

    标签: graphql


    【解决方案1】:

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

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

    让我举例说明:

    定义一个基础/接口类型Vehicle为:

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

    现在,定义具体类型 SedanPickup 实现 Vehicle 接口及其自己的非公共属性 作为:

    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
    }
    

    以这种方式定义您的对象类型为数据字段投影提供了更大的灵活性。这意味着,在查询此对象类型时,您可以使用fragments 灵活地查询Vehicle 中存在的公共字段以及属于子对象类型(实现Vehicle 类型)的其他字段。

    query VehiclesList {
      vehicles {
        make
        model
        weight
        price
        ... on Sedan {
           other_info
       }
        ... on Pickup {
          bed_length
          towing_capacity
        }
      }
    }
    

    【讨论】:

    • 谢谢!这正是我想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-09
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 2020-03-03
    • 2010-12-02
    • 2020-03-09
    相关资源
    最近更新 更多