范式
范式简介
在关系型数据库中,关于数据表设计的基本原则、规则称为范式。可以理解为,一张数据表的设计结构需要满足的某种设计标准的级别,要想设计一个结构合理的关系型数据库,必须满足一定的范式。
范式都包含哪些
6种范式以及关系
键和相关属性的概念
第一范式(1st NF)
第一范式主要是确保数据表种的每个字段的值必须具有原子性,也就是说数据表中每个字段的值为不可再拆分的最小数据单元。
第二范式(2nd NF)
第二范式要求,在满足第一范式的基础上,还要满足数据表里的每一条数据记录,都是可唯一标识的。而且所有的非主键字段,都必须完全依赖主键,不能只依赖主键的一部分。
如果知道主键的所有的属性值,就可以检索到任何元组(行)的任何属性的任何值(要求中的主键,其实可以拓展为候选键)
对于非主属性来说,并非完全依赖候选键,这样会产生什么问题?
1NF 告诉我们字段的属性需要是原子性的,而2NF告诉我们一张表就是一个独立的对象,一张表只表达一个意思
小结:
第二范式(2NF)要求实体的属性完全依赖于主关键字,如果存在不完全依赖,那么这个属性和主键字的这一部分应该分离出来形成一个新的实体,新实体与单元实体之间是一对多的关系。
第三范式(3rd NF)
第三范式是在第二范式的基础上,确保数据表中的每一个非主键字段都和主键字段直接相关,也就是说:要求数据表中的所有非主键字段不能依赖于其他非主键字段 (即不能存在非主属性A依赖于非主属性B,非主属性B依赖于主键C的情况,即存在A->B->C的决定关系)。通俗的说,该规则的意思是所有非主键属性之间不能有依赖关系,必须相互独立
符合3NF后的数据模型通俗的讲,2NF和3NF通常以这句话概括:每个非键属性依赖于键,依赖于整个键,并且除了键别无他物
小结
开发中,会出现为了性能和读取效率违反范式化的原则,通过增加少量的冗余或重复的数据来提高数据库的读性能,减少关联查询,join表的次数、实现空间换取时间的目的。在实际的设计过程中理论结合实际,灵活运用。
反范式化
如果相相对查询效率进行优化,反范式化也是·一种思路。可以通过在数据库表中增加冗余字段来提高数据库的读性能。
应用举例
反范式化的新问题
反范式可以通过空间换时间,提升查询的效率,但是反范式也会存在一定的问题:
存储空间变大了,一个表的字段做了修改,另一个表中的冗余字段也需要同步修改,否则数据不一致。若采用存储过程来支持数据的更新,删除等额外的操作,如果更新频繁,会非常消耗系统资源。在数据量小的情况下,反范式不能体现性能的优势,可能还会让数据库的设计更加复杂。
反范式的适用场景
1.增加冗余字段的建议
2.历史快照、历史数据的需要
BCNF (巴斯范式)
BCNF被认为i没有新的设计范式加入,只是对第三范式中设计规范要求更强,使得数据库冗余度更小。所以,称为是修正的第三范式 或者扩充的第三范式。
若一个关系达到了第三范式,并且它只有一个候选键,或者它的每个候选键都是单属性,则该关系自然达到BC范式。
一般来说,一个数据库设计符合3NF或者BCNF就可以了
存在的问题
问题解决