3.3-mapper映射文件+数据库实体关系设计:数据库实体关系设计、SQL 连接查询及MyBatis 多表映射

一、数据库三大实体关系

一对一关系(1:1)

  • 核心场景 :两个实体相互唯一对应,如「用户 - 用户详情」「身份证 - 公民」(一个用户仅对应一份详情,一份详情仅归属一个用户)

  • 数据库设计细节

    • 无需中间表,关联列(外键)可设置在任意一方,两种常用实现方案:

      1. 普通外键方案:在其中一张表添加外键列,指向另一张表的主键,且给该外键列添加「唯一约束(UNIQUE)」,保证一对一(避免一个主键对应多个外键值)
      2. 共享主键方案:两张表使用相同的主键值,其中一张表的主键同时作为另一张表的主键和外键,无需额外添加唯一约束,主键天然保证唯一性
    • 关联列规范:

      ✅ 必须添加外键约束(FOREIGN KEY),保证数据一致性(避免出现不存在的主表主键值)

      ✅ 数据类型必须与主表主键完全一致(如主表主键是BIGINT(20),外键也必须是BIGINT(20),避免类型转换异常和索引失效)

      ❌ 无需设置为自增主键(自增主键是表自身的唯一标识,关联列仅用于关联,若设为自增会与主表主键脱节,失去关联意义)

一对多关系(1:N)

  • 核心场景:一方实体对应多个多方实体,多方实体仅对应一方实体,如「班级 - 学生」「部门 - 员工」(一个班级有多个学生,一个学生仅归属一个班级)

  • 数据库设计细节

    • 无需中间表,外键必须存在于「多」的一方表中(核心考点),原因:「多」的一方存在多个数据关联同一个「一」方数据,在外键在多方表中仅需添加一列,无需冗余数据;若放在一方表,需存储多个多方主键,不符合数据库范式
    • 示例:班级表(classes,一)有主键class_id,学生表(student,多)添加外键class_id,指向classes.class_id,并添加外键约束
  • 实体属性设计(Java / 持久层)

    • 「一」的一方:包含集合对象属性 (如List<Student> studentsSet<Employee> employees),用于存储对应的所有多方实体,集合类型保证能容纳多个对象
    • 「多」的一方:包含单个对象属性 (如Classes clazzDepartment dept),用于存储对应的唯一一方实体
  • 关联列规范:与一对一一致,外键匹配主表主键类型、添加外键约束、非自增

