什么是多对多关系?
多对多关系(Many-to-Many)指两个模型之间可以互相关联多个记录。例如: 一个用户可以拥有多个角色,一个角色也可以属于多个用户。在 Prisma 中,多对多关系可以通过隐式或显式方式实现。
典型多对多场景
用户 ↔ 角色
User ↔ Role(权限系统)
文章 ↔ 标签
Post ↔ Tag(内容系统)
学生 ↔ 课程
Student ↔ Course(教育系统)
商品 ↔ 订单
Product ↔ Order(电商系统)
隐式多对多(Implicit Many-to-Many)
隐式多对多是 Prisma 自动帮你创建中间表的方式,你不需要手动定义 join table。适用于简单关系场景,不需要扩展字段。
schema.prisma
prisma
model User {
id Int @id @default(autoincrement())
name String
roles Role[]
}
model Role {
id Int @id @default(autoincrement())
name String
users User[]
}Prisma 会自动生成一个隐藏的中间表,例如 _UserToRole,用于维护关系。
显式多对多(Explicit Many-to-Many)
显式多对多需要手动创建中间表,可以扩展字段(如 createdAt、status 等),适用于复杂业务系统。
schema.prisma
prisma
model User {
id Int @id @default(autoincrement())
name String
userRoles UserRole[]
}
model Role {
id Int @id @default(autoincrement())
name String
userRoles UserRole[]
}
model UserRole {
userId Int
roleId Int
user User @relation(fields: [userId], references: [id])
role Role @relation(fields: [roleId], references: [id])
assignedAt DateTime @default(now())
@@id([userId, roleId])
}隐式 vs 显式
隐式
自动创建中间表,适合简单关系
显式
手动定义中间表,可扩展字段
数据查询方式
query.ts
typescript
const user = await prisma.user.findMany({
include: {
roles: true
}
});query-explicit.ts
typescript
const user = await prisma.user.findMany({
include: {
userRoles: {
include: {
role: true
}
}
}
});常见使用场景
真实业务应用
权限系统
用户与角色绑定
内容标签
文章与标签系统
电商系统
商品与订单关系
课程系统
学生与课程关系
设计建议
最佳实践
默认使用隐式
简单关系优先隐式多对多
需要扩展时用显式
比如记录时间、状态
避免复杂嵌套
多对多不要再嵌套多层 include
中间表加索引
提升 join 查询性能
下一步学习
关系专题完成
CRUD 操作
进入 Prisma Client 实战
查询优化
性能与索引优化
相关笔记
在数字化一期,此笔记未产生更深相关的共鸣分枝。