Self-relations
在数据库和 Prisma 模型中,自关联(Self-relations)指的是一个模型与自身的关联。这种关系可以是不同类型的,如一对一 (1-1)、一对多 (1-n)、多对多 (m-m)。下面我们详细讨论这些自关联及其定义方式和使用场景。
一对一 (1-1) 自关联
一对一自关联表示一个记录与同一模型中的另一个记录有唯一的关联。例如,一个员工可能有一个直属上级,而这个上级也是一个员工。
Prisma 示例
model Employee {
id Int @id @default(autoincrement())
name String
managerId Int? @unique
manager Employee? @relation("EmployeeManager", fields: [managerId], references: [id])
subordinates Employee? @relation("EmployeeManager")
}
在这个例子中,每个 Employee 可能有一个 manager,同时也可能是其他员工的 manager。
一对多 (1-n) 自关联
一对多自关联表示一个记录可以与同一模型中的多个记录关联。例如,一个部门可能有多个子部门,而每个子部门也可能有自己的子部门。
Prisma 示例
model Department {
id Int @id @default(autoincrement())
name String
parentId Int?
parent Department? @relation("DepartmentHierarchy", fields: [parentId], references: [id])
subDepartments Department[] @relation("DepartmentHierarchy")
}
在这个例子中,每个 Department 可能有一个 parent,同时也可能有多个 subDepartments。
多对多 (m-m) 自关联
多对多自关联表示一个记录可以与同一模型中的多个记录相互关联。例如,一个人可能有多个朋友,而这些朋友也可能有其他朋友。
隐式多对多自关联
model Person {
id Int @id @default(autoincrement())
name String
friends Person[] @relation("Friendship")
friendOf Person[] @relation("Friendship")
}
在这个例子中,每个 Person 可以有多个 friends,同时也可以是其他人的 friendOf。
显式多对多自关联
model Person {
id Int @id @default(autoincrement())
name String
friendships Friend[] @relation("Friendship")
friendOf Friend[] @relation("Friendship")
}
model Friend {
personId Int
friendId Int
person Person @relation(fields: [personId], references: [id])
friend Person @relation(fields: [friendId], references: [id])
@@id([personId, friendId])
}
在这个例子中,我们通过 Friend 中间表来管理 Person 之间的多对多关系。
区别总结
-
一对一 (1-1):
- 一个记录与同一模型中的另一个记录唯一关联。
- 使用场景:如员工与其直属上级的关系。
-
一对多 (1-n):
- 一个记录与同一模型中的多个记录关联。
- 使用场景:如部门与其子部门的关系。
-
多对多 (m-m):
- 一个记录可以与同一模型中的多个记录相互关联。
- 使用场景:如人际关系中的朋友关系。
选择哪种方式
选择哪种关系取决于你的具体需求:
- 一对一 (1-1):适用于必须唯一的直接关联。
- 一对多 (1-n):适用于层级结构或父子关系。
- 多对多 (m-m):适用于复杂的互相关联,如社交关系。
理解这些关系及其实现方式,有助于你在设计数据库模型时做出更合适的选择。