什么是数据库三大范式

数据库三大范式是数据库设计表结构所遵循的规范和指导方法,目的是为了减少冗余,建立结构合理的数据库,从而提高数据存储和使用的性能。三大范式之间是具有依赖关系的,比如第二范式是在第一范式的基础上建设的、第三范式是在第二范式的基础上建设的。

  • 第一范式(确保每列保持原子性):如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库满足第一范式。
  • 第二范式(确保表中的每列都和主键相关):第二范式需要确保数据库表中每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。
  • 第三范式(确保每列都和主键列直接相关,而不是间接相关):第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。比如在设计一个订单数据表的时候,可以将客户编号作为一个外键和订单表建立相应的关系,而不可以在订单表中添加关于客户其他信息(比如姓名、所属公司)的字段。

举例说明

假设我们有一个学生信息表,如下所示:

学号 姓名 性别 年龄 班号 班级 专业 学院
1001 张三 20 100 计算机1班 计算机科学与技术 计算机学院
1011 李四 19 101 计算机2班 计算机科学与技术 计算机学院
2001 王五 21 200 数学1班 数学与应用数学 理学院

这个表存在以下问题:

  • 存在重复数据,如专业和学院的信息在每一行都重复出现,造成数据冗余。
  • 存在部分依赖,如姓名、性别、年龄只依赖于学号的一部分,而不是整个主键(假设主键是学号和班级的组合)。
  • 存在传递依赖,如专业和学院只依赖于班级,而不是直接依赖于主键。

为了解决这些问题,我们可以按照三大范式对表进行规范化:

  • 第一范式:保证每一列都是不可分割的原子数据项。这个表已经满足第一范式的要求,因为每一列都是单一属性,不能再分割。
  • 第二范式:保证表中的每一列都和主键相关。为了满足第二范式,我们可以将表拆分为两个表,一个是学生基本信息表,主键是学号,另一个是学生班级信息表,主键是学号和班号。如下所示:
学号(PK) 姓名 性别 年龄
1001 张三 20
1011 李四 19
2001 王五 21
学号(PK) 班号(PK) 班级 专业 学院
1001 100 计算机1班 计算机科学与技术 计算机学院
1011 101 计算机2班 计算机科学与技术 计算机学院
2001 200 数学1班 数学与应用数学 理学院

这样就消除了部分依赖,每一列都和主键相关。

  • 第三范式:保证每一列都和主键直接相关,而不是间接相关。为了满足第三范式,我们可以将表再次拆分为三个表,一个是学生基本信息表,主键是学号,一个是班级信息表,主键是班号,一个是专业信息表,主键是专业。如下所示:
学号(PK) 姓名 性别 年龄 班号
1001 张三 20 100
1011 李四 19 101
2001 王五 21 200
班号(PK) 班级 学号(FK) 专业(FK)
100 计算机1班 1001 计算机科学与技术
101 计算机2班 1002 计算机科学与技术
200 数学1班 1003 数学与应用数学
专业(PK) 学院(FK)
计算机科学与技术 计算机学院
数学与应用数学 理学院

这样就消除了传递依赖,每一列都和主键直接相关。

不遵循三大范式会有什么问题

  • 数据冗余:如果表中存在重复的数据,会占用更多的存储空间,也会增加数据维护的难度和成本。
  • 插入异常:如果表中存在部分依赖,可能导致无法插入某些数据,或者插入了不完整的数据。
  • 删除异常:如果表中存在传递依赖,可能导致删除某些数据时,连带删除了其他不想删除的数据。
  • 修改异常:如果表中存在重复的数据,可能导致修改某些数据时,需要修改多个地方,或者修改了一部分而忘记修改另一部分,造成数据不一致。

因此,遵从三大范式可以使数据库设计更加规范、合理、高效和可维护。

在构建数据仓库时也需要遵循数据库三大范式吗

在构建数据仓库时,不一定需要遵循数据库三大范式。数据仓库是为了支持数据分析和决策而设计的,它的主要目的是提高查询的效率和灵活性,而不是保证数据的一致性和完整性。

因此,数据仓库通常采用反范式化的设计方法,即通过增加冗余数据来减少表的关联,从而提高查询的速度和简便性。 反范式化的设计方法有以下优点:

  • 可以减少表的数量和层次,使数据仓库的结构更加简单和清晰。
  • 可以减少查询时需要的连接操作,提高查询的性能和稳定性。
  • 可以更好地进行索引优化,提高查询的响应时间。
  • 可以更好地支持多维分析,提高查询的灵活性和可视化效果。

反范式化的设计方法也有以下缺点:

  • 存在大量冗余数据,占用更多的存储空间和内存资源。
  • 数据维护成本更高,需要保证冗余数据的一致性和正确性。
  • 数据更新操作更复杂,需要更新多个地方,可能影响数据仓库的实时性。

因此,在构建数据仓库时,需要根据具体的业务需求和场景,权衡反范式化设计方法的利弊,选择合适的范式级别。