0

在 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??????我什至正确地接近这个?

更多信息(以防万一)

我打算为创建团队创建一个拖放界面。那些列在Events.players其中但尚未被分配为 a 的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
}
4

1 回答 1

1

您的大部分模型都是准确的。您需要做一些小改动:

  1. 指令的使用@relation:只有在关系不明确时才需要它。例如,自我关系。在你的情况下你不需要它。这是一种传统的 ORM 思维方式。
  2. 关系中的可空性:考虑players: [User]!关系。它说玩家字段不能为空。它必须是一个列表。但它User是可选的,这意味着您可以拥有players = [user1, null, user2]. 你可能不想要这个。这适用于几乎所有的对多关系。
  3. Usertype 应该有一个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!]!
}
于 2019-01-02T07:09:21.810 回答