规范化的对象:表
目的:将数据转变成一个有逻辑的、无重复的格式,可以很容易将此格式再重新组合成一个整体。
就是减少表的数据冗余,减少数据存储空间,使每个表的用途更加明确,各表之间的关系更加科学。
范式种类:6种。
但实际上只需要做到3种范式就可以,后面三种只是有学术讨论的意义。
规范化总结:
规范化就是键,整个键,只是键。
(分别对应第一范式,第二范式,第三范式)
前提:
1.表只描述一个实体(不要简化或组合);
2.所有行必须唯一,而且必须有一个主键;
3.列和行的顺序必须是无关的。
第一范式:消除重复数组和保证原子性(数据是自包含和独立的)。
原子性:每一列都单独记录一个数据,而不记录过多的数据。比如一个列里,包含了数量,单价和总价。那么就要拆成三列。
第二范式:在第一范式的基础上,每列必须依赖于整个键。
如果一个行是组合键,有一列只依赖于其中一个键,那么就要把这个列单独分在一张表中。比如一行:班级,学号,班主任,座位号。组合键为班级和学号,班主任只依赖于班级。
第三范式:在第二范式的基础上,任何列都不能依赖于非键列,不能有派生的列。
不能有派生列,比如,有两个列:单价和总量,还有另外一个列为总价。可以看出,总价是根据单价和总量派生出来的,应该删掉。
mark:有时需要反规范化——添加派生列,比如用户需要经常查询总价,如果进行第三范式,那么用户每次查询总价都要查询另外两列,并进行运算,加大了查询时间。通过反规范化,这里牺牲点存储空间,提高查询效率,是值得的。
反规范化
要记住数据库的设计的原则应该是具有适用性,要根据实际情况灵活设计表格,而不是一味地进行规范化。
比如,添加派生列,可以提高搜索速度,降低查询时间。