【MySQL】数据库设计规范
1、键和相关属性的概念
范式的定义会用到主键和候选键,数据库的键由一个或多个属性组成。数据表中集中常见的键和属性的定义:
- 超键:能唯一标识元组的信息叫做超键
- 候选键:如果超键不包括对多余的属性,那么这个超键就是候选键
- 主键:用户可以从候选键中选一个作为主键
- 外键:如果数据表R1中的某属性集不是R1的主键,而是另一个数据表R2的主键,那么这个属性集就是数据表R1的外键
- 主属性:包含在任一候选键中的属性称为主属性
- 非主属性:与主属性相对,指的是不包含在任何一个候选键中的属性
2、数据库三范式
第一范式:字段不可再次拆分
例如:student表
字段名 | 字段类型 |
---|---|
id | int |
student_info | varchar(100) |
表中的 student_info 可以拆分为更小粒度的字段
第二范式:建立在第一范式的基础上,属性完全依赖于主键
不能部分依赖,
例如:对于复合主键(A,B),C 不能只依赖于 A
第三范式:建立在第二范式的基础上,属性直接依赖于主键
不能间接依赖
例如:不能 C 依赖于 B,B依赖于 A
范式是为了降低冗余,有时候为了提高运行效率可以适当增加冗余。
3、反范式的适用场景
当冗余信息有价值很或者能大幅度提高查询效率的时候,才会采用反范式的优化
- 增加冗余字段
- 历史快照
历史数据的需要:
在现实生活中,我们经常需要一些冗余信息,比如订单中的收货人信息,电话、姓名、地址等。每次发生的订单收货信息都属于历史快照,需要进行保存,但是用户可以随时修改自己的信息,这是保存这些冗余信息是非常有必要的
数据仓库;
数据仓库通常存储历史数据,对增删改的实时性要求不强,对数据历史的分析需求强,这是适当允许数据的冗余度,更方便进行数据分析