如何在Prisma中为企业/个人/所有权定义多对多关系
正确的Prisma建模方案
你的核心问题在于未明确指定关联名称(当同一模型与另一模型存在多组关联时必须显式命名),以及部分字段的可空性不符合业务逻辑。以下是修正后的完整模型:
model Business { id String @id @default(uuid()) legalName String // 该企业被哪些主体持有(关联到BusinessOwner中作为被持有企业的记录) ownedBy BusinessOwner[] @relation("BusinessOwnedBy") // 该企业持有哪些其他企业(关联到BusinessOwner中作为持有方企业的记录) ownsBusinesses BusinessOwner[] @relation("BusinessOwns") } model Person { id String @id @default(uuid()) firstName String lastName String // 个人持有的企业(关联到BusinessOwner中作为持有方个人的记录) ownsBusinesses BusinessOwner[] @relation("PersonOwns") } model BusinessOwner { id String @id @default(uuid()) ownership Decimal // 持有比例,例如0.5代表50% // 被持有的企业(必填:每条所有权记录必须对应一个具体企业) business Business @relation("BusinessOwnedBy", fields: [businessId], references: [id]) businessId String // 持有该企业的企业(可选:与ownerPerson二选一) ownerBusiness Business? @relation("BusinessOwns", fields: [ownerBusinessId], references: [id]) ownerBusinessId String? // 持有该企业的个人(可选:与ownerBusiness二选一) ownerPerson Person? @relation("PersonOwns", fields: [ownerPersonId], references: [id]) ownerPersonId String? // 约束:必须指定至少一个持有主体 @@check(ownerPersonId IS NOT NULL OR ownerBusinessId IS NOT NULL) // 约束:同一主体不能重复持有同一企业(根据业务需求可选) @@unique([businessId, ownerPersonId]) @@unique([businessId, ownerBusinessId]) }
关键修正点说明
显式关联命名:
原模型中Business与BusinessOwner存在两组关联(作为被持有企业、作为持有方企业),Prisma无法自动区分,因此必须通过@relation("关联名称")显式标记每一组关联的双方。字段可空性调整:
businessId设为必填:每条所有权记录必须绑定一个具体的被持有企业,不能为空。业务逻辑约束:
- 通过
@@check确保每条记录必须指定个人或企业作为持有主体,避免无效的空记录。 - 新增
@@unique约束防止同一主体对同一企业重复创建所有权记录(可根据实际业务需求移除)。
- 通过
关联关系说明
Business.ownedBy:查询该企业的所有持有者(个人/企业)。Business.ownsBusinesses:查询该企业持有的其他企业。Person.ownsBusinesses:查询该个人持有的所有企业。BusinessOwner作为中间表,存储每一条所有权关系的具体信息(如持有比例)。
内容的提问来源于stack exchange,提问作者iurii
相关产品推荐
相关产品推荐

