好的,阿杰!以下是根据《系统架构设计师(第2版)》第六章“数据库设计基础知识”整理的系统学习笔记,兼顾理论与实战建议,可用于复习或博客整理。


🧩 系统架构设计师(第2版)——第六章:数据库设计基础知识

一、数据库设计的目标

数据库设计是系统架构的重要组成部分,其目标主要包括:

  1. 数据一致性与完整性
    • 保证数据在各种操作下保持正确性和逻辑完整性。
    • 例如,通过约束、事务、触发器等保证业务规则。
  2. 高性能与可扩展性
    • 支持大量读写、复杂查询和并发访问。
    • 考虑索引、分区、分表、缓存策略。
  3. 可维护性与可演进性
    • 数据模型应易于理解和扩展。
    • 避免过度冗余,也不能过度规范化导致查询性能下降。

二、数据库建模基础

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,版本号/时间戳)

七、设计实践建议

  1. 先建 ER 模型,再生成表,保证逻辑清晰。
  2. 索引需结合查询分析,避免盲目建索引。
  3. 规范化与反规范化结合,兼顾一致性与性能。
  4. 分库分表需预留扩展接口,避免未来迁移复杂。
  5. 事务粒度控制,避免长事务影响性能。

八、复习小结

  • 数据库设计的核心是 一致性、性能、可维护性
  • ER 模型 + 范式设计是基础。
  • 表约束和索引是保证数据完整性与查询效率的关键手段。
  • 分库分表、事务与并发控制是大型系统设计必须考虑的问题。