数据库设计基础

发布于:2026-06-01 #数据库#设计#基础 共 1,204 字 约 4 分钟

数据库设计需要理解业务中的数据、关系和约束,再将其转化为可被数据库存储查询的结构。

数据库设计流程

Text
UTF-8|1 Line|
需求分析 -> 概念结构设计 -> 逻辑结构设计 -> 物理结构设计 -> 实施 -> 运维

三层模式结构

层级说明
外模式用户看到的局部视图
概念模式数据库整体逻辑结构
内模式物理存储方式

两层映射保证数据独立性:

  • 外模式/概念模式映射 → 逻辑独立性
  • 概念模式/内模式映射 → 物理独立性

E-R 模型

E-R 图要素:

元素说明
实体可独立存在的对象(用户、商品)
属性实体的特征(用户名、价格)
关系实体之间的联系(下单、包含)

关系类型

类型示例
1
用户 ↔ 身份证
1
用户 ↔ 订单
M
学生 ↔ 课程 (需中间表)

E-R 模型转关系模型

E-R 元素关系模型
实体一张表
属性表中的字段
主键唯一标识记录
1
关系
”多”方加外键
M
关系
新建中间表
SQL
UTF-8|12 Lines|
CREATE TABLE users (
  id BIGINT PRIMARY KEY,
  name VARCHAR(50) NOT NULL,
  email VARCHAR(100) UNIQUE
);

CREATE TABLE orders (
  id BIGINT PRIMARY KEY,
  user_id BIGINT NOT NULL,
  status VARCHAR(20) NOT NULL,
  FOREIGN KEY (user_id) REFERENCES users(id)
);

关系模型核心概念

术语说明
关系一张表
元组一行记录
属性一列字段
候选键能唯一标识元组的最小属性集
主键从候选键中选出的主要标识
外键引用其他表主键的字段

关系完整性约束

  1. 实体完整性 — 主键不能为空且不重复
  2. 参照完整性 — 外键必须存在或为 null
  3. 用户自定义完整性 — 业务规则 (如 price >= 0)

范式化

函数依赖

Text
UTF-8|1 Line|
X -> Y   (X 能唯一确定 Y)
  • 部分函数依赖: (学号, 课程号) → 学生姓名 (姓名只依赖学号)
  • 传递函数依赖: 学号 → 学院ID → 学院名

三范式

范式要求
1NF字段不可再分 (原子性)
2NF在 1NF 基础上,非主键字段完全依赖于主键
3NF在 2NF 基础上,无传递函数依赖
BCNF每个决定因素都是候选键

模式分解

范式化通过模式分解实现,需保证:

  • 无损连接 — 分解后可通过连接还原
  • 保持依赖 — 分解后不丢失函数依赖

反范式化

在查询频繁的场景中,有意保留冗余数据以提升性能,如订单快照商品名称和价格。

Text
UTF-8|1 Line|
适用场景:高频查询、关联成本高、需要历史快照、读写少

事务 ACID

特性说明
原子性全部成功或全部回滚
一致性事务前后满足所有约束
隔离性并发事务互不干扰
持久性提交后结果永久保存

并发问题

问题说明
脏读读到未提交事务的数据
不可重复读同一事务两次读同一行结果不同
幻读同一事务两次查询范围,结果集不同

  • 共享锁 (S锁):读操作使用,允许多个事务同时读
  • 排他锁 (X锁):写操作使用,禁止其他事务读写

两段锁协议:事务分扩展阶段(只加锁)和收缩阶段(只释放锁),可保证可串行化。

其他约束

SQL
UTF-8|6 Lines|
CREATE TABLE products (
  id BIGINT PRIMARY KEY,
  name VARCHAR(100) NOT NULL,
  price DECIMAL(10, 2) CHECK (price >= 0),
  stock INT DEFAULT 0
);

设计检查清单

  1. 梳理业务流程和数据流向
  2. 识别实体、属性和关系
  3. 绘制 E-R 图
  4. E-R 图转表结构
  5. 确定主键、外键和约束
  6. 分析查询场景并索引
  7. 范式化减少冗余
  8. 必要时反范式化优化查询