Skip to main content

数据库设计

设计步骤

1、抽取实体

2、分析实体包含哪些属性

3、考虑实体和实体之间的关系:1:1,1:N,M:N

1、需求分析
明确系统要解决的问题;
收集用户需求,分析系统中涉及的数据及其使用方式;
输出结果:数据需求说明书。

2、概念结构设计
使用 E-R 图(实体-联系图) 描述现实世界中的实体、属性及其关系;
输出结果:E-R 图。

3、逻辑结构设计
E-R 图转换为关系模型(表结构);
确定主键、外键、字段类型、约束条件;
输出结果:关系模式设计表。

4、物理结构设计
确定数据在数据库中的物理存储结构;
优化索引、分区、缓存策略;
输出结果:物理存储设计方案。

5、数据库实施
使用 SQL 语句创建数据库及表;
定义索引、视图、触发器等;
导入初始数据。

6、数据库运行与维护
定期备份;
性能优化;
数据安全与权限管理。

ER图工具

模型复杂度
如果只是小型系统、课程作业,用 Draw.io、dbdiagram.io 这样的在线工具就够了。
如果是企业级系统、数据库模型非常复杂,则建议用 Visual Paradigm、PowerDesigner 这类专业工具。

团队协作 / 多人编辑
在线工具通常天然支持多人协作、版本控制(如 dbdiagram.io, Creately)
桌面工具如果支持团队功能,要检查其版本控制 / 共享机制。

设计范式

第一范式:列不可再分

要求:表中每个字段都是不可再分的基本数据项。

示例:学生表中不能将“联系方式”同时存手机号和邮箱。

第二范式(2NF):一张表只描述一件事

要求:在 1NF 的基础上,非主属性完全依赖于主键。

示例:如果主键是(学号, 课程号),则“姓名”只依赖学号,应拆分成独立的学生表。

第三范式(3NF):一张表中的每一个列都直接依赖主键,而不是间接依赖

要求:在 2NF 的基础上,消除传递依赖

示例:学生表中“专业名”依赖“专业号”,应将“专业”信息单独建立一张表。

实际设计中,一般达到 3NF 即可满足大部分系统需求,部分高并发系统会为性能适度反范式化

image-20251013173758794

在上述表中,姓名和科目名称这两列并不是依赖于id这一列,而是分别依赖于学号和科目号
因此我们说这两列并不是直接依赖于主键,因此不符合第三范式

image-20251013173856312

数据库设计是否一定要符合三个范式呢?或者说是不是符合的范式越高越好呢?
数据库设计的范式和数据库的查询性能往往是互相矛盾的,范式越高查询性能越差所以,我们一般的策略是:如果需要频繁查询的表,尽是的降低范式从而获得更好的查询性能反之,尽是的提高范式