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

GraphQL数据建模.扩展类型(Prisma),graphql,data-modeling,prisma-graphql,Graphql,Data Modeling,Prisma Graphql,在我的Prisma数据模型中,我从以下基本用户类型开始: type User { name: String! email: String! @unique password: String! } 现在,用户可以有两个角色:作为候选人或与雇主关联的用户。如果是候选人,用户还应具有一套申请和一套资格,如果与雇主相关,则应具有访问级别和雇主参考 首先,有没有办法扩展GraphQL数据建模中的基本类型?如果是这样的话,我该怎么做呢 如果没有,我可以看到使用了三种不同的方法,我很好奇每种方法

在我的Prisma数据模型中,我从以下基本用户类型开始:

type User {
  name: String!
  email: String! @unique
  password: String!
}
现在,用户可以有两个角色:作为候选人或与雇主关联的用户。如果是候选人,用户还应具有一套申请和一套资格,如果与雇主相关,则应具有访问级别和雇主参考

首先,有没有办法扩展GraphQL数据建模中的基本类型?如果是这样的话,我该怎么做呢

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

  • 有两种不同类型的
    CandidateUser
    employeeuser
    ,每种类型都有
    名称
    电子邮件
    密码
    。我发现这种方法有两个问题:
    email
    上的
    @unique
    标记不可靠,我必须编写一个自定义验证,以确保字段在这两种类型中都是唯一的;拥有一个单一的登录功能来接收电子邮件并获取用户相应的数据不再是一件小事:它需要在两个表中进行查找 像这样:

        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!
        }
    
  • 同样有两种不同的类型,但是
    RootUser
    包含
    name
    email
    password
    ,并且
    CandidateUser
    employeeuser
    都有对
    RootUser
    的一对一引用。这将在email字段上强制执行
    @unique
    标记,但查找仍然是非常重要的

    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!
    }
    
  • 扩展
    User
    以将EmployeeUser和CandidateUser中的字段作为可选参数。这是一个非常简单的方法,但我需要自定义处理来强制执行required字段(例如,我不能将雇主标记为required,因为候选人不存在该字段)

  • 我真的想问,是否有更好的方法来解决这个问题。我对GraphQL还是相当陌生,并不是最好的数据建模师,但我非常欣赏在正确方向上的任何推动:)


    如果除了我列出的三个选项之外,我没有其他选择,那么哪一个最有意义呢?

    您要做的是实现:

    接口是一种抽象类型,它包含一组特定的字段,类型必须包含这些字段才能实现接口

    这意味着实现
    User
    的任何类型都需要有这些精确的字段,以及这些参数和返回类型。因此,现在您的
    候选者
    类型可以实现
    用户

    type Candidate implements User {
      name: String!
      email: String! @unique
      password: String!
      applications: [Application!]!
      qualifications: [Qualification!]!
    }
    
    当您想要返回一个对象或一组对象时,接口很有用,但这些对象可能有几种不同的类型。有关更多信息,请查看


    更新:

    由于这是一个Prisma GraphQL问题,您应该知道,Prisma目前还不支持接口或联合类型。并分别作为特征请求进行讨论

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

    这归结为两个选项:

  • 在Prisma中的一种类型(接口)下使用可选的特定于类型的字段存储所有数据,然后在app server中的基本类型之间拆分数据
  • 在Prisma上以每种基本类型存储数据,并在app server上缝合查询内容

  • 您尝试执行的是:

    接口是一种抽象类型,它包含一组特定的字段,类型必须包含这些字段才能实现接口

    这意味着实现
    User
    的任何类型都需要有这些精确的字段,以及这些参数和返回类型。因此,现在您的
    候选者
    类型可以实现
    用户

    type Candidate implements User {
      name: String!
      email: String! @unique
      password: String!
      applications: [Application!]!
      qualifications: [Qualification!]!
    }
    
    当您想要返回一个对象或一组对象时,接口很有用,但这些对象可能有几种不同的类型。有关更多信息,请查看


    更新:

    由于这是一个Prisma GraphQL问题,您应该知道,Prisma目前还不支持接口或联合类型。并分别作为特征请求进行讨论

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

    这归结为两个选项:

  • 在Prisma中的一种类型(接口)下使用可选的特定于类型的字段存储所有数据,然后在app server中的基本类型之间拆分数据
  • 在Prisma上以每种基本类型存储数据,并在app server上缝合查询内容

  • 所以,如果候选人和雇员用户都实现了User,他们会发送电子邮件:
    String@唯一的
    强制要求电子邮件在应聘者和雇员用户之间都是唯一的,或者只在每个字段中是唯一的?哦,我现在明白了,Prisma不支持界面,所以我想我还是stuck@LarsHoldaas我的坏想法是你在问一个简单的问题。(我刚刚添加了prisma标记),这里讨论了prisma graphql问题的接口类型:。在这个问题上应该有一些解决办法。无论如何,这是一个很好的答案!我以为我的问题是一个普通的GraphQL问题,直到我读了你的答案,然后发现Prisma不支持它,所以我没有自己标记它。我应该记住这一点,以备将来提问。所以,如果候选人和雇员用户都实现了User,我会发送电子邮件:
    String@唯一的
    强制要求电子邮件在应聘者和雇员用户之间都是唯一的,或者只在每个字段中是唯一的?哦,我现在明白了,Prisma不支持界面,所以我想我还是stuck@LarsHoldaas我的坏想法是你在问一个简单的问题。(我刚刚添加了prisma标记),这里讨论了prisma graphql问题的接口类型:。在这个问题上应该有一些解决办法。无论如何,这是一个很好的解决办法
    type Candidate implements User {
      name: String!
      email: String! @unique
      password: String!
      applications: [Application!]!
      qualifications: [Qualification!]!
    }