三大范式
数据库设计的三大范式
引言
关系数据库中的关系必须满足一定的要求。满足不同程度要求的为不同范式。数据库的设计范式是数据库设计所需要满足的规范。只有理解数据库的设计范式,才能设计出高效率、优雅的数据库,否则可能会设计出糟糕的数据库。
数据库范式的种类
数据库的范式主要有六种:(由低到高)
第一范式
第二范式
第三范式
BC范式
第四范式
第五范式。
数据库设计满足最低要求的叫第一范式,简称 1NF。在第一范式基础上进一步满足一些要求的为第二范式,简称 2NF。在第二范式基础上进一步满足一些要求的为第三范式,简称 3NF。其余依此类推。
数据库范式的理解
数据库设计是否满足越高范式就越好?
当然不是。满足更高范式虽然可以更好的避免数据冗余,减少数据库的占用的存储空间,减轻维护数据完整性的麻烦,但是会产生更多的小表,导致操作困难,因为需要关联查询多个小表才能得到所需要数据,而且范式越高性能就会越差。
数据库设计的三大范式
在实际项目开发中,要权衡是否使用更高范式是比较麻烦的事情,数据库设计一般用得最多的也就是三大范式,因为使用第一、第二和第三范式也就足够了,不仅性能好而且方便操作和管理数据。
第一范式(1NF)
如果一个关系表中的每一个字段都是原子项,也就是不可分割,那么该表就满足第一范式
第一范式是关系表应具备的最起码的条件,如果数据库设计不能满足第一范式,就不称为关系型数据库。
例如 (学生信息表):
学生编号 姓名 性别 联系方式
20080901 张三 男 email:zs@126.com,phone:13541220018
20080902 李四 女 email:ls@126.com,phone:1373081235
以上表就不符合第一范式(1NF),原因是联系方式这个字段可以再分。
正确如下:
学生编号 姓名 性别 电子邮件 电话
20080901 张三 男 zs@126.com 13541220018
20080902 李四 女 ls@126.com 13730812350
第二范式(2NF)
如果一个关系表中每个非主键字段都完全依赖于主键,而没有部分依赖于主键,那么该表就满足第二范式。
这里完全依赖是啥意思,意思就是每个非主键字段是由整个主键决定的,而不能由主键的一部分来决定。这里所谓的主键一部分指的是复合主键,就是主键是由多个字段组成的,共同定义一行数据的唯一性。比较常见的复合主键就是多对多关联表时,中间表(也叫连接表)就是采用的复合主键。
例如(学生选课表):
学生 课程 教师 教师职称 教材 教室 上课时间
张三 MyBatis 张老师 大数据讲师 《MyBatis深入浅出》 207 09:30
李四 Hibernate 李老师 大数据讲师 《Hibernate 深入浅出》 208 09:30
这里通过(学生,课程)两个字段可以确定教师、教师职称,教材,教室和上课时间,所以可以把(学生,课程)这两个字段作为复合主键。但是,教材并不完全依赖于(学生,课程),只拿出课程就可以确定教材,因为一个课程,一定指定了某个教材。
这就叫不完全依赖,或者部分依赖。出现这种情况,就不满足第二范式(2NF)。
正确如下:
选课表:
学生 课程 教师 教师职称 教室 上课时间
张三 MyBatis 张老师 大数据讲师 207 09:30
李四 Hibernate 李老师 大数据讲师 208 09:30
课程表:
课程 教材
MyBatis 《MyBatis深入浅出》
Hibernate 《Hibernate深入浅出》
所以,第二范式可以说是消除部分依赖。第二范式可以减少插入异常,删除异常和修改异常。
第三范式(3NF)
如果一个关系表中,非主主键字段之间不存在传递依赖,那么这样就满足第三范式。
选课表:
学生 课程 教师 教师职称 教室 上课时间
张三 MyBatis 张老师 大数据讲师 207 09:30
李四 Hibernate 李老师 大数据讲师 208 09:30
第二范式修改后的选课表中,一个教师能确定一个教师职称。这里,虽然教师依赖于(学生,课程),但教师职称仅依赖于教师,并不直接依赖于(学生,课程),这就叫传递依赖,第三范式就是要消除传递依赖。
正确如下:
选课表:
学生 课程 教师 教室 上课时间
张三 MyBatis 张老师 207 09:30
李四 Hibernate 李老师 208 09:30
教师表:
教师 教师职称
张老师 大数据讲师
李老师 大数据讲师
这样,新教师的职称在没被选课的时候也有地方存了,没人选这个教师的课的时候教师的职称也不至于被删除,修改教师职称时只修改教师表就可以了。
总结
数据库设计并非遵循越高范式越好,实际项目开发需要权衡,一般遵循三大范式:
第一范式就是原子性(字段不可再分割)
第二范式就是完全依赖(没有部分依赖)
第三范式就是没有传递依赖
作者:Binge
出处:http://www.cnblogs.com/binbingg/
本文版权归作者和博客园共有,转载必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。
标签: 三大范式
原文地址:https://www.cnblogs.com/zys1223/p/15264563.html
- NativeScript工作原理
- 如何合并Git 代码库中牛人的代码到自己的库
- Kafka剖析系列之Consumer解析
- android之View绘制
- 高性能JavaScript-JS脚本加载与执行对性能的影响
- CSS3伪类和伪元素的特性和区别
- Kafka剖析系列之Benchmark
- 初探React与D3的结合-或许是visualization的新突破?
- Redis 在Centos Linux 上的启动脚本
- 理解JavaScript的临时包装对象
- JavaScript实现私有属性
- 使用LRU算法缓存图片,android 3.0
- 深入理解JavaScript原型:prototype,__proto__和constructor
- Comparable 与 Comparator 浅析
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- leetcode - 最小路径和
- Javascript中的数据类型
- JAVA 应用日志最佳实践
- 用pageadmin cms系统进行网站制作的经验总结
- 14个Linux系统安全小妙招,总有一招用的上
- CVE-2020-14645:Weblogic远程代码执行复现
- Centos7 安装Mysql-寻找共性-万变不离其宗
- MySQL 入门、安装和客户端管理工具
- MySQL 基本使用(上):DDL 和 DML 语句
- MySQL 基本使用(下):DCL 语句和聚合函数
- 玩转 PhpStorm 系列(二):导航篇
- 带你写出符合Promise/A+规范Promise的源码
- 「R」R Docker 教程
- 「Workshop」第十期:聚类
- 使用 Vue 3.0,你可能不再需要Vuex了