数据库设计与优化
案例分析高频考点。必背:三大范式、反规范化、读写分离、分库分表、CAP/BASE、NoSQL
一、关系数据库设计 6 步
- 需求分析 → 数据流图 DFD、数据字典 DD
- 概念结构设计 → E-R 图
- 逻辑结构设计 → E-R 图转关系模式 + 规范化
- 物理结构设计 → 选择存储结构 + 索引
- 数据库实施
- 数据库运行与维护
口诀:"需 · 概 · 逻 · 物 · 实 · 维"
二、范式与反规范化 ⭐⭐⭐
三大范式(必背定义)
1NF原子性:每列不可再分
2NF在 1NF 基础上,非主属性完全依赖主键(消除部分依赖)
3NF在 2NF 基础上,非主属性不传递依赖于主键(消除传递依赖)
BCNF在 3NF 基础上,每个决定因素都是候选键
4NF消除非平凡的多值依赖
记忆:1 原子 · 2 全依 · 3 不传 · BC 决定皆候选
反规范化(必考)
定义
为提高查询性能,故意违背规范化要求,引入冗余/聚合/合并表等手段。本质是 用空间换时间。
优点
- 减少连接、提高查询性能
- 减少应用层逻辑复杂度
- 易于报表/分析
缺点
- 数据冗余、占用空间
- 更新代价高(多处修改)
- 易产生不一致 → 需触发器/异步同步
常见反规范化技术
- 增加冗余列(查询常用列复制过来)
- 增加派生列(总分、平均值)
- 重新组表(经常连接的两张表合并)
- 水平分割表(按行分,如按地区)
- 垂直分割表(按列分,热点列与冷数据分开)
三、读写分离 + 主从复制 ⭐⭐
应用 ┌────┴────┐ [写主库] [读从库1][读从库2] │ ←─── 主从复制 ───→ └────────┘
收益分担读压力 + 故障切换
问题主从延迟 → 写后读不一致
对策关键写后读走主库 / 半同步复制 / 引入消息队列异步通知
四、分库分表 ⭐⭐⭐
类型
- 垂直分库:按业务拆分多个数据库(订单库、用户库)
- 垂直分表:按列拆,热点列与冷列分离
- 水平分库:同一张表的数据按规则散到多个库
- 水平分表(分片):同一张表数据按规则拆为多张
分片策略
- 哈希分片:user_id % N → 数据均匀,扩容麻烦
- 范围分片:按时间/ID 区间 → 易扩容,易热点
- 一致性哈希:扩容影响小
- 路由表:灵活,但需维护元数据
带来的问题(必背)
- 跨库 Join 困难 → 应用层关联 / 冗余字段
- 分布式事务 → Saga / TCC / 消息
- 分布式 ID → 雪花算法 / UUID / Leaf
- 跨库分页排序 → 应用层归并、ES 辅助
- 数据迁移 → 双写、影子库、灰度
五、CAP / BASE / ACID ⭐⭐⭐
ACID(传统关系数据库事务)
A原子性 Atomicity:全部成功或全部回滚
C一致性 Consistency:事务前后数据一致
I隔离性 Isolation:多事务并发互不干扰
D持久性 Durability:提交后永久保存
CAP 定理
CAP:分布式系统三选二
Consistency 一致性 / Availability 可用性 / Partition tolerance 分区容忍
分布式必有网络分区,所以必须保 P,只能在 CP 或 AP 中二选一。
CP 例:ZooKeeper、HBase、Redis Cluster(默认 CP)
AP 例:Eureka、Cassandra、DynamoDB
BASE
BABasically Available 基本可用(允许损失部分可用性)
SSoft state 软状态(允许中间状态)
EEventually consistent 最终一致
BASE 是 AP 系统的指导思想,牺牲强一致换可用性。
六、NoSQL 4 大分类 ⭐⭐
| 类型 | 代表 | 适用 |
|---|---|---|
| 键值 Key-Value | Redis、Memcached、DynamoDB | 缓存、会话、计数 |
| 列族 Column Family | HBase、Cassandra | 大数据、宽表、时序 |
| 文档 Document | MongoDB、CouchDB | 半结构化、内容管理 |
| 图 Graph | Neo4j、JanusGraph | 关系网络、推荐、社交 |
口诀:"K · 列 · 文 · 图" 4 类
七、数据仓库 / 数据集市
数据仓库特点(必背 4 性):
- 面向主题:按业务主题组织,非应用
- 集成的:来自多个源系统,经 ETL
- 非易失:历史数据,不修改
- 随时间变化:有时间维度
口诀:"主 · 集 · 非 · 时"
建模方式
- 星型模型:1 事实表 + 多维度表(简单、冗余)
- 雪花模型:维度表再规范化(复杂、节省空间)
- 事实星座:多个事实表共享维度
八、答题模板
题型:数据库性能优化方案?
- SQL/索引层:建合适索引、避免全表、避免 SELECT *
- 表结构层:反规范化、垂直/水平拆分、合理字段类型
- 架构层:读写分离、分库分表、主从复制
- 缓存层:Redis 多级缓存
- 异步层:消息队列削峰
- NoSQL 辅助:ES 做搜索、HBase 存历史
题型:为什么要反规范化?
"完全规范化会导致表过多 → 查询连接代价高 → 性能下降。反规范化通过 引入冗余 减少连接,以 空间换时间,但会带来 更新代价 和 一致性问题,需要通过触发器、应用层同步或异步消息保证一致。"
✅ 自测
1. 3NF 的定义?BCNF 比 3NF 严格在哪?
2. 反规范化的 5 种具体技术?
3. CAP 三个字母分别是什么,为何只能选两个?
4. NoSQL 4 大分类及代表产品?
📗 高频专题 · 数据库 完