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 多对多:必须依赖中间表,无法直接映射两张实体表
相关推荐
2401_891482172 小时前
将Python Web应用部署到服务器(Docker + Nginx)
jvm·数据库·python
为美好的生活献上中指2 小时前
*Java 沉淀重走长征路*之——《MyBatis与MyBatis-Plus一文打尽!》
java·jvm·maven·mybatis·mybatis-plus
Insist7532 小时前
案例二---集群修改物理IP和VIP
运维·网络·数据库
只能是遇见2 小时前
sql实战解析-sum()over(partition by xx order by xx)
数据库·sql
知识分享小能手3 小时前
PostgreSQL 入门学习教程,从入门到精通,PostgreSQL 16 内部结构深度解析 —语法、实现与实战案例(20)
数据库·学习·postgresql
IvorySQL3 小时前
官宣!全球 PostgreSQL 大神再度集结,HOW 2026 正式定档
数据库·postgresql·开源
盐水冰3 小时前
【烘焙坊项目】后端搭建(10) - 地址簿功能&用户下单&微信支付
java·数据库·后端
数据知道3 小时前
MongoDB热点数据识别:提升访问速度的缓存策略与实现
数据库·mongodb·缓存
一个天蝎座 白勺 程序猿3 小时前
KingbaseES数据库MySQL兼容性解析:从TCO账本到“傻瓜式“迁移的密码
android·数据库·mysql·kingbasees