什么是一对一关系?
一对一关系(One-to-One)指的是两个模型之间的唯一对应关系。例如:一个用户只有一个个人资料(User ↔ Profile),一个国家只有一个首都(Country ↔ Capital)。在 Prisma 中,一对一关系通过唯一约束(@unique)实现。
常见一对一关系场景
用户 ↔ 资料
User 与 Profile 一对一关系
员工 ↔ 工号信息
Employee 与 EmployeeCard
账号 ↔ 设置
Account 与 Settings
订单 ↔ 发票
Order 与 Invoice
Prisma 一对一关系定义方式
在 Prisma 中,一对一关系通常通过外键 + @unique 约束来实现。外键字段必须唯一,否则关系会变成一对多。
schema.prisma
prisma
model User {
id Int @id @default(autoincrement())
email String @unique
profile Profile?
}
model Profile {
id Int @id @default(autoincrement())
bio String
userId Int @unique
user User @relation(fields: [userId], references: [id])
}关系字段解析
关键字段说明
userId
外键字段,用于关联 User 表
@unique
保证一个 Profile 只能对应一个 User
@relation
定义模型之间的关联规则
Profile?
表示该关系是可选的(可为空)
双向访问关系
Prisma 支持双向关系访问,你可以从 User 访问 Profile,也可以从 Profile 访问 User。
query.ts
typescript
const user = await prisma.user.findUnique({
where: { id: 1 },
include: { profile: true }
});
const profile = await prisma.profile.findUnique({
where: { id: 1 },
include: { user: true }
});关系设计注意事项
最佳实践
外键放在从表
避免双向维护数据,提高一致性。
必须加 @unique
否则关系会变成一对多。
避免循环依赖
设计模型时避免复杂循环引用。
合理使用 optional
根据业务决定是否允许 null。
常见错误
schema.prisma
prisma
model Profile {
id Int @id @default(autoincrement())
userId Int // ❌ 错误:没有 @unique
user User @relation(fields: [userId], references: [id])
}如果没有 @unique,userId 会变成普通外键,从而允许多个 Profile 指向同一个 User,这就变成了一对多关系,而不是一对一关系。
下一步学习
关系进阶
一对多关系
User ↔ Posts
多对多关系
User ↔ Roles
相关笔记
在数字化一期,此笔记未产生更深相关的共鸣分枝。