多对多关系(N:M)

  • 核心场景 :双方实体均可对应对方的多个实体,如「学生 - 课程」「用户 - 角色」(一个学生可选多门课程,一门课程可被多个学生选择)

  • 数据库设计细节

    • 必须引入中间表(又称关联表、连接表)(核心考点,无例外),原因:两张表直接关联无法存储多对多的映射关系(无法在学生表添加课程主键,也无法在课程表添加学生主键,都会造成大量冗余和数据混乱)
    • 中间表的设计规范:
    1. 无额外业务字段(按需添加,如「学生 - 课程」中间表可添加score成绩字段),核心字段是两个关联表的主键,作为中间表的外键
    2. 两个外键通常组合作为中间表的「复合主键」(或添加单独的自增主键 + 两个外键的唯一约束),保证关联关系的唯一性(避免同一学生 - 课程组合重复存储)
    3. 示例:学生表(studentstudent_id主键)、课程表(coursecourse_id主键),中间表(student_course)包含student_id(外键关联student.student_id)、course_id(外键关联course.course_id
  • 持久层映射约束 :即使在 MyBatis 等持久层框架中,多对多映射也必须依赖中间表,无法直接通过两张实体表的字段建立映射,框架底层仍需通过中间表完成关联查询和数据封装

二、SQL 连接查询

SQL 连接用于查询多张关联表的数据,核心分为「内连接」和「外连接」,其中外连接又包含左、右、全外连接(常用左、右外连接):

核心连接类型及结果集

连接类型 关键字 结果集详情(核心考点) 是否返回 NULL 值
内连接(INNER JOIN) INNER JOIN(可省略 INNER) 仅返回左右表中匹配关联条件的记录(即两表数据的交集) 否(无匹配不返回)
左外连接(LEFT OUTER JOIN) LEFT OUTER JOIN(可省略 OUTER) 以左表为基准,返回左表所有记录 + 右表中匹配关联条件的记录 是(右表无匹配时,对应字段为 NULL)
右外连接(RIGHT OUTER JOIN) RIGHT OUTER JOIN(可省略 OUTER) 以右表为基准,返回右表所有记录 + 左表中匹配关联条件的记录(对应题 12) 是(左表无匹配时,对应字段为 NULL)

关键易错点解析

  • 误区 1:「外连接返回并集」------ 表述不准确,外连接并非严格意义上的数学并集,而是「基准表全量数据 + 另一表交集数据」,全外连接(FULL OUTER JOIN)才接近并集(返回左右表所有记录,双方无匹配均显示 NULL,MySQL 不支持全外连接)
  • 误区 2:「外连接不会返回 NULL 值」------ 错误核心(对应题 13D 选项),外连接的核心特征就是「保留基准表全量数据」,当另一表无匹配记录时,对应的列会填充为 NULL,这是外连接与内连接的核心区别之一
  • 补充:连接查询的关联条件通常写在ON子句中,而非WHERE子句,ON用于指定表之间的关联关系,WHERE用于过滤查询结果集

三、关联列设计的通用规范

关联列(外键列)是建立表之间关联的核心,无论哪种实体关系,关联列设计都需遵循以下通用规范,也是题目中的高频考点:

  1. 数据一致性保障 :必须添加「外键约束(FOREIGN KEY)」,限制关联列的值只能是主表主键的已存在值,或 NULL(若允许非强制关联),防止出现无效关联数据(如学生表的class_id不存在于班级表中)
  2. 数据类型匹配 :关联列的数据类型(包括字段长度、是否无符号等)必须与主表主键完全一致 ,例如主表主键是INT(11) UNSIGNED,关联列也必须是INT(11) UNSIGNED,否则会出现关联查询失败、索引失效、数据插入异常等问题
  3. 非自增约束 :关联列的作用是「关联主表主键」,而非作为当前表的唯一标识,因此无需也不应该设置为自增主键,自增主键仅用于当前表的主键列(保证当前表数据唯一标识)
  4. 可选唯一约束:仅在一对一关系中,关联列需要添加「唯一约束(UNIQUE)」,保证一对一映射;一对多、多对多关系中,关联列不允许添加唯一约束(需支持一个主表主键对应多个关联列值)

总结

  1. 实体关系核心:1:1(无中间表,外键 + 唯一约束)、1:N(无中间表,外键在多方)、N:M(必须中间表)
  2. SQL 连接核心:内连接(交集)、左外(左表全量 + 右表匹配)、右外(右表全量 + 左表匹配),外连接会返回 NULL
  3. 关联列核心:外键约束、匹配主表主键类型、非自增
  4. MyBatis 多对多:必须依赖中间表,无法直接映射两张实体表
相关推荐
段一凡-华北理工大学2 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化
oradh4 小时前
Oracle XTTS实现跨版本迁移和升级(Oracle 11g单库升级至19C RAC集群)
数据库·oracle·11g升级19c·xtts跨版本迁移和升级
z123456789865 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
程序猿DD5 小时前
一个 API Key,统一调用大模型、生图和联网搜索
数据库·网关
TlSfoward6 小时前
抓包代理链路下的 TLS 指纹变化分析 TLSFOWARD抓包工具
数据库·爬虫·网络协议·搜索引擎·php
数智化管理手记7 小时前
账龄分析手工统计易遗漏?自动账龄分析工具怎么搭建
大数据·网络·数据库·人工智能·数据挖掘
LabVIEW开发7 小时前
NI Package Manager安装LabVIEW时InternalServerError错误
网络·数据库·labview·labview知识·labview功能·labview程序
SelectDB7 小时前
PostgreSQL 实时同步到 Apache Doris:一站式 CDC 解决方案
数据库
欲速不达88207 小时前
Mysql并发DML锁等待的优化
数据库·mysql
Database_Cool_7 小时前
AI Agent 长期记忆怎么存?阿里云 PolarDB-X 对接 Mem0 记忆框架实践
数据库·阿里云