GraphQL数据建模-扩展类型(Prisma)

时间:2018-09-10 11:07:50

标签: graphql data-modeling prisma-graphql

在我的Prisma数据模型中,我首先使用如下基本用户类型:

type User {
  name: String!
  email: String! @unique
  password: String!
}

现在,用户可以扮演两个角色:作为候选人或与雇主关联的用户。如果是候选人,则用户还应该具有一套申请和一套资格,如果与雇主相关联,则应该具有访问级别和对雇主的引用。

首先,有什么方法可以扩展GraphQL数据建模中的基本类型?如果是这样,我将如何去做?

如果没有,我可以看到使用了三种不同的方法,我很好奇每种方法的优缺点:

  1. 具有两个单独的类型CandidateUserEmployerUser,每个类型具有字段nameemailpassword。我看到这种方法有两个问题:@unique上的email标签是不可靠的,我将不得不编写一个自定义验证来确保该字段在两种类型中都是唯一的。拥有一个可以接收电子邮件并获取用户相应数据的单一登录功能不再是微不足道的:它需要在两个表中进行查找。

赞:

    type CandidateUser {
      name: String!
      email: String! @unique
      password: String!
      applications: [Application!]!
      qualifications: [Qualification!]!
    }
    type EmployerUser{
      name: String!
      email: String! @unique
      password: String!
      employer: Employer!
      accessRight: AccessRight!
    }
  1. 又有两种不同的类型,但其中的RootUser包含nameemailpassword,以及CandidateUser和{{1} }每个对EmployerUser都有一对一的引用。这将在电子邮件字段上强制使用RootUser标签,但查找仍然很简单。

    @unique
  2. 扩展type RootUser{ name: String! email: String! @unique password: String! } type CandidateUser { rootUser: RootUser! applications: [Application!]! qualifications: [Qualification!]! } type EmployerUser{ rootUser: RootUser! employer: Employer! accessRight: AccessRight! } ,使EmployerUser和CandidateUser中的字段作为可选参数。这是一种非常简单的方法,但是我需要自定义处理以强制执行必填字段(例如,由于候选人不存在该字段,因此我无法例如将雇主标记为必填字段)。

    User

我真的想问一下是否有更好的方法来解决这个问题。我对GraphQL还是很陌生,并不是最好的数据建模者,但是我会向正确的方向大加赞赏:)

如果我除了列出的三个别无选择,那么哪个才最有意义?

1 个答案:

答案 0 :(得分:2)

您要执行的操作是实现interface type

  

接口是一种抽象类型,它包含类型必须包含以实现接口的某些字段集。

interface User {
  name: String!
  email: String! @unique
  password: String!
}

这意味着实现User的任何类型都需要具有这些确切的字段以及这些参数和返回类型。因此,现在您的Candidate类型可以实现User

type Candidate implements User {
  name: String!
  email: String! @unique
  password: String!
  applications: [Application!]!
  qualifications: [Qualification!]!
}

当您要返回一个对象或一组对象时,接口很有用,但它们可能具有几种不同的类型。请查看interface abstract type documentation了解更多信息。


更新

由于这是一个Prisma GraphQL问题,因此您应该意识到 Prisma尚不支持接口或联合类型Issue #83issue #165分别将两者作为功能要求进行讨论。

但是,有一篇很棒的文章讨论了这种方法的变通方法:

GraphQL Interfaces (and Union Types) with Prisma and Yoga

归结为2个选项:

  
      
  1. 将所有具有特定类型的可选字段的数据存储在Prisma中的一种类型(接口)下,然后在应用服务器中的原始类型之间拆分数据。
  2.   
  3. 将每种基本类型的数据存储在Prisma上,并在应用程序服务器上缝合查询内容。
  4.