mysql 数据库设计三大范式
1. 什么是设计范式
设计表的依据,按照范式设计出来的表,不会出现数据的冗余
数据库的设计范式是数据库设计所需要满足的规范,满足这些规范的数据库是简洁的、结构清晰的;反之则是乱七八糟,不仅会给开发人员制造麻烦,而且还可能存储了大量不需要的冗余数据
不仅仅只有三大范式,还有第四范式、第五范式、第六范式等,通常来讲,满足三大范式就基本足够
项目的数据库设计并不一定要完全满足于三大范式,有些时候我们会适量的冗余让 query 尽量减少 join
2. 三大范式
第一范式(1 NF):要求属性(列)具有原子性,即每列都是不可再分解的数据
虽然第一范式要求各列保存原子性,不能再分解,但是这种要求是和我们的需求相关联的,不拆分也行;如果要考虑可扩展性,那么就进行拆分吧。如下表所示,没有根据城市筛选用户的需求,可以这样存储城市数据
id | name | address |
---|---|---|
1 | 张三 | 河南省开封市兰考县 |
2 | 李四 | 广东省深圳市福田区 |
对 address 进行拆分,使其具有原子性(原子性:指不可再分解的意思)
id | name | province | city | area |
---|---|---|---|---|
1 | 张三 | 河南省 | 开封市 | 兰考县 |
2 | 李四 | 广东省 | 深圳市 | 福田区 |
第二范式(2 NF):建立在第一范式基础上,除主键外的每一列都必须完全依赖于主键
如果要出现不完全依赖主键,只可能发生在联合主键的情况下
第二范式是对记录的唯一性约束,要求有唯一性标识,即实体的唯一性,如下所示:即可 name 和 address 完全一致,但是主键值是不一样的,这样就实现了数据的唯一性
id | name | address |
---|---|---|
1 | 张三 | 河南省开封市兰考县 |
2 | 张三 | 河南省开封市兰考县 |
第三范式(3 NF):建立在第二范式基础上,对字段冗余性的约束,它要求字段没有冗余
假设员工的薪资水平由岗位决定,也就是 salary 由 job 决定,和人员(name)无关
员工表:
id | name | job | salary |
---|---|---|---|
1 | 张三 | Web 前端开发工程师 | 5000 |
2 | 李四 | PHP 后端开发工程师 | 8000 |
3 | 王五 | PHP 后端开发工程师 | 8000 |
那么,我们将遵循第三范式将员工表拆分为两张表,如下所示
员工表:
id | name | job_id |
---|---|---|
1 | 张三 | 100 |
2 | 李四 | 101 |
3 | 王五 | 101 |
薪资表:
id | name | salary |
---|---|---|
100 | Web 前端开发工程师 | 5000 |
101 | 后端开发工程师 | 8000 |
相关文章
- 进了,Gartner这个报告有魔力!腾讯云数据库喜提双料第一
- 【MySQL】InnoDB行格式
- 你不知道的达梦数据库
- SQL语句练习05
- 【愚公系列】2022年12月 Elasticsearch数据库-.NET CORE的Serilog=>Rabbitmq=>Logstash=>Elasticsearch的日志传输(四)
- 【数据库原理与运用|MySQL】MySQL视图的使用
- Oracle数据库基础
- 客快物流大数据项目(七十二):Impala sql 语法
- 数据库系统原理作业(2)
- SQL语句练习06
- Mysql蜜罐反制cobalt strike
- ClickHouse 源码解析(三):SQL 的一生(下)
- MySQL中这14个小玩意,让人眼前一亮!!!
- 数据库小技能:存储过程(stored procedure)
- SQL SERVER 常用命令
- docker快速拉起任意版本PostgreSQL测试环境
- gdb操作运行中的MySQL实例--"黑科技"
- MySQL-8.0.30 版本新特性之动态调整 REDO
- MySQL - 删库了,但是很慢
- MySQL-8 新语法 nowait 与 skip locked 优化并发写入性能