Как определить схему для отношений событий, команд и участников

В 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: ?????)
  ...
}

Ограничения

  1. каждый team member должен быть в Event.players
  2. каждый 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 ответ

Большая часть вашей модели точна. Есть несколько небольших изменений, которые вам нужно сделать:

  1. Использование @relation Директива: Вам это нужно только тогда, когда отношения неоднозначны. Пример самоотношения. Вам не нужно это в вашем случае. Это традиционный способ мышления ORM.
  2. Обнуляемость в отношениях: рассмотрим players: [User]! отношения. Это говорит о том, что поле игроков не может быть нулевым. Это должен быть список. Но это делает User как необязательный, что означает, что вы можете иметь players = [user1, null, user2], Вы можете не хотеть этого. Это применимо почти ко всем отношениям со многими.
  3. 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!]!
}
Другие вопросы по тегам