数据库三大范式

599 阅读3分钟

这是我参与8月更文挑战的第24天,活动详情查看:8月更文挑战

设计关系数据库时,遵从不同的规范要求设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,越高的范式数据库冗余越小。

第一范式(1NF)

要求数据库每一列都是不可再分割的原子数据项。如一个学生表(学号,姓名、联系方式...),这个表明显就是不符合第一范式的要求,因为其中联系方式可以分割为多种,如电话、邮箱、微信等,其不是一个原子数据项。

第二范式(2NF)

第二范式的前提必须是先满足第一范式,非主键列必须完全依赖于主键列,不存在非主键列对主键的部分依赖或不依赖,即确保表中的每一列都和主键相关。例如有一个表(订单号、产品号、产品价格、产品数量、订单总额、订单时间),其中联合主键是(订单号、产品号)。分析表的内容后,我们可以发现其中存在非主键列订单总额、订单时间联合主键(订单号、产品号)的部分依赖,即订单总额和订单时间只与订单号相关,而与产品号无关,那么该表就是不符合第二范式。

第三范式(3NF)

第三范式的前提必须是先满足第二范式,不存在任何非主键列对其他非主键列的依赖,也可以说,任何非主键列不存在对主键列的传递依赖,即表中的任意非主键列都是直接依赖于主键列的,而不是通过其他非主键列间接依赖于主键列。例如一个学生表(学号、学生姓名、班主任编号、班主任姓名、班主任性别..),从表中可以看出、其中班主任姓名、性别是直接依赖于班主任编号的,而班主任编号又直接依赖于学号(即班主任姓名、性别传递依赖于学号),因此该表存在非主键列对主键列的传递依赖,不符合第三范式,可以将其拆分为学生表(学号、学生姓名、班主任编号)、教师表(班主任编号、班主任姓名、班主任性别)。

穿插:BCNF范式

BCNF范式的前提必须是先满足第三范式。不存在主键列对于码就是可以确定一个元组的所有信息的属性名或属性名组)的部分依赖和传递依赖。例如有一个公司有多个仓库、每一个仓库有一名仓管员、每一个仓库存放一种或多种物品,那么如果将表设计为(仓库名、仓管员、物品名称、数量)符合哪些范式呢?

  • 表分析如下:

    1. 主键列:仓库名、仓管员、物品名称
    2. 码:(仓库名、物品名称)、(仓管员、物品名称)
    3. 非主键列:数量
  • 首先,对应的表的每一个字段都是不可再分割的,为原子性数据,符合第一范式;然后看看符不符合第二范式,其中不存在非主键列对主键列的部分依赖或者不依赖,因此符合第二范式;接着看看是否符合第三范式,其中不存在在非主键列对主键列传递依赖,因此符合第三范式。最后看看符不符合BCNF范式,其中主键列(仓管员)对于码(仓库名、物品名称)存在部分依赖,即通过仓库名就可以确定参管员,而无需依赖于物品名称(一个仓库可以有多种物品),因此不符合BCNF范式。

🏁以上就是对数据库三大范式的简单介绍,如果有错误的地方,还请留言指正,如果觉得本文对你有帮助那就点个赞👍吧😋😻😍

默认标题_动态分割线_2021-07-15-0.gif