一、什么是数据库范式
无规矩不成方圆,同理范式是数据表设计的一些约束和规范。为了让各个属性间的关系更加合理,减少数据冗余。
一般来说,主要满足 3NF 就可以了,因为范式过高,虽然对数据关系有更好的约束,可也会导致数据表的增加,从而让数据库 IO 更加繁忙,冗余度更低。当然,凡事没绝对,有时为了提高某些查询性能,需要反规范化。
二、三大范式和 BC 范式
一般来说,数据表设计主要遵循三大范式:1NF(第一范式)、2NF(第二范式)和 3NF(第三范式)。越高的范式必须要符合比它低的范式要求,比如 2NF 除了要满足自身的要求,还须满足 1NF 的要求。
- 1NF(第一范式):是范式中最基本的范式,为了避免重复性,要求每个列的值域由原子值组成和每个字段的值都只能是单一值。
- 2NF(第二范式):要求表数据和表键(主键和候选键)有完全依赖关系。每个非键属性必须独立于任一候选键的一部分属性。
-
3NF(第三范式):要求非主属性之间应该是独立无关联,只和候选键有关联。不允许非主属性被另一个非主属性决定,但允许主属性被非主属性决定。
-
BCNF(BC 范式,Boyce-Codd normal from):是基于 3NF 的改进范式。与 3NF 主要区别在于任何属性都不能被非主流属性所决定。
三、反范式化
有时为了提高性能和读取效率,允许少量的数据冗余。也就是要反范式化,用空间换时间。
范式化和反范式化的区别:
- 范式化可以减少数据冗余,但因为查询需要多表关联,很难优化不同表中的索引。
- 反范式化能减少表的关联,增加读取效率,可以更好地优化索引,但数据会冗余。
四、关系型数据库的键和键属性
-
超键:能够标识多行的属性集。
-
候选键:不含有多余属性的超键。
-
主键:每个数据表只能有一个主键,它不能为空值(NULL)。因为主键是用于唯一定位数据的,确认了不好再修改,所以最好是完全与业务无关的字段。
如果是 INT 自增类型,数据上限是约 21 亿。BIGINT 自增类型上限约有 922 亿。
-
外键:如果表 A 中某个属性不是本表主键,而是另一个表 B 的主键,即这个属性是表 B 的外键。也可以不设置外键约束,仅靠应用逻辑保证数据操作正确性。
关联关系:一对一、一对多和多对多。
-
主属性:包含任一候选键中的属性。
-
非主属性:不包含任一候选键中的属性。