В моей модели данных Prisma я начал с базового типа пользователя, такого как:
type User {
name: String!
email: String! @unique
password: String!
}
Теперь пользователь может иметь две роли: либо в качестве кандидата, либо в качестве пользователя, связанного с работодателем. Если кандидат, пользователь также должен иметь набор приложений и набор квалификаций, если он связан с работодателем, он должен иметь уровень доступа и ссылку на работодателя.
Прежде всего, есть ли способ расширить базовые типы в моделировании данных GraphQL? Если так, как бы я это сделал?
Если нет, я вижу три разных метода, и мне интересно, каковы плюсы и минусы каждого подхода:
- Имеет два отдельных типа
CandidateUser
и EmployerUser
, каждый с полями name
, email
, password
. Я вижу две проблемы с этим подходом: тег @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!
}
Снова два отдельных типа, но с RootUser
, содержащим name
, email
и password
, и с CandidateUser
и EmployerUser
, каждый из которых имеет непосредственную ссылку на RootUser
. Это приведет к применению тега @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
, чтобы поля в EmployerUser и CandidateUser были необязательными параметрами. Это довольно простой подход, но мне понадобится настраиваемая обработка для обеспечения обязательных полей (например, я не могу пометить, например, работодателя, как требуется, так как это поле не существует для кандидата).
type User{
name: String!
email: String! @unique
password: String!
applications: [Application!]!
qualifications: [Qualification!]!
employer: Employer
accessRight: AccessRight
}
Я действительно хочу спросить, есть ли лучший способ решить это. Я все еще довольно новичок в GraphQL и не самый лучший разработчик моделей данных для начала, но я очень ценю любое движение в правильном направлении:)
А если у меня нет другого выбора, кроме трех, которые я перечислил, какой из них был бы наиболее целесообразным?