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



在我们的应用程序中,用户可以是许多组织的成员。在查看网站时,他们通常是通过其中一个组织进行查看的。这是选定的组织。

下面的模型是最好的建模方式吗?有没有一种方法可以对它进行建模,这样你就不必在Membership上有selectedByselectedById,而只需要在User上有一个selectedMembershipIdMembership的外键?

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外键,而在Membership侧只有selectedBy关系字段,如下所示:

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中为关系建模的最合理的方式。

最新更新