在我们的应用程序中,用户可以是许多组织的成员。在查看网站时,他们通常是通过其中一个组织进行查看的。这是选定的组织。
下面的模型是最好的建模方式吗?有没有一种方法可以对它进行建模,这样你就不必在Membership
上有selectedBy
和selectedById
,而只需要在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
外键,而在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中为关系建模的最合理的方式。