[转]数据库三大范式最简单的解释(整合)
1 前言
关系数据库中的关系必须满足一定的要求,即满足不同的范式。
目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、第四范式(4NF)、第五范式(5NF)和第六范式(6NF)。
满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多要求的称为第二范式(2NF),其余范式以次类推。
一般说来,数据库只需满足第三范式(3NF)就行了。
2 简介
很多资料上的范式都讲的很难理解,这里总结一下三大范式,便于读者简易的理解。
1NF:字段是原子性的,不可分(即列不可分)
2NF:有主键,非主键字段依赖主键。确保一个表只说明一个事物(即不存在部分依赖)
3NF:非主键字段不能相互依赖。 每列都与主键有直接关系,不存在传递的依赖(即不存在传递依赖)
第一范式:不符合第一范式的例子:
表:字段1、 字段2(字段2.1、字段2.2)、字段3 ......
第二范式:不符合第二范式的例子:
表:学号、课程号、姓名、学分;
这个表明显说明了两个事务:学生信息, 课程信息;由于非主键字段必须依赖主键,这里学分依赖课程号,姓名依赖与学号,所以不符合二范式。
第三范式:不符合第三范式的例子:
表:学号、姓名、 年龄、 所在学院、学院联系电话、学院联系电话
存在依赖传递: (学号) → (所在学院) → (学院地点, 学院电话)
3 解释
1NF:原子性,即字段不可以再分。
2NF:唯一性,不可以把多种数据保存在同一张表中,即一张表只能保存“一种”数据。
不符合第二范式的表:学号, 姓名, 年龄, 课程名称, 成绩, 学分;
可能会存在问题:
数据冗余,每条记录都含有相同信息;
删除异常:删除所有学生成绩,就把课程信息全删除了;
插入异常:学生未选课,无法记录进数据库;
更新异常:调整课程学分,所有行都调整。
正确做法:
学生:Student(学号, 姓名, 年龄);
课程:Course(课程名称, 学分);
选课关系:StudentCourse(学号, 课程名称, 成绩)。
3NF:直接性,每一列都和主键直接相关,而不能间接相关。(依赖不准传递)
不符合第三范式的表: 学号, 姓名, 年龄, 学院名称, 学院电话,因为存在依赖传递: (学号) → (学生)→(所在学院) → (学院电话) 。
可能会存在问题:
数据冗余:有重复值;
更新异常:有重复的冗余信息,修改时需要同时修改多条记录,否则会出现数据不一致的情况
正确做法:
学生:(学号, 姓名, 年龄, 所在学院);
学院:(学院, 电话)。
参考:
1.https://blog.csdn.net/andywuchuanlong/article/details/25913235
2.https://blog.csdn.net/chenyyhh92/article/details/51174343
相关文章
- Spring4.1新特性——数据库集成测试
- 数据库基础的知识点
- 最简单的角色权限数据库表设计
- C#基础视频教程6.2 如何简单读写数据库
- 简单的MySQL数据库主从同步配置
- clisp 一个简单的数据库
- smarty 对数据库的简单操作。
- 傻瓜式实战Oracle10g RMAN之数据库备份和恢复之catalog模式
- 【MYSQL数据库开发之二】MYSQL 基础语句的书写与一些数据库操作(创建使用数据库、表)!
- Yii2.0 对数据库 查询的简单操作
- smarty 对数据库的简单操作。
- MongoDB详解(五)——MongoDB数据库简单使用
- 数据库的最简单实现
- 数据库锁的基本原理
- ETL工具之Kettle的简单使用一(不同数据库之间的数据抽取-转换-加载)
- 如何创建最简单的 ABAP 数据库表,以及编码从数据库表中读取数据 (上)
- 数据库的最简单实现
- Atitit 定时器在项目的应用于 servless数据库 atikvdb 目录 1.1. 项目背景1 1.2. 特点::免驱动。简单快捷。。1 1.3. 功能指标1 1.4. 模块与功能实
- 如何使用 Node.js 访问 SAP HANA Cloud 数据库里的数据
- 数据库BLOB类型字段 判断是否为空
- 【数据库设计】数据库设计的 10 个最佳实践!
- 〖Python 数据库开发实战 - Redis篇④〗- Redis命令行客户端与图形客户端的简单使用
- Python编程:使用sqlalchemy对数据库进行增删改查
- mysql查看数据库性能常用命令
- BDB (Berkeley DB)数据库简单介绍(转载)
- PostgreSQL的学习心得和知识总结(十八)|PostgreSQL数据库函数实践(优秀DBA的必由之路)
- 第1讲:MySQL数据库的基本概念以及MySQL8.0版本的部署
- Redis Nosql数据库
- mysql 主从不同步处理--数据库初始化
- 数据库索引的作用和长处缺点
- java 数据库两种连接方法
- B-树和B+树的应用:数据搜索和数据库索引
- Java连接Sql Server 2008的简单数据库应用
- 图解Win 10 应用开发之Sqlite 数据库的简单用法
- MPP数据库之Doris(4):Doris安装部署之集群部署