9. 数据库设计答辩
本章收录 46 道老师常问问题,高频题靠前。回答时尽量结合自己的项目举例。
1. 整体数据库设计思路与流程?
- 先梳理项目业务实体,提取用户、业务数据、权限等核心实体
- 根据业务关联设计表结构
- 遵循数据库三范式,合理设计主键、外键、索引
- 设置字段类型、长度、非空约束,减少冗余,保证数据完整性、一致性。
2. 主键、外键、索引的作用?
- 主键:唯一标识单条数据、非空唯一,精准查询数据
- 外键:关联多表关系,约束数据关联性,防止脏数据
- 索引:针对高频查询字段建立,大幅提升SQL查询效率,优化数据库性能。
3. 数据库三大范式详细解释与作用?
- 第一范式:字段原子性,不可再拆分
- 第二范式:消除部分依赖,所有字段依赖主键
- 第三范式:消除传递依赖,字段不间接依赖主键。遵循三范式最大限度减少数据冗余,避免数据更新、删除、插入异常。
4. 项目数据库优化的具体手段?
- 合理设计表结构、精简冗余字段
- 高频查询字段建立索引
- 避免select * 全表查询、避免模糊前置%
- 优化联表查询逻辑
- 对高频静态数据做缓存,降低数据库压力。
5. 多表联查的实现方式?
使用内连接、左连接、右连接实现多表关联查询,根据业务场景选用,优先左连接保证数据完整性,精准关联多表业务数据,满足复杂数据查询需求。
6. 为什么选 MySQL?
MySQL 开源关系型数据库,InnoDB 支持事务行锁,适合业务系统。
- 索引、事务、主从了解
- utf8mb4 字符集
- 答辩说明版本与引擎
结合毕设:结合本项目数据库表与 SQL,可指出具体类名、配置项或表结构,避免只背概念。
7. 如何设计 ER?
JDK 开发工具包(编译+运行),JRE 运行环境,JVM 执行字节码的虚拟机。
- 开发装 JDK,部署可只需 JRE(Boot jar 可带 JRE)
- JVM 负责 GC、类加载
- 答辩说清三者关系
结合毕设:结合本项目数据库表与 SQL,可指出具体类名、配置项或表结构,避免只背概念。
8. 范式到第几?有无反范式?
三范式减少冗余:1NF 原子性、2NF 消除部分依赖、3NF 消除传递依赖;报表可适度冗余。
- 设计权衡性能与规范
- 答辩说明表设计思路
- ER 与范式一致
结合毕设:结合本项目数据库表与 SQL,可指出具体类名、配置项或表结构,避免只背概念。
9. 索引如何选择?
索引加速查询,B+ 树结构;过多索引影响写入;遵循最左前缀联合索引。
- where/order by 字段考虑索引
- 避免函数包列导致失效
- 答辩指出项目索引字段
结合毕设:结合本项目数据库表与 SQL,可指出具体类名、配置项或表结构,避免只背概念。
10. 事务 ACID?
事务 ACID:原子性(全成或全回滚)、一致性、隔离性、持久性。
- 转账扣款+加款必须同事务
- @Transactional 保证
- 答辩举例业务场景
结合毕设:结合本项目数据库表与 SQL,可指出具体类名、配置项或表结构,避免只背概念。
11. 隔离级别与脏读幻读?
隔离级别:读未提交、读已提交、可重复读、串行化;越高越安全性能越低。
- 脏读/不可重复读/幻读
- MySQL InnoDB 默认可重复读
- 答辩了解概念
结合毕设:结合本项目数据库表与 SQL,可指出具体类名、配置项或表结构,避免只背概念。
12. EXPLAIN 看什么?
EXPLAIN 分析 SQL 执行计划:type、key、rows、Extra,查是否走索引。
- 避免 ALL 全表扫描
- 优化慢查询第一步
- 答辩带一条 SQL 演示
结合毕设:结合本项目数据库表与 SQL,可指出具体类名、配置项或表结构,避免只背概念。
13. 主键用自增还是 UUID?
数据源(DataSource)管理数据库连接,常用 Druid/HikariCP 连接池。
- 连接池复用连接,控制并发与超时
- 配置 URL、用户名、密码、最大连接数等
- 答辩可说明为何不用 DriverManager 每次新建连接
结合毕设:结合本项目数据库表与 SQL,可指出具体类名、配置项或表结构,避免只背概念。
14. 软删还是硬删?
逻辑删除用 deleted/is_deleted 标志位标记删除,查询默认带 deleted=0 条件。
- 数据可恢复,满足审计需求
- MyBatis-Plus 可用 @TableLogic 自动过滤
- 注意唯一索引与业务查询都要带删除条件
结合毕设:结合本项目数据库表与 SQL,可指出具体类名、配置项或表结构,避免只背概念。
15. 如何防超卖/负数库存?
事务保证一组 SQL 同成功同失败,Spring @Transactional 或数据库 BEGIN/COMMIT。
- 下单扣库存典型场景
- 隔离级别影响并发问题
- 答辩指出哪些 Service 加了事务
结合毕设:结合本项目数据库表与 SQL,可指出具体类名、配置项或表结构,避免只背概念。
16. InnoDB vs MyISAM?
InnoDB 支持事务与行级锁,默认引擎;MyISAM 表锁无事务,适合只读场景。
- 业务表选 InnoDB
- 聚簇索引
- 答辩说明引擎选择
结合毕设:结合本项目数据库表与 SQL,可指出具体类名、配置项或表结构,避免只背概念。
17. 聚簇索引?
索引加速查询,B+ 树结构;过多索引影响写入;遵循最左前缀联合索引。
- where/order by 字段考虑索引
- 避免函数包列导致失效
- 答辩指出项目索引字段
结合毕设:结合本项目数据库表与 SQL,可指出具体类名、配置项或表结构,避免只背概念。
18. 覆盖索引?
索引加速查询,B+ 树结构;过多索引影响写入;遵循最左前缀联合索引。
- where/order by 字段考虑索引
- 避免函数包列导致失效
- 答辩指出项目索引字段
结合毕设:结合本项目数据库表与 SQL,可指出具体类名、配置项或表结构,避免只背概念。
19. 联合索引顺序?
索引加速查询,B+ 树结构;过多索引影响写入;遵循最左前缀联合索引。
- where/order by 字段考虑索引
- 避免函数包列导致失效
- 答辩指出项目索引字段
结合毕设:结合本项目数据库表与 SQL,可指出具体类名、配置项或表结构,避免只背概念。
20. 索引失效例子?
索引加速查询,B+ 树结构;过多索引影响写入;遵循最左前缀联合索引。
- where/order by 字段考虑索引
- 避免函数包列导致失效
- 答辩指出项目索引字段
结合毕设:结合本项目数据库表与 SQL,可指出具体类名、配置项或表结构,避免只背概念。
21. 连接类型?
连接池预先创建并复用数据库连接,控制最大连接数、空闲回收与超时。
- 避免频繁创建连接的开销
- Druid/Hikari 提供监控与泄漏检测
- 答辩说明连接数配置依据
结合毕设:结合本项目数据库表与 SQL,可指出具体类名、配置项或表结构,避免只背概念。
22. 分页优化?
分页限制单次查询数据量,常用 PageHelper 或 LIMIT offset,size。
- 前端传 pageNum/pageSize,后端封装 PageInfo
- 深分页 offset 过大性能差,可延迟关联优化
- 答辩演示列表页分页接口与 SQL
结合毕设:结合本项目数据库表与 SQL,可指出具体类名、配置项或表结构,避免只背概念。
23. 深分页问题?
分页限制单次查询数据量,常用 PageHelper 或 LIMIT offset,size。
- 前端传 pageNum/pageSize,后端封装 PageInfo
- 深分页 offset 过大性能差,可延迟关联优化
- 答辩演示列表页分页接口与 SQL
结合毕设:结合本项目数据库表与 SQL,可指出具体类名、配置项或表结构,避免只背概念。
24. 锁类型?
简要结论:行锁表锁间隙锁。
关于「锁类型」,答辩建议按「概念解释 → 原理要点 → 项目应用」三步展开:
- 先用一句话说清定义或结论(如上)
- 补充 2~3 个技术要点或注意事项,体现理解深度
- 结合本项目数据库表与 SQL,结合自己的代码、配置或表结构举例,避免只背关键词
25. MVCC?
JDK 开发工具包(编译+运行),JRE 运行环境,JVM 执行字节码的虚拟机。
- 开发装 JDK,部署可只需 JRE(Boot jar 可带 JRE)
- JVM 负责 GC、类加载
- 答辩说清三者关系
结合毕设:结合本项目数据库表与 SQL,可指出具体类名、配置项或表结构,避免只背概念。
26. 死锁?
死锁四条件:互斥、占有且等待、不可抢占、循环等待;避免固定加锁顺序。
- tryLock 超时
- 银行家算法了解
- 答辩说明项目是否多线程
结合毕设:结合本项目数据库表与 SQL,可指出具体类名、配置项或表结构,避免只背概念。
27. 字符集?
简要结论:utf8mb4。
关于「字符集」,答辩建议按「概念解释 → 原理要点 → 项目应用」三步展开:
- 先用一句话说清定义或结论(如上)
- 补充 2~3 个技术要点或注意事项,体现理解深度
- 结合本项目数据库表与 SQL,结合自己的代码、配置或表结构举例,避免只背关键词
28. 金额 decimal?
JavaScript Number 精度有限,Long 型 ID 序列化 JSON 可能丢失,需转 String。
- @JsonSerialize 或全局 Jackson 配置
- 前端以字符串接收大整数
- 答辩说明雪花 ID 场景
结合毕设:结合本项目数据库表与 SQL,可指出具体类名、配置项或表结构,避免只背概念。
29. 时间类型?
简要结论:datetime / timestamp。
关于「时间类型」,答辩建议按「概念解释 → 原理要点 → 项目应用」三步展开:
- 先用一句话说清定义或结论(如上)
- 补充 2~3 个技术要点或注意事项,体现理解深度
- 结合本项目数据库表与 SQL,结合自己的代码、配置或表结构举例,避免只背关键词
30. 多对多?
简要结论:中间表。
关于「多对多」,答辩建议按「概念解释 → 原理要点 → 项目应用」三步展开:
- 先用一句话说清定义或结论(如上)
- 补充 2~3 个技术要点或注意事项,体现理解深度
- 结合本项目数据库表与 SQL,结合自己的代码、配置或表结构举例,避免只背关键词
31. 树形存储?
简要结论:parent_id。
关于「树形存储」,答辩建议按「概念解释 → 原理要点 → 项目应用」三步展开:
- 先用一句话说清定义或结论(如上)
- 补充 2~3 个技术要点或注意事项,体现理解深度
- 结合本项目数据库表与 SQL,结合自己的代码、配置或表结构举例,避免只背关键词
32. 唯一约束?
简要结论:业务唯一。
关于「唯一约束」,答辩建议按「概念解释 → 原理要点 → 项目应用」三步展开:
- 先用一句话说清定义或结论(如上)
- 补充 2~3 个技术要点或注意事项,体现理解深度
- 结合本项目数据库表与 SQL,结合自己的代码、配置或表结构举例,避免只背关键词
33. 外键?
简要结论:逻辑或物理。
关于「外键」,答辩建议按「概念解释 → 原理要点 → 项目应用」三步展开:
- 先用一句话说清定义或结论(如上)
- 补充 2~3 个技术要点或注意事项,体现理解深度
- 结合本项目数据库表与 SQL,结合自己的代码、配置或表结构举例,避免只背关键词
34. 字典表?
枚举/constants 管理订单状态等,状态机规定合法迁移,防止非法跳转。
- 如 待支付→已支付→已完成
- 更新时校验当前状态
- 答辩结合业务状态字段
结合毕设:结合本项目数据库表与 SQL,可指出具体类名、配置项或表结构,避免只背概念。
35. 乐观锁 version?
乐观锁用 version 字段:更新时 WHERE id=? AND version=?,成功后 version+1。
- 适合并发冲突较少的场景
- 失败则提示用户刷新重试
- 答辩对比悲观锁 SELECT FOR UPDATE
结合毕设:结合本项目数据库表与 SQL,可指出具体类名、配置项或表结构,避免只背概念。
36. SELECT FOR UPDATE?
统一异常处理避免把堆栈直接返回前端,提升体验与安全。
- @ControllerAdvice + @ExceptionHandler 捕获业务/系统异常
- 封装统一 Result(code/msg/data)
- 记录日志便于排错,答辩可展示全局异常类
结合毕设:结合本项目数据库表与 SQL,可指出具体类名、配置项或表结构,避免只背概念。
37. 备份?
MySQL 开源关系型数据库,InnoDB 支持事务行锁,适合业务系统。
- 索引、事务、主从了解
- utf8mb4 字符集
- 答辩说明版本与引擎
结合毕设:结合本项目数据库表与 SQL,可指出具体类名、配置项或表结构,避免只背概念。
38. 慢查询日志?
日志用于排错、审计与性能分析,常用 SLF4J + Logback/Log4j2。
- 分级别:ERROR/WARN/INFO/DEBUG
- 关键业务、异常、慢接口应记录
- 生产避免打印敏感信息与过量 DEBUG
结合毕设:结合本项目数据库表与 SQL,可指出具体类名、配置项或表结构,避免只背概念。
39. 连接池?
连接池预先创建并复用数据库连接,控制最大连接数、空闲回收与超时。
- 避免频繁创建连接的开销
- Druid/Hikari 提供监控与泄漏检测
- 答辩说明连接数配置依据
结合毕设:结合本项目数据库表与 SQL,可指出具体类名、配置项或表结构,避免只背概念。
40. NULL 坑?
简要结论:三值逻辑。
关于「NULL 坑」,答辩建议按「概念解释 → 原理要点 → 项目应用」三步展开:
- 先用一句话说清定义或结论(如上)
- 补充 2~3 个技术要点或注意事项,体现理解深度
- 结合本项目数据库表与 SQL,结合自己的代码、配置或表结构举例,避免只背关键词
41. 审计字段?
简要结论:创建/更新时间。
关于「审计字段」,答辩建议按「概念解释 → 原理要点 → 项目应用」三步展开:
- 先用一句话说清定义或结论(如上)
- 补充 2~3 个技术要点或注意事项,体现理解深度
- 结合本项目数据库表与 SQL,结合自己的代码、配置或表结构举例,避免只背关键词
42. 敏感加密?
日志脱敏对手机号、身份证等打码,防止敏感信息泄露。
- 自定义 log 格式或 AOP
- 接口返回也可 @JsonIgnore
- 答辩体现安全意识
结合毕设:结合本项目数据库表与 SQL,可指出具体类名、配置项或表结构,避免只背概念。
43. 权限账号?
权限设计常用 RBAC:用户—角色—权限,菜单与接口双重校验。
- 前端隐藏按钮不等于安全,后端必须鉴权
- 拦截器/过滤器校验登录态与角色
- 答辩演示管理员与普通用户差异
结合毕设:结合本项目数据库表与 SQL,可指出具体类名、配置项或表结构,避免只背概念。
44. 结合项目讲表?
Java 基础题答辩策略:先答概念,再指项目中类/方法/配置印证,最后说注意点。
- 准备 2~3 段可打开的核心代码
- 避免只背八股
- 体现真的写过代码
结合毕设:结合本项目数据库表与 SQL,可指出具体类名、配置项或表结构,避免只背概念。
45. 结合项目讲 SQL?
Java 基础题答辩策略:先答概念,再指项目中类/方法/配置印证,最后说注意点。
- 准备 2~3 段可打开的核心代码
- 避免只背八股
- 体现真的写过代码
结合毕设:结合本项目数据库表与 SQL,可指出具体类名、配置项或表结构,避免只背概念。
46. 最大设计体会?
简要结论:先理业务再落表。
关于「最大设计体会」,答辩建议按「概念解释 → 原理要点 → 项目应用」三步展开:
- 先用一句话说清定义或结论(如上)
- 补充 2~3 个技术要点或注意事项,体现理解深度
- 结合本项目数据库表与 SQL,结合自己的代码、配置或表结构举例,避免只背关键词