Как определить схему для отношений событий, команд и участников - PullRequest
0 голосов
/ 01 января 2019

В 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 Ответ

0 голосов
/ 02 января 2019

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

  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!]!
}
...