一、数据库设计的重要性:
1.糟糕的数据库设计产生的问题:
(1)数据冗余、信息重复、存储空间浪费
(2)数据更新、插入、删除的异常
(3)无法正确表示信息
(4)丢失有效信息
(5)程序性能差
2.良好的数据库设计有以下优点:
(1)节省数据的存储空间
(2)能够保证数据的完整性
(3)方便进行数据库应用系统的开发
二、范式
1.范式简介:
在关系型数据库中,关于数据表设计的基本原则、规则称为范式,可以理解为一张数据表的设计结构需要满足的某种设计标准的级别。范式时关系型数据库理论的基础,时在设计数据库结构中所要遵循的规则和指导方法。
2.范式的种类:
按照范式级别,范式从低到高分别是:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯—科德范式(BCNF),第四范式(4NF)和第五范式(5NF)。数据库的范式设计越高阶,冗余度就越低,同时高阶的范式一定符合低阶范式的要求,满足最低要求的范式是第一范式,在第一范式的基础上进一步满足更多规范要求的称为第二范式,其余范式以此类推。一般来说在关系型数据库的设计中最高要达到BCNF,普遍还是3NF。有时为了提高查询性能还要破坏范式化。
3.键和相关属性概念:
(1)超键:能够唯一标识元组的属性集称为超键
(2)候选键:如果超键不包括多余的属性,那么这个超键就是候选键
(3)主键:从候选键中选择一个作为主键
(4)外键:如果数据表R1中的某属性集不是R1的主键,而是另一个数据表R2的主键,那么这个属性集就是数据表R1的外键
(5)主属性:包含在任一候选键中的属性
(6)非主属性:不包含在任一候选键中的属性。
4.第一范式(1st NF):第一范式主要是确保数据表中的每个字段的值必须具有原子性,也就是说数据表中的每个字段的值为不可拆分的最小单元。
5.第二范式(2NF):在满足第一范式的基础上,还要满足数据表中的每一条记录都是唯一可以标识的,而且所有的非主键字段都必须完全依赖于主键,不能只依赖主键的一部分。也就是如果知道主键的所有属性的值,就可以检索到任何元组的任何属性的任何值。2NF要求实体的属性集完全依赖于主关键字,如果不存在完全依赖,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体和原实体之间是一对多的关系。
6.第三范式(3NF):在满足第二范式的基础上确保数据表中的每一个非主键字段都和主键字段直接相关,也就是说要求数据表中的所有非主键字段不能依赖于其他非主键字段。也就是说所有非主键属性之间必须相互独立。
第一范式确保每列的原子性,数据库的每一项都是不可分割的原子数据项,不可再分的最小数据单元,而不能是集合、数组、记录等非原子数据项。第二范式确保每列都和主键完全依赖,尤其在复合主键的情况下,非主键部分不应该依赖于部分主键。第三范式确保每列都和主键列直接相关,而不是间接相关。
7.巴斯范式(BCNF):BCNF被称为是修正的第三范式或扩充的第三范式,若一个第三范式只有一个候选键并且它的每个候选键都是单属性,那么该关系自然到达BCNF。
8.第四范式:第四范式是在BCNF的基础上消除非平凡且非函数依赖的多值依赖(即把同一表内的多对多关系删除)
多值依赖:属性之间的一对多关系,记为k→→A。
函数依赖:实际上是单值依赖,不能表达属性值之间的一对多关系
平凡的多值依赖:全集U=K+A,一个K可以对应多个A,即k→→A,此时整个表就是一组一对多关系
非平凡的多值依赖:全集U=K+A+B,一个K可以对应于多个A,也可以对应于多个B,A与B互相独立
范式的优点:数据的标准化有助于消除数据库中的数据冗余,3NF被认为在性能、扩展性和数据完整性方面达到了最好的平衡。
范式的缺点:范式可能降低查询的效率,因为范式等级越高,设计出的数据表越多、越精细、数据冗余度就越低,进行数据查询的时候就可能需要关联多张表,也可能导致索引失效。
三、反范式化:
1.概述:
有的时候不能简单按照规范要求设计数据表,因为有的数据看似冗余,其实对业务来说十分重要。这个时候,就要遵循业务优先的原则,首先满足业务需求,再尽量减少冗余。如果数据库中的数据量比较大,系统的UV和PV访问频次比较高,则完全按照MySQL的三大范式设计数据表,读数据时会产生大量的关联查询,在一定程度上会影响数据库的读性能。如果想对查询效率进行优化,反范式优化也是一种优化思路。此时可以通过在数据表中增加冗余字段来提高数据库的读性能。
2.反范式化带来的问题:
(1)存储空间变大
(2)一个表中的字段做了修改,另一个表中的冗余字段也需要同步修改,否则数据不一致
(3)若采用存储过程来支持数据的更新、删除等额外操作,如果频繁更新会非常消耗系统资源
(4)在数据量小的情况下反范式化可能会让数据库设计更加复杂
3.反范式化应用场景:
(1)增加冗余字段的建议:这个冗余字段不需要经常修改或者查询时不可或缺
(2)历史快照、历史数据的需要