好的,阿杰!以下是根据《系统架构设计师(第2版)》第六章“数据库设计基础知识”整理的系统学习笔记,兼顾理论与实战建议,可用于复习或博客整理。
🧩 系统架构设计师(第2版)——第六章:数据库设计基础知识
一、数据库设计的目标
数据库设计是系统架构的重要组成部分,其目标主要包括:
- 数据一致性与完整性
- 保证数据在各种操作下保持正确性和逻辑完整性。
- 例如,通过约束、事务、触发器等保证业务规则。
- 高性能与可扩展性
- 支持大量读写、复杂查询和并发访问。
- 考虑索引、分区、分表、缓存策略。
- 可维护性与可演进性
- 数据模型应易于理解和扩展。
- 避免过度冗余,也不能过度规范化导致查询性能下降。
二、数据库建模基础
1. 实体-关系模型(ER 模型)
- 实体(Entity):数据对象,如用户、订单、商品。
- 属性(Attribute):实体的特征,如用户名、价格、数量。
- 关系(Relationship):实体之间的联系,如用户下单。
示例:
实体 | 属性 |
---|---|
用户(User) | 用户ID、用户名、邮箱、注册时间 |
订单(Order) | 订单ID、用户ID、商品ID、数量、总价、下单时间 |
商品(Product) | 商品ID、名称、库存、价格 |
ER图示意:
User ---< Order >--- Product
2. 数据库范式(Normalization)
数据库范式主要用于消除冗余,保证数据一致性。
范式 | 说明 |
---|---|
1NF(第一范式) | 属性原子化,不能有重复列 |
2NF(第二范式) | 满足 1NF,消除部分依赖 |
3NF(第三范式) | 满足 2NF,消除传递依赖 |
BCNF(Boyce-Codd) | 更严格的 3NF,解决特殊依赖问题 |
注意:过度规范化会影响性能,实际设计中需平衡规范化和查询效率。
三、表设计与约束
1. 主键(Primary Key)
- 唯一标识记录,不允许重复或 NULL。
- 可单列或多列组合。
2. 外键(Foreign Key)
- 用于保证表与表之间的关联性。
- 支持级联操作(删除/更新)。
3. 唯一约束(Unique)
- 保证字段值唯一,可用于非主键的唯一性保证。
4. 非空约束(NOT NULL)
- 保证字段必须有值。
5. 默认值(DEFAULT)
- 在插入数据时,如果未指定字段值,则使用默认值。
四、索引设计基础
1. 常见索引类型
类型 | 特点 | 使用场景 |
---|---|---|
单列索引 | 针对单个列创建 | 查询频繁的单列 |
组合索引 | 针对多列创建 | 多条件联合查询 |
唯一索引 | 保证唯一性 | 唯一约束字段 |
全文索引 | 支持模糊查询 | 文本搜索,如 MySQL FULLTEXT |
哈希索引 | 查找速度快,但不支持范围查询 | 内存数据库或 key-value |
2. 索引设计原则
- 常用于 WHERE、ORDER BY、GROUP BY 的列。
- 避免过多索引,降低写入性能。
- 考虑覆盖索引(Covering Index)优化查询。
五、数据库分库分表策略
1. 垂直拆分(按业务模块拆分)
- 不同业务模块使用不同数据库实例。
- 减少单库压力,提高隔离性。
2. 水平拆分(按数据量拆分)
- 同一张表按主键范围或哈希拆成多张表或多库。
- 支持高并发大数据量访问。
3. 分库分表实践
场景 | 方案 |
---|---|
用户表数据量大 | 按用户ID取模拆分成多表 |
订单表高并发 | 按下单日期或订单ID范围分库 |
⚡ 结合分布式缓存(Redis)、消息队列(MQ)可进一步提高系统吞吐。
六、事务与并发控制
1. 事务特性(ACID)
- A(Atomicity)原子性
- C(Consistency)一致性
- I(Isolation)隔离性
- D(Durability)持久性
2. 隔离级别
隔离级别 | 特点 | 可能问题 |
---|---|---|
READ UNCOMMITTED | 允许读取未提交数据 | 脏读 |
READ COMMITTED | 只能读已提交数据 | 不可重复读 |
REPEATABLE READ | 保证同一事务中重复读一致 | 幻读 |
SERIALIZABLE | 串行化执行 | 性能最差 |
3. 并发控制机制
- 悲观锁(Pessimistic Lock)
- 乐观锁(Optimistic Lock,版本号/时间戳)
七、设计实践建议
- 先建 ER 模型,再生成表,保证逻辑清晰。
- 索引需结合查询分析,避免盲目建索引。
- 规范化与反规范化结合,兼顾一致性与性能。
- 分库分表需预留扩展接口,避免未来迁移复杂。
- 事务粒度控制,避免长事务影响性能。
八、复习小结
- 数据库设计的核心是 一致性、性能、可维护性。
- ER 模型 + 范式设计是基础。
- 表约束和索引是保证数据完整性与查询效率的关键手段。
- 分库分表、事务与并发控制是大型系统设计必须考虑的问题。
发表回复