在 Prisma 中模拟也有 "selected" 对象的一对多关系的最佳方法是什么?

What is the best way to model a one-to-many relationship that also has a "selected" object in Prisma?

在我们的应用中,一个用户可以是多个组织的成员。在查看站点时,他们通常是通过这些组织之一查看的。这是选定的组织。

下面的模型是最好的建模方法吗?有没有办法对其进行建模,这样您就不必在 Membership 上使用 selectedByselectedById,只需在 User 上使用 selectedMembershipId使用 Membership?

的外键
model User {
  id                 Int          @id @default(autoincrement())
  memberships        Membership[] @relation("Memberships")
  selectedMembership Membership?  @relation("Selection")
}
model Membership {
  id           Int          @id @default(autoincrement())
  user         User         @relation("Memberships", fields: [userId], references: [id])
  userId       Int
  selectedBy   User?        @relation("Selection", fields: [selectedById], references: [id])
  selectedById Int?          @unique
  organization Organization @relation(fields: [orgId], references: [id])
  orgId        Int
  role         MemberRole

  @@unique([userId, orgId])
}

不可能完全做您希望做的事。 prisma 中关系的语法要求有一个关系字段(据我所知,这是你不希望在你的模式中有的)。

因为它是一对一的关系,如果你愿意,你可以反过来做,在 User 边有一个 selectedMembershipId 外键,只有selectedBy Membership 侧的关系字段如下所示:

model User {
  id                 Int          @id @default(autoincrement())
  memberships        Membership[] @relation("Memberships")
  selectedMembership Membership?  @relation("Selection", fields: [selectedMembershipId], references: [id])
  selectedMembershipId       Int?         @unique

}

model Membership {
  id         Int   @id @default(autoincrement())
  user       User  @relation("Memberships", fields: [userId], references: [id])
  userId     Int
  selectedBy User? @relation("Selection")
  ...
}

但是,对于保留外键的哪一方来说,这确实是一个偏好问题。在我看来,您处理模式的方式是在 Prisma 中为关系建模的最合理方式。