0

私の Prisma Data Model では、次のような基本的な User タイプから始めました。

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

現在、ユーザーは、候補者として、または雇用主に関連付けられたユーザーとして、2 つの役割を持つことができます。候補者の場合、ユーザーには一連のアプリケーションと一連の資格も必要です。雇用者に関連付けられている場合は、アクセス レベルと雇用者への参照が必要です。

まず、GraphQL データ モデリングで基本型を拡張する方法はありますか? もしそうなら、どうすればそれを行うことができますか?

そうでない場合は、3 つの異なる方法が使用されていることがわかります。それぞれのアプローチの長所と短所を知りたいです。

  1. と の2 つの別個の型がCandidateUserありEmployerUser、それぞれにフィールドnameemail、 がありpasswordます。このアプローチには 2 つの問題があります。@uniqueタグ onemailは信頼性が低く、フィールドが両方のタイプで一意であることを確認するためにカスタム検証を作成する必要があります。また、メールを受け取ってユーザーの対応するデータを取得する単一のログイン関数を持つことは、もはや簡単ではありません。両方のテーブルでルックアップを行う必要があります。

このような:

    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. ここでも 2 つの別個の型ですが、 がRootUser含まれておりname、、 、および があり、それぞれが への 1 対 1 の参照を持っています。これにより、電子メール フィールドにタグが強制されますが、ルックアップは依然として自明ではありません。emailpasswordCandidateUserEmployerUserRootUser@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!
    }
    
  2. Userオプションのパラメーターとして、EmployerUser および CandidateUser 内のフィールドを持つように拡張します。これは非常に単純なアプローチですが、必要なフィールドを強制するカスタム処理が必要になります (たとえば、候補者にはそのフィールドが存在しないため、雇用主を必須としてマークすることはできません)。

    type User{
      name: String!
      email: String! @unique
      password: String!
      applications: [Application!]!
      qualifications: [Qualification!]!
      employer: Employer
      accessRight: AccessRight
    }
    

これを解決するためのより良い方法があるかどうかを本当に聞きたいです。私はまだGraphQLにかなり慣れておらず、そもそも最高のデータモデラーではありませんが、正しい方向への微調整を大いに感謝します:)

また、リストした 3 つ以外に選択肢がない場合、どれが最も理にかなっていますか?

4

1 に答える 1