跳到主要内容

数据库范式

范式是什么

参考资料 关系型数据库设计:三大范式的通俗理解 参考资料 数据库范式那些事

简单的说,范式是为了消除重复数据减少冗余数据,从而让数据库内的数据更好的组织,让磁盘空间得到更有效利用的一种标准化标准,满足高等级的范式的先决条件是满足低等级范式。(比如满足2nf一定满足1nf)

范式的目标

应用数据库范式可以带来许多好处,但是最重要的好处归结为三点:

  1. 减少数据冗余(这是最主要的好处,其他好处都是由此而附带的)
  2. 消除异常(插入异常,更新异常,删除异常)
  3. 让数据组织的更加和谐…

第一范式(1NF)

如果一个关系模式 R 的所有属性都是不可分的基本数据项,则 R ∈ 1NF。即要求数据库表的每一项都是不可分割的原子数据项

例如: tTjFOA.png

在上面的表中,“家庭信息” 和 “学校信息” 列均不满足原子性的要求,故不满足第一范式,调整如下:

可见,调整后的每一列都是不可再分的,因此满足第一范式(1NF);

第二范式(2NF)

若关系模式 R ∈ 1NF,并且每一个非主属性都完全函数依赖于 R 的码,则 R ∈ 2NF

简单的说,是表中的属性 必须完全依赖于全部主键,而不是部分主键(可以设置多个属性合为主键的)。所以只有一个主键的表如果符合第一范式,那一定是第二范式。这样做的目的是进一步减少插入异常和更新异常。

也就是每张表只描述一件事情

如下例子,同一个订单中可能包含不同的产品,因此主键必须是 “订单号” 和 “产品号” 联合组成

上图可以发现,产品数量、产品折扣、产品价格与 “订单号” 和 “产品号” 都相关,但是订单金额、订单时间 仅与 “订单号” 相关,与“产品号”无关

这样就不满足第二范式的要求,调整如下,需分成两个表:

第三范式(3NF)

第三范式(3NF):在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖),也就是需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。

简单的说,第三范式是为了消除数据库中关键字之间的依赖关系

上表中,所有属性都完全依赖于学号,所以满足第二范式,但是 “班主任性别” 和 “班主任年龄” 直接依赖的是 “班主任姓名”,而不是主键“学号”,所以需做如下调整:

规范性和性能的问题

上面对于数据库范式进行分解的过程中不难看出,应用的范式登记越高,则表越多。表多会带来很多问题:

1 查询时要连接多个表,增加了查询的复杂度 2 查询时需要连接多个表,降低了数据库查询性能

所以性能和规范鱼和熊掌不能兼得,因此要根据需求适当的变更

  • 考虑商业化的需求和目标,数据库的性能更加重要
  • 在规范性能的问题的时候,需要适当的考虑一下规范性
  • 如果只是很少的列的话,其实没有必要再特地创多一个列