如何为多对多关系添加附加属性

How to add additional attribute to many-to-many relationship

我有一个数据库可以跟踪我的(注册)用户。每个用户都可以(默认情况下)是团队的一部分。一个团队将多个用户组合在一起。

由于用户可以属于多个团队,我希望他们能够打开和关闭某些团队。关闭后,团队的数据将不会在前端显示给该用户。开启多个组织时,所有数据同时显示。

所以我的问题是:我应该如何从架构上着手?有没有“正确”的做事方式?我将 Prisma 与 Planetscale (MySQL) 数据库一起使用,但我也非常感谢任何理论答案。

在 Prisma 中,我的(简化的)架构目前看起来像这样:

model User {
  id      String    @id @default(cuid())
  name    String?
  teams   Team[]
}

model Organization {
  id      String    @id @default(cuid())
  name    String
  users   User[]
}

从技术上讲,我认为我只想将团队标记为“活跃”或“不活跃”,但我不知道如何准确地做到这一点。简单地向团队添加一个 active Boolean 属性是行不通的,因为我无法分辨适用于哪个用户,对吗?

据我所知,唯一可行的方法是在我的用户 table 上同时拥有 ActiveTeam 参考和 InactiveTeam 参考,而不仅仅是团队参考。虽然这看起来确实不必要地复杂,但我希望有一种更简单的方法。

正如 @Barmar 所说,您可以使用联结 table 来完成此操作。

架构将如下所示:

model User {
  id   String  @id @default(cuid())
  name String?

  userTeams User_Team[]
}

model Team {
  id   String  @id @default(cuid())
  name String?

  userTeams User_Team[]
}

model User_Team {
  userId String
  user   User   @relation(fields: [userId], references: [id])
  teamId String
  team   Team   @relation(fields: [teamId], references: [id])

  isActive Boolean

  @@id([userId, teamId])
}

// Your other models ...