数据库三大范式学习笔记
什么是数据库三大范式
数据库三大范式是数据库设计表结构所遵循的规范和指导方法,目的是为了减少冗余,建立结构合理的数据库,从而提高数据存储和使用的性能。三大范式之间是具有依赖关系的,比如第二范式是在第一范式的基础上建设的、第三范式是在第二范式的基础上建设的。
- 第一范式(确保每列保持原子性):如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库满足第一范式。
- 第二范式(确保表中的每列都和主键相关):第二范式需要确保数据库表中每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。
- 第三范式(确保每列都和主键列直接相关,而不是间接相关):第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。比如在设计一个订单数据表的时候,可以将客户编号作为一个外键和订单表建立相应的关系,而不可以在订单表中添加关于客户其他信息(比如姓名、所属公司)的字段。
举例说明
假设我们有一个学生信息表,如下所示:
学号 | 姓名 | 性别 | 年龄 | 班号 | 班级 | 专业 | 学院 |
---|---|---|---|---|---|---|---|
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) |
---|---|
计算机科学与技术 | 计算机学院 |
数学与应用数学 | 理学院 |
这样就消除了传递依赖,每一列都和主键直接相关。
不遵循三大范式会有什么问题
- 数据冗余:如果表中存在重复的数据,会占用更多的存储空间,也会增加数据维护的难度和成本。
- 插入异常:如果表中存在部分依赖,可能导致无法插入某些数据,或者插入了不完整的数据。
- 删除异常:如果表中存在传递依赖,可能导致删除某些数据时,连带删除了其他不想删除的数据。
- 修改异常:如果表中存在重复的数据,可能导致修改某些数据时,需要修改多个地方,或者修改了一部分而忘记修改另一部分,造成数据不一致。
因此,遵从三大范式可以使数据库设计更加规范、合理、高效和可维护。
在构建数据仓库时也需要遵循数据库三大范式吗
在构建数据仓库时,不一定需要遵循数据库三大范式。数据仓库是为了支持数据分析和决策而设计的,它的主要目的是提高查询的效率和灵活性,而不是保证数据的一致性和完整性。
因此,数据仓库通常采用反范式化的设计方法,即通过增加冗余数据来减少表的关联,从而提高查询的速度和简便性。 反范式化的设计方法有以下优点:
- 可以减少表的数量和层次,使数据仓库的结构更加简单和清晰。
- 可以减少查询时需要的连接操作,提高查询的性能和稳定性。
- 可以更好地进行索引优化,提高查询的响应时间。
- 可以更好地支持多维分析,提高查询的灵活性和可视化效果。
反范式化的设计方法也有以下缺点:
- 存在大量冗余数据,占用更多的存储空间和内存资源。
- 数据维护成本更高,需要保证冗余数据的一致性和正确性。
- 数据更新操作更复杂,需要更新多个地方,可能影响数据仓库的实时性。
因此,在构建数据仓库时,需要根据具体的业务需求和场景,权衡反范式化设计方法的利弊,选择合适的范式级别。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 62bit的秘密基地!