跳到主要内容

关联关系详解

什么是关联关系

关联关系是指数据模型之间的连接关系,通过关联字段将不同模型的数据关联起来,实现数据之间的逻辑连接。

新建关联关系时,系统会在两个数据模型中分别建立关联字段,用于存储关联数据的 _id

⚠️ 注意: MySQL数据模型中的关联关系字段是通过中间表进行关联的,因此不能直接通过SQL的JOIN语句进行查询。需要使用数据模型提供的关联查询方法来获取关联数据。

常见的关联关系场景:

  • 学生属于某个班级(学生 → 班级)
    • 学生模型关联字段:所属班级
    • 班级模型关联字段:学生列表
  • 文章有多个评论(文章 → 评论)
    • 文章模型关联字段:评论列表
    • 评论模型关联字段:所属文章
  • 用户有一个个人资料(用户 → 个人资料)
    • 用户模型关联字段:个人资料
    • 个人资料模型关联字段:所属用户

关联关系类型

一对一(1:1)

一个记录只能关联另一个模型的一个记录,双方都是唯一对应关系。

示例: 用户 ↔ 个人资料

// 用户模型
{
name: "张三",
profile: {
_id: "profile_123"
}
}

// 个人资料模型
{
_id: "profile_123",
avatar: "avatar.jpg",
bio: "个人简介"
}

一对多(1:N)

一个记录可以关联另一个模型的多个记录。

示例: 班级 ↔ 学生

// 班级模型
{
name: "一年级1班",
students: [
{ _id: "student_1" },
{ _id: "student_2" }
]
}

多对一(N:1)

多个记录关联另一个模型的一个记录。

示例: 学生 ↔ 班级

// 学生模型
{
name: "小明",
class: {
_id: "class_123"
}
}

多对多(M:N)

多个记录可以关联另一个模型的多个记录。

示例: 学生 ↔ 课程

// 学生模型
{
name: "小明",
courses: [
{ _id: "course_1" }, // 语文
{ _id: "course_2" } // 数学
]
}

支持的数据库类型

数据库类型支持的关联关系
数据库(文档型)一对一、一对多、多对一
数据库(MySQL)一对一、一对多、多对一、多对多
自有MySQL数据库一对一、一对多、多对一、多对多

关联关系操作

查询操作

💡 注意: 对于MySQL数据库,关联查询必须使用数据模型提供的查询方法,不支持直接使用SQL JOIN语句。

查询结果包含关联数据

// 查询文章及其评论
const { data } = await models.post.get({
filter: {
where: {
_id: { $eq: "post_123" }
}
},
select: {
_id: true,
title: true,
content: true,
// 包含关联的评论数据
comments: {
_id: true,
content: true,
createdAt: true
}
}
});

根据关联条件过滤

// 查询有评论的文章
const { data } = await models.post.list({
filter: {
relateWhere: {
comments: {
where: {
content: { $nempty: true }
}
}
}
},
select: {
_id: true,
title: true,
comments: {
content: true
}
}
});

创建操作

💡 注意:新增关联关系字段时,需要以 {_id: xxx} 格式传入,其中 xxx 为关联数据的 _id,无需传入其他字段。

// 创建学生并关联班级和课程
const { data } = await models.student.create({
data: {
name: "小明",
age: 8,
// 关联班级(多对一)
class: {
_id: "class_123"
},
// 关联多个课程(多对多)
courses: [
{ _id: "course_1" },
{ _id: "course_2" }
]
}
});

更新操作

💡 注意:更新关联关系字段时,需要以 {_id: xxx} 格式传入,其中 xxx 为关联数据的 _id,无需传入其他字段。

// 更新学生的班级
const { data } = await models.student.update({
filter: {
where: {
_id: { $eq: "student_123" }
}
},
data: {
class: {
_id: "new_class_456"
}
}
});

删除操作

配置关联关系时,可以设置不同的删除行为:

  • 删除关联模型数据:删除主记录时,同时删除关联的记录
  • 不删除关联模型数据:仅删除主记录,保留关联记录
  • 禁止删除存在关联关系的数据:如果存在关联记录,则禁止删除主记录

最佳实践

设计原则

  1. 合理选择关联类型:根据实际业务需求选择合适的关联关系类型
  2. 避免过深嵌套:深层嵌套查询会影响性能,建议控制在 3 层以内
  3. 精确字段选择:仅查询必要的关联字段,减少数据传输量
  4. 避免循环引用:防止模型之间形成循环关联,导致查询死循环

性能优化

  1. 合理使用索引:为关联字段建立索引,提升查询效率
  2. 分页查询:对于大量关联数据,使用分页避免一次性加载过多数据
  3. 缓存策略:对于频繁查询的关联数据,考虑使用缓存机制

通过合理使用关联关系,可以构建灵活高效的数据模型,满足复杂业务场景需求。