一、数据库三大实体关系一对一关系1:1核心场景两个实体相互唯一对应如「用户 - 用户详情」「身份证 - 公民」一个用户仅对应一份详情一份详情仅归属一个用户数据库设计细节无需中间表关联列外键可设置在任意一方两种常用实现方案普通外键方案在其中一张表添加外键列指向另一张表的主键且给该外键列添加「唯一约束UNIQUE」保证一对一避免一个主键对应多个外键值共享主键方案两张表使用相同的主键值其中一张表的主键同时作为另一张表的主键和外键无需额外添加唯一约束主键天然保证唯一性关联列规范✅ 必须添加外键约束FOREIGN KEY保证数据一致性避免出现不存在的主表主键值✅ 数据类型必须与主表主键完全一致如主表主键是BIGINT(20)外键也必须是BIGINT(20)避免类型转换异常和索引失效❌ 无需设置为自增主键自增主键是表自身的唯一标识关联列仅用于关联若设为自增会与主表主键脱节失去关联意义一对多关系1:N核心场景一方实体对应多个多方实体多方实体仅对应一方实体如「班级 - 学生」「部门 - 员工」一个班级有多个学生一个学生仅归属一个班级数据库设计细节无需中间表外键必须存在于「多」的一方表中核心考点原因「多」的一方存在多个数据关联同一个「一」方数据在外键在多方表中仅需添加一列无需冗余数据若放在一方表需存储多个多方主键不符合数据库范式示例班级表classes一有主键class_id学生表student多添加外键class_id指向classes.class_id并添加外键约束实体属性设计Java / 持久层「一」的一方包含集合对象属性如ListStudent students、SetEmployee employees用于存储对应的所有多方实体集合类型保证能容纳多个对象「多」的一方包含单个对象属性如Classes clazz、Department dept用于存储对应的唯一一方实体关联列规范与一对一一致外键匹配主表主键类型、添加外键约束、非自增多对多关系N:M核心场景双方实体均可对应对方的多个实体如「学生 - 课程」「用户 - 角色」一个学生可选多门课程一门课程可被多个学生选择数据库设计细节必须引入中间表又称关联表、连接表核心考点无例外原因两张表直接关联无法存储多对多的映射关系无法在学生表添加课程主键也无法在课程表添加学生主键都会造成大量冗余和数据混乱中间表的设计规范无额外业务字段按需添加如「学生 - 课程」中间表可添加score成绩字段核心字段是两个关联表的主键作为中间表的外键两个外键通常组合作为中间表的「复合主键」或添加单独的自增主键 两个外键的唯一约束保证关联关系的唯一性避免同一学生 - 课程组合重复存储示例学生表studentstudent_id主键、课程表coursecourse_id主键中间表student_course包含student_id外键关联student.student_id、course_id外键关联course.course_id持久层映射约束即使在 MyBatis 等持久层框架中多对多映射也必须依赖中间表无法直接通过两张实体表的字段建立映射框架底层仍需通过中间表完成关联查询和数据封装二、SQL 连接查询SQL 连接用于查询多张关联表的数据核心分为「内连接」和「外连接」其中外连接又包含左、右、全外连接常用左、右外连接核心连接类型及结果集连接类型关键字结果集详情核心考点是否返回 NULL 值内连接INNER JOININNER JOIN可省略 INNER仅返回左右表中匹配关联条件的记录即两表数据的交集否无匹配不返回左外连接LEFT OUTER JOINLEFT OUTER JOIN可省略 OUTER以左表为基准返回左表所有记录 右表中匹配关联条件的记录是右表无匹配时对应字段为 NULL右外连接RIGHT OUTER JOINRIGHT OUTER JOIN可省略 OUTER以右表为基准返回右表所有记录 左表中匹配关联条件的记录对应题 12是左表无匹配时对应字段为 NULL关键易错点解析误区 1「外连接返回并集」—— 表述不准确外连接并非严格意义上的数学并集而是「基准表全量数据 另一表交集数据」全外连接FULL OUTER JOIN才接近并集返回左右表所有记录双方无匹配均显示 NULLMySQL 不支持全外连接误区 2「外连接不会返回 NULL 值」—— 错误核心对应题 13D 选项外连接的核心特征就是「保留基准表全量数据」当另一表无匹配记录时对应的列会填充为 NULL这是外连接与内连接的核心区别之一补充连接查询的关联条件通常写在ON子句中而非WHERE子句ON用于指定表之间的关联关系WHERE用于过滤查询结果集三、关联列设计的通用规范关联列外键列是建立表之间关联的核心无论哪种实体关系关联列设计都需遵循以下通用规范也是题目中的高频考点数据一致性保障必须添加「外键约束FOREIGN KEY」限制关联列的值只能是主表主键的已存在值或 NULL若允许非强制关联防止出现无效关联数据如学生表的class_id不存在于班级表中数据类型匹配关联列的数据类型包括字段长度、是否无符号等必须与主表主键完全一致例如主表主键是INT(11) UNSIGNED关联列也必须是INT(11) UNSIGNED否则会出现关联查询失败、索引失效、数据插入异常等问题非自增约束关联列的作用是「关联主表主键」而非作为当前表的唯一标识因此无需也不应该设置为自增主键自增主键仅用于当前表的主键列保证当前表数据唯一标识可选唯一约束仅在一对一关系中关联列需要添加「唯一约束UNIQUE」保证一对一映射一对多、多对多关系中关联列不允许添加唯一约束需支持一个主表主键对应多个关联列值总结实体关系核心1:1无中间表外键 唯一约束、1:N无中间表外键在多方、N:M必须中间表SQL 连接核心内连接交集、左外左表全量 右表匹配、右外右表全量 左表匹配外连接会返回 NULL关联列核心外键约束、匹配主表主键类型、非自增MyBatis 多对多必须依赖中间表无法直接映射两张实体表