В моей модели данных 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 и не лучший разработчик данных для начала, но я бы высоко оценил любое подталкивание в правильном направлении :)
И если у меня нет другого выбора, кроме трех, которые я перечислил, какой из них будет наиболее разумным?