数据库范式
目前关系型数据库一共有 6 种范式,按照范式级别,从低到高分别是:1NF(第一范式)、2NF(第二范式)、3NF(第三范式)、BCNF(巴斯 - 科德范式)、4NF(第四范式)和 5NF(第五范式,又叫做完美范式)。
数据库的范式设计越高阶,冗余度就越低,同时高阶的范式一定符合低阶范式的要求,满足 2NF 的一定满足 1NF,满足 3NF 的一定满足 2NF,依次类推。
数据表中的键
超键:能唯一标识元组的属性集。
候选键:不包含多余元素的超键。
主键:用户可以从候选键中选择一个作为主键。
外键:不是数据表主键但是另一个数据表主键的键。
主属性:包含在任一候选键中的属性称为主属性。
非主属性:不包含在任何一个候选键中的属性。
数据库范式
1NF :不可分,1NF 指的是数据库表中的任何属性都是原子性的,不可再分。
2NF :完全性,2NF 指的数据表里的非主属性都要和这个数据表的候选键有完全依赖关系。完全依赖指的是非主属性依赖候选键的全部属性。
3NF :直接性, 3NF 在满足 2NF 的同时,对任何非主属性都不传递依赖于候选键。传递依赖指的是非主属性 A 依赖于非主属性 B,非主属性 B 依赖于候选键的情况。
BCNF(巴斯范式):主属性对于候选键完全依赖且不是传递依赖。
范式只是提出了设计的标准,实际上设计数据表时,未必要符合这些原则。一方面是因为这些范式本身存在一些问题,可能会带来插入,更新,删除等的异常情况,另一方面,它们也可能降低会查询的效率。
反范式设计
越高阶的范式得到的数据表越多,数据冗余度越低。反范式就是相对范式化而言的,就是允许少量的冗余,通过空间来换时间。
反范式存在的问题和使用场景:
在数据量小的情况下,反范式难以体现性能的优势,还会让数据库的设计更加复杂。
但当冗余信息有价值或能大幅度提高查询效率的时候,就可以采取反范式的优化。同时反范式优化也常用在数据仓库的设计中,因为数据仓库通常存储历史数据,对增删改的实时性要求不强,对历史数据的分析需求强。这时适当允许数据的冗余度,更方便进行数据分析。
数据库和数据仓库的区别:
1. 数据库设计的目的用于捕获数据,而数据仓库设计的目的在于分析数据。
2. 数据库对数据的增删改查实时性要求强,需要存储在线的用户数据,而数据仓库存储的一般是历史数据。
3. 数据库的设计需要尽量避免冗余,但为了提高查询效率也允许一定的冗余度,而数据仓库在设计上更偏向采用反范式设计。