3.2.1 设计规范化表,消除数据冗余
数据库范式是确保数据库结构合理,满足各种查询需要、避免数据库操作异常的数据库设计方式。满足范式要求的表,
称为规范化表,范式产生于 20 世纪 70 年代初,一般表设计满足前三范式就可以,在这里简单介绍一下前三范式
先给大家看一下百度百科给出的定义:
第一范式(1NF)无重复的列
所谓第一范式(1NF)是指在关系模型中,对域添加的一个规范要求,所有的域都应该是原子性的,即数据库表的每一
列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。
第二范式(2NF)属性
在 1NF 的基础上,非码属性必须完全依赖于码[在 1NF 基础上消除非主属性对主码的部分函数依赖]
第三范式(3NF)属性
在 1NF 基础上,任何非主属性不依赖于其它非主属性[在 2NF 基础上消除传递依赖]
通俗的给大家解释一下(可能不是最科学、最准确的理解)
第一范式:属性(字段)的原子性约束,要求属性具有原子性,不可再分割;
第二范式:记录的惟一性约束,要求记录有惟一标识,每条记录需要有一个属性来做为实体的唯一标识。
第三范式:属性(字段)冗余性的约束,即任何字段不能由其他字段派生出来,在通俗点就是:主键没有直接关系的数据
列必须消除(消除的办法就是再创建一个表来存放他们,当然外键除外)
如果数据库设计达到了完全的标准化,则把所有的表通过关键字连接在一起时,不会出现任何数据的复本(repetition)。
标准化的优点是明显的,它避免了数据冗余,自然就节省了空间,也对数据的一致性(consistency)提供了根本的保障,杜
绝了数据不一致的现象,同时也提高了效率。
3.2.2 适当的冗余,增加计算列
数据库设计的实用原则是:在数据冗余和处理速度之间找到合适的平衡点
满足范式的表一定是规范化的表,但不一定是最佳的设计。很多情况下会为了提高数据库的运行效率,常常需要降低范式标
准:适当增加冗余,达到以空间换时间的目的。比如我们有一个表,产品名称,单价,库存量,总价值。这个表是不满足第
三范式的,因为“总价值”可以由“单价”乘以“数量”得到,说明“金额”是冗余字段。但是,增加“总价值”这个冗余
字段,可以提高查询统计的速度,这就是以空间换时间的作法。合理的冗余可以分散数据量大的表的并发压力,也可以加快
特殊查询的速度,冗余字段可以有效减少数据库表的连接,提高效率。
其中"总价值"就是一个计算列,在数据库中有两种类型:数据列和计算列,数据列就是需要我们手动或者程序给予赋值的列,
计算列是源于表中其他的数据计算得来,比如这里的"总价值"
在 SQL 中创建计算列:
create table table1
(
number decimal(18,4),
price money,
Amount as number*price --这里就是计算列
)
如果是'否',说明这列是虚拟列,每次查询的时候计算一次,而且那么它是不可以用来做 check,foreign key 或 not null
约束。
如果是'是',就是真实的列,不需要每次都计算,可以再此列上创建索引等等。