Java 面试中的数据库设计深度解析
🤟致敬读者
- 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉
📘博主相关
- 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息
文章目录
- Java 面试中的数据库设计深度解析
- 一、数据库设计核心原则
- 二、表关系设计(Java 开发重点)
- 三、高性能数据库设计策略
- 四、数据一致性保障
- 五、高频面试题精析
- 六、数据库安全设计
- 七、数据库设计评审 Checklist
- 总结:Java 开发者数据库设计要点
📃文章前言
- 🔷文章均为学习工作中整理的笔记。
- 🔶如有错误请指正,共同学习进步。
Java 面试中的数据库设计深度解析
数据库设计是后端开发的核心能力,也是 Java 面试的高频考点。本文从范式理论到实战案例,全面解析数据库设计的关键知识点,包含代码示例和优化策略。
一、数据库设计核心原则
-
三范式 vs 反范式
范式级别 核心要求 优点 缺点 第一范式 字段原子性(不可再分) 消除重复组 增加表数量 第二范式 消除部分依赖(主键决定所有字段) 减少数据冗余 查询复杂度增加 第三范式 消除传递依赖(非主键字段独立) 数据一致性高 多表连接影响性能 反范式化 故意冗余字段 提升查询性能 更新异常风险 实战选择:
- 金融系统 → 严格遵循三范式(强一致性)
- 电商系统 → 适度反范式(如订单冗余商品名称)
-
ER 建模方法
二、表关系设计(Java 开发重点)
-
一对一关系
场景:用户表与身份证表
设计选择:-- 方案1:主键共享(效率高) CREATE TABLE user (id BIGINT PRIMARY KEY,name VARCHAR(50) );CREATE TABLE id_card (user_id BIGINT PRIMARY KEY, -- 同时作为主键和外键card_number CHAR(18),FOREIGN KEY (user_id) REFERENCES user(id) );-- 方案2:外键唯一约束(更灵活) CREATE TABLE id_card (id BIGINT PRIMARY KEY,user_id BIGINT UNIQUE, -- 唯一约束保证一对一card_number CHAR(18),FOREIGN KEY (user_id) REFERENCES user(id) );
-
一对多关系
场景:部门与员工CREATE TABLE department (id BIGINT PRIMARY KEY,name VARCHAR(50) );CREATE TABLE employee (id BIGINT PRIMARY KEY,name VARCHAR(50),dept_id BIGINT,FOREIGN KEY (dept_id) REFERENCES department(id) -- 外键在多的一方 );-- Java 实体映射(JPA) @Entity public class Department {@Idprivate Long id;@OneToMany(mappedBy = "department")private List<Employee> employees; }
-
多对多关系
场景:学生与课程CREATE TABLE student (id BIGINT PRIMARY KEY,name VARCHAR(50) );CREATE TABLE course (id BIGINT PRIMARY KEY,title VARCHAR(100) );-- 关联表 CREATE TABLE student_course (student_id BIGINT,course_id BIGINT,PRIMARY KEY (student_id, course_id),FOREIGN KEY (student_id) REFERENCES student(id),FOREIGN KEY (course_id) REFERENCES course(id) );-- Spring Data JPA 实现 @Entity public class Student {@ManyToMany@JoinTable(name = "student_course",joinColumns = @JoinColumn(name = "student_id"),inverseJoinColumns = @JoinColumn(name = "course_id"))private Set<Course> courses; }
三、高性能数据库设计策略
-
分库分表设计
垂直拆分:-- 原用户表 CREATE TABLE user (id BIGINT,name VARCHAR(50),bio TEXT, -- 大字段last_login DATETIME );-- 拆分后 CREATE TABLE user_base (id BIGINT PRIMARY KEY,name VARCHAR(50),last_login DATETIME );CREATE TABLE user_profile (user_id BIGINT PRIMARY KEY,bio TEXT,FOREIGN KEY (user_id) REFERENCES user_base(id) );
水平拆分(Sharding):
// Sharding-JDBC 分片配置 shardingRule:tables:orders:actualDataNodes: ds${0..1}.orders_${0..15} # 16个分片tableStrategy:inline:shardingColumn: order_idalgorithmExpression: orders_${order_id % 16}
-
读写分离设计
// Spring Boot 多数据源配置 @Bean @Primary public DataSource primaryDataSource() {return DataSourceBuilder.create().url("jdbc:mysql://master:3306/db").username("user").password("pass").build(); }@Bean public DataSource replicaDataSource() {return DataSourceBuilder.create().url("jdbc:mysql://replica:3306/db").username("user").password("pass").build(); }// 使用注解切换数据源 @Transactional(readOnly = true) // 读操作走从库 public User getUser(Long id) {return userRepository.findById(id); }
四、数据一致性保障
-
ACID 事务实现
@Transactional(rollbackFor = Exception.class) public void transferMoney(Long from, Long to, BigDecimal amount) {// 扣款accountRepository.debit(from, amount);// 模拟异常if (amount.compareTo(BigDecimal.ZERO) < 0) {throw new RuntimeException("金额非法");}// 加款accountRepository.credit(to, amount); }
-
分布式事务方案
方案 原理 适用场景 2PC 两阶段提交 强一致性,低并发 TCC Try-Confirm-Cancel 高一致性要求 Saga 补偿事务 长事务场景 本地消息表 异步消息+本地事务 最终一致性,高并发 Seata TCC 示例:
@LocalTCC public interface AccountService {@TwoPhaseBusinessAction(name = "deduct", commitMethod = "commit", rollbackMethod = "rollback")boolean deduct(BusinessActionContext context, @BusinessActionContextParameter(paramName = "userId") Long userId,@BusinessActionContextParameter(paramName = "amount") BigDecimal amount);boolean commit(BusinessActionContext context);boolean rollback(BusinessActionContext context); }
五、高频面试题精析
-
如何设计电商系统的数据库?
核心表:优化点:
- 订单表垂直拆分(基础表 + 扩展表)
- 商品表增加冗余字段(销量、评价数)
- 价格字段使用
DECIMAL(10,2)
避免精度丢失
-
大字段存储如何优化?
- 方案1:拆分到单独表(如
product_descriptions
) - 方案2:使用文件存储(OSS)+ DB存路径
- 方案3:NoSQL 存储(MongoDB)
- 方案1:拆分到单独表(如
-
软删除 vs 硬删除?
-- 软删除设计 ALTER TABLE user ADD is_deleted TINYINT DEFAULT 0; UPDATE user SET is_deleted = 1 WHERE id = 1001; -- 删除操作/* 优点:保留历史数据,支持恢复缺点:查询需过滤,索引效率降低 */
六、数据库安全设计
-
权限控制
-- 最小权限原则 CREATE USER 'app_user'@'%' IDENTIFIED BY 'password'; GRANT SELECT, INSERT, UPDATE ON ecommerce.orders TO 'app_user'@'%'; REVOKE DELETE ON ecommerce.* FROM 'app_user'@'%'; -- 禁止删除
-
SQL 注入防护
// 错误示范(拼接SQL) String sql = "SELECT * FROM users WHERE name = '" + name + "'";// 正确方式:预编译语句 String sql = "SELECT * FROM users WHERE name = ?"; PreparedStatement stmt = conn.prepareStatement(sql); stmt.setString(1, name);
-
数据加密
// Java 字段级加密 @Convert(converter = CryptoConverter.class) private String bankCardNo;public class CryptoConverter implements AttributeConverter<String, String> {public String convertToDatabaseColumn(String attribute) {return AES.encrypt(attribute, SECRET_KEY);}public String convertToEntityAttribute(String dbData) {return AES.decrypt(dbData, SECRET_KEY);} }
七、数据库设计评审 Checklist
-
结构合理性
- 是否满足业务扩展需求?
- 表字段是否遵循命名规范?
- 多对多关系是否有关联表?
-
性能设计
- 高频查询字段是否建立索引?
- 是否避免
SELECT *
? - 大表是否设计分页查询?
-
安全合规
- 敏感字段是否加密?
- 是否禁用数据库管理员账号?
- 审计日志是否开启?
-
可维护性
- 是否有完善的注释?
- 是否避免存储过程?
- 变更是否有版本管理(Liquibase/Flyway)?
总结:Java 开发者数据库设计要点
-
设计原则
“先满足业务,再优化性能;
先保证正确性,再提升效率;
先考虑稳定性,再追求扩展” -
面试回答框架
1. 分析业务场景(电商/社交/金融) 2. 确定核心实体和关系 3. 选择范式级别 4. 设计表结构和索引 5. 规划分库分表策略 6. 设计数据一致性方案 7. 制定安全策略
-
经典案例参考
系统类型 设计重点 典型表数量 电商系统 订单分片、购物车优化 50+ 社交系统 好友关系图、动态流 30+ 物联网系统 时间序列数据存储 100+
掌握这些数据库设计知识和实战技巧,你将在 Java 面试中游刃有余,同时为构建高可用、高性能的系统打下坚实基础。
📜文末寄语
- 🟠关注我,获取更多内容。
- 🟡技术动态、实战教程、问题解决方案等内容持续更新中。
- 🟢《全栈知识库》技术交流和分享社区,集结全栈各领域开发者,期待你的加入。
- 🔵加入开发者的《专属社群》,分享交流,技术之路不再孤独,一起变强。
- 🟣点击下方名片获取更多内容🍭🍭🍭👇
相关文章:

Java 面试中的数据库设计深度解析
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Java 面试中的数据库设计深度解析一、数据库…...

国内首发!具有GPU算力的AI扫描仪
奥普思凯重磅推出的具有GPU算力的扫描仪,是一款真正意义上的AI扫描仪,奥普思凯将嵌有OCR发票识别核心的高性能NPU算力棒与高速扫描仪相结合,实现软件硬件相结合,采用一体化外观设计,实现高速扫描、快速识别表单&#x…...

【开发技巧指北】IDEA修改默认绑定Maven的仓库地址
【开发技巧指北】IDEA修改默认绑定Maven的仓库地址 Microsoft Windows 11 家庭中文版 IIntelliJ IDEA 2025.1.1.1 默认的IDEA是有自己捆绑的Maven的(这是修改完毕的截图) 修改默认的Maven配置,路径是IDEA安装路径下的plugins D:\Softwares\I…...
数据存储与运算
计算机中的数据存储与运算 输出地址后看不懂格式,为什么? 第一节:进制转换基础 ✅ 常见进制: 十进制(Decimal):日常使用的 0~9二进制(Binary):计算机底层使…...

【2025最新】Java图书借阅管理系统:从课程作业到实战应用的完整解决方案
【2025最新】Java图书借阅管理系统:从课程作业到实战应用的完整解决方案 目录 【2025最新】Java图书借阅管理系统:从课程作业到实战应用的完整解决方案**系统概述** **核心功能模块详解****1. 系统登录与权限控制****2. 借阅管理模块****3. 用户角色管理…...

springcloud openfeign 请求报错 java.net.UnknownHostException:
现象 背景 项目内部服务之间使用openfeign通过eureka注册中心进行服务间调用,与外部通过http直接调用。外部调用某个业务方提供的接口需要证书校验,因对方未提供证书故设置了忽略证书校验代码如下 Configuration public class IgnoreHttpsSSLClient {B…...

【harbor】--配置https
使用自建的 CA 证书来自签署和启用 HTTPS 通信。 (1)生成 CA认证 使用 OpenSSL 生成一个 2048位的私钥这是 自建 CA(证书颁发机构) 的私钥,后续会用它来签发证书。 # 1创建CA认证 cd 到harbor [rootlocalhost harbo…...
Oracle 临时表空间详解
Oracle 临时表空间详解 一 临时表空间概述 临时表空间(Temporary Tablespace)是Oracle数据库中用于存储临时数据的专用空间,主要用于: 排序操作(ORDER BY, GROUP BY等)哈希连接(HASH JOIN)临时表数据某些类型的索引创建临时LOB对象存储 二 临时表空间…...
深入理解享元模式:用Java实现高效对象共享
享元模式(Flyweight)的核心思想是对象复用,通过共享技术减少内存占用,就像"共享单车"一样让多个调用者共享同一组细粒度对象。 什么是享元模式? 享元模式是一种结构型设计模式,它通过共享技术有…...

OptiStruct实例:消声器前盖ERP分析(2)RADSND基础理论
13.2 Radiated Sound Output Analysis( RADSND ) RADSND 方法通过瑞利积分来求解结构对外的辐射噪声。其基本思路是分为两个阶段,如图 13-12 所示。 图13-12 结构辐射噪声计算示意图 第一阶段采用有限元方法,通过频响分析(模态叠加法、直接法)工况计算结…...

barker-OFDM模糊函数原理及仿真
文章目录 前言一、巴克码序列二、barker-OFDM 信号1、OFDM 信号表达式2、模糊函数表达式 三、MATLAB 仿真1、MATLAB 核心源码2、仿真结果①、barker-OFDM 模糊函数②、barker-OFDM 距离分辨率③、barker-OFDM 速度分辨率④、barker-OFDM 等高线图 四、资源自取 前言 本文进行 …...
Linux.docker.k8s基础概念
1.Linux基本命令 cat 查看文件内容。 cd 进入目标目录。 ll 查询当前路劲下文件的详细信息。 ls 查询当前路劲下的文件。 touch 建立一个文件。 mkdir 建立一个文件夹。 rm 删除文件或者目录。 mv 移动目录和重新命名文件。 unzip 解压。 top 查看当前线程的信息。 find …...
GIT命令行的一些常规操作
放弃修改 git checkout . 修改commit信息 git commit --amend 撤销上次本地commit 1、通过git log查看上次提交的哈希值 2、git reset --soft 哈希值 分支 1.创建本地分支 git branch 分支名 2.切换本地分支 git checkout mybranch; 3.创建一个新分支并…...
近期知识库开发过程中遇到的一些问题
我们正在使用Rust开发一个知识库系统,遇到了一些问题,在此记录备忘。 错误:Unable to make method calls because underlying connection is closed 场景:在docker中调用headless_chrome时出错 原因:为减小镜像大小&am…...

3.RV1126-OPENCV 图像叠加
一.功能介绍 图像叠加:就是在一张图片上放上自己想要的图片,如LOGO,时间等。有点像之前提到的OSD原理一样。例如:下图一张图片,在左上角增加其他图片。 二.OPENCV中图像叠加常用的API 1. copyTo方法进行图像叠加 原理…...

使用 HTML + JavaScript 实现一个日历任务管理系统
在现代快节奏的生活中,有效的时间管理变得越来越重要。本项目是一个基于 HTML 和 JavaScript 开发的日历任务管理系统,旨在为用户提供一个直观、便捷的时间管理工具。系统不仅能够清晰地展示当月日期,还支持事件的添加、编辑和删除操作&#…...

车载诊断架构SOVD --- 车辆发现与建连
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…...

Notepad++找回自动暂存的文件
场景: 当你没有保存就退出Notepad,下次进来Notepad会自动把你上次编辑的内容显示出来,以便你继续编辑。除非你手动关掉当前页面,这样Notepad就会删除掉自动保存的内容。 问题: Notepad会将自动保存的文件地址,打开Note…...

DL00924-基于深度学习YOLOv11的工程车辆目标检测含数据集
文末有代码完整出处 🚗 基于深度学习YOLOv11的工程车辆目标检测——引领智能识别新潮流! 🚀 随着人工智能技术的飞速发展, 目标检测 已经在各个领域取得了显著突破,尤其是在 工程车辆识别 这一关键技术上。今天&#…...

Axure RP11安装、激活、汉化
一:注册码 Axure RP11.0.0.4122在2025-5-29日亲测有效: 49bb9513c40444b9bcc3ce49a7a022f9...
【PhysUnits】15.6 引入P1后的左移运算(shl.rs)
一、源码 代码实现了Rust的类型级二进制数的左移运算(<<),使用类型系统在编译期进行计算。 use super::basic::{Z0, P1, N1, B0, B1, NonZero, NonOne, Unsigned}; use super::sub1::Sub1; use core::ops::Shl;// 左移运算(<<)…...

自编码器Auto-encoder(李宏毅)
目录 编码器的概念: 为什么需要编码器? 编码器什么原理? 去噪自编码器: 自编码器的应用: 特征解耦 离散隐表征 编码器的概念: 重构:输入一张图片,通过编码器转化成向量,要求再…...

数据结构之堆(topk问题、堆排序)
一、堆的初步认识 堆虽然是用数组存储数据的数据结构,但是它的底层却是另一种表现形式。 堆分为大堆和小堆,大堆是所有父亲大于孩子,小堆是所有孩子大于父亲。 通过分析我们能得出父子关系的计算公式,parent(child-1)/2ÿ…...

SpringBoot使用ffmpeg实现视频压缩
ffmpeg简介 FFmpeg 是一个开源的跨平台多媒体处理工具集,用于录制、转换、编辑和流式传输音频和视频。它功能强大,支持几乎所有常见的音视频格式,是多媒体处理领域的核心工具之一。 官方文档:https://ffmpeg.org/documentation.h…...
【Elasticsearch】exists` 查询用于判断文档中是否存在某个指定字段。它检查字段是否存在于文档中,并且字段的值不为 `null`
在 Elasticsearch 中,exists 查询用于判断文档中是否存在某个指定字段。它检查字段是否存在于文档中,并且字段的值不为 null。如果字段存在且有值(即使是空字符串或空数组),则 exists 查询会匹配该文档;如果…...

2025-05-31 Python深度学习9——网络模型的加载与保存
文章目录 1 使用现有网络2 修改网络结构2.1 添加新层2.2 替换现有层 3 保存网络模型3.1 完整保存3.2 参数保存(推荐) 4 加载网络模型4.1 加载完整模型文件4.2 加载参数文件 5 Checkpoint5.1 保存 Checkpoint5.2 加载 Checkpoint 本文环境: Py…...

长安链起链调用合约时docker ps没有容器的原因
在调用这个命令的时候,发现并没有出现官方预期的合约容器,这是因为我们在起链的时候没有选择用docker的虚拟环境,实际上这不影响后续的调用,如果想要达到官方的效果那么你只需要在起链的时候输入yes即可,如图三所示...

Appium+python自动化(七)- 认识Appium- 上
简介 经过前边的各项准备工作,终于才把appium搞定。 一、appium自我介绍 appium是一款开源的自动化测试工具,可以支持iOS和安卓平台上的原生的,基于移动浏览器的,混合的应用(APP)。 1、 使用appium进…...
数据中心双活架构解决方案
数据中心双活架构解决方案 数据中心双活架构(Active-Active Data Center)旨在实现业务高可用、负载均衡和灾难自动切换。以下是完整的解决方案,涵盖架构设计、关键技术、实施步骤及最佳实践。 1. 双活架构设计 1.1 基本架构模型 同城双活(Metro Active-Active) 两个数据…...
YOLOv5 详解:从原理到实战的全方位解析
在计算机视觉领域,目标检测作为核心任务之一,始终吸引着众多研究者和开发者的目光。YOLO(You Only Look Once)系列算法凭借其高效、准确的特点,在目标检测领域占据重要地位。而 YOLOv5 作为 YOLO 系列算法的重要成员&a…...