Как определить схему для отношений событий, команд и участников
В Prisma я хотел бы смоделировать следующее, но я не совсем уверен, как.
type Event {
id: ID! @unique
players: [User]! @relation(name: "EventPlayers")
teams: [Team]! @relation(name: "EventTeams")
...
}
type User {
id: ID! @unique
eventsPlayed: [Event]! @relation(name: "EventPlayers")
...
}
type Team {
id: ID! @unique
event: Event! @relation(name: "EventTeams")
members: [User]! @relation(name: ?????)
...
}
Ограничения
- каждый
team member
должен быть вEvent.players
- каждый
Event.player
может быть назначен только одной (или ни одной) команде
Вопрос
У меня такое чувство, что мне нужны отношения многие ко многим, но я изо всех сил пытаюсь это выяснить. Что я имею в виду Team.members
в?????. Я даже правильно подхожу к этому?
Больше информации (если это полезно)
Я намерен создать интерфейс drag-n-drop для создания команд. Перечисленные в Events.players
но которые еще не были назначены Team.member
будет в unassigned
ведро. Перетаскивая их в команду, назначим их как Team.member
, Но я хочу опрашивать всех игроков как events { players { id }}
а также events { teams { members { id }}}
Обновить
Подумав об этом больше, я думаю о другом способе решения этой проблемы. Вот обновленная схема, по которой я хотел бы услышать ваши мысли / отзывы.
type Event {
id: ID! @unique
users: [EventUser!]!
teams: [Team!]!
title: string
}
type EventUser {
event: Event!
user: User!
role: EventRole!
}
type User {
id: ID! @unique
events: [EventUser!]!
name: string
}
type Team {
event: Event!
members: [EventUser!]!
name: string
}
enum EventRole {
ADMIN
COORDINATOR
JUDGE
PLAYER
REVIEWER
SPONSOR
}
1 ответ
Большая часть вашей модели точна. Есть несколько небольших изменений, которые вам нужно сделать:
- Использование
@relation
Директива: Вам это нужно только тогда, когда отношения неоднозначны. Пример самоотношения. Вам не нужно это в вашем случае. Это традиционный способ мышления ORM. - Обнуляемость в отношениях: рассмотрим
players: [User]!
отношения. Это говорит о том, что поле игроков не может быть нулевым. Это должен быть список. Но это делаетUser
как необязательный, что означает, что вы можете иметьplayers = [user1, null, user2]
, Вы можете не хотеть этого. Это применимо почти ко всем отношениям со многими. User
тип должен иметьteam
поле, которое не является обязательным. Будут некоторые пользователи, которые не будут членами какой-либо команды.
С вышеуказанной настройкой ваша схема будет выглядеть так:
type Event {
id: ID! @unique
# Note DOUBLE EXCLAMATION
# Ensure that User, as well as players, are not null.
players: [User!]!
# Note DOUBLE EXCLAMATION
# Ensure that Team and teams are not null.
teams: [Team!]!
}
type User {
id: ID! @unique
eventsPlayed: [Event!]!
team: Team
}
type Team {
id: ID! @unique
event: Event!
members: [User!]!
# Added an extra key for keeping track of past events if required
pastEvents: [Event!]!
}