范式及其在mysql数据库设计中的应用
一、什么是范式
1.1、范式:Normal Format,是离散数学的知识,是为了解决数据的存储与优化而提出来的。要求存储数据后,凡是能够通过关系寻找出来的数据,坚决不再重复存储,终极目标是为了减少数据的冗余。
1.2、范式是一种分层的规范,分为6层,每一层都比上一层更加严格,若要满足下一层范式,前提是满足上一层范式。6层范式:1NF,2NF...6NF;1NF是最底层,要求最低,6NF最高层,要求最严格。
1.3、mysql属于关系型数据库,有空间浪费,表设计时也要致力于节省存储空间。这与范式要解决的问题不谋而合,所以在设计mysql数据库时,会利用范式来指导设计。但是数据库不单是要解决空间问题,还要保证效率问题,范式只为解决空间问题,所以数据库的设计不可能完全按照范式的要求做。一般情况下,满足前三种范式就可以了。
1.4、范式在数据库的设计中是有指导意义,但不是强制规范。
二、第一范式
1NF:第一范式。在数据表存储数据的时候,如果表中设计的字段存储的数据,在取出来使用之前还需要额外的处理(拆分),那么表的设计不满足第一范式。第一范式要求字段的数据具有原子性,不可再分。看下面的例子:

上表设计在某种情况下不存在问题。但是如果需求是将讲课时间查出来后,分别显示开课时间和结课时间,即将字段"讲课时间"的数据拆分使用,这就违背了数据的原子性,不符合第一范式。解决方案就是将字段"讲课时间"拆成"开课时间"和"结课时间"两个字段。需要注意的是,如果需求只是显示讲课时间,不拆开数据,上表就不存在问题。所以,表设计是否满足范式也是看需求的。

三、第二范式
2NF:第二范式,前提是满足第一范式。在数据表设计的过程中,如果有复合主键,且表中有字段并不是由整个主键来确定,而是依赖主键中的某个字段(主键的部分);存在字段依赖主键的的部分的问题,称之为【部分依赖】。第二范式要求不能出现部分依赖。
举例: 下表使用复合主键:讲师+班级,字段"性别"依赖讲师,而与班级无关,这就是部分依赖。

解决方案:使用逻辑主键

四、第三范式
3NF:第三范式,前提是先满足第二范式。理论上讲,一张表中所有的字段都应该直接依赖主键(逻辑主键,代表的是业务主键), 如果表设计中存在一个字段,并不直接依赖主键,而是通过某个非主键字段依赖,最终实现依赖主键,把这种不是直接依赖主键而是依赖非主键字段的依赖关系称之为【传递依赖】。第三范式就是要解决传递依赖的问题。第三范式要求所有字段都依赖主属性。

五、逆规范化
上面的例子中,我们可以通过讲师ID查询讲师表获取讲师信息,但是这需要查询两张表(关联查询),比查询一张表效率要低。如果表记录非常多,为了效率,我们可能会讲师相关的常用信息也添加到开课表,多数情况下我们就查询开课表这一张表就可以满足需求,这样效率高。
逆规范化会导致数据冗余,所以我们要从数据冗余和查询效率两方面综合考虑。
范式及其在mysql数据库设计中的应用的更多相关文章
- MySQL优化技巧之四(数据库设计中的一些技巧)
1. 原始单据与实体之间的关系 可以是一对一.一对多.多对多的关系.在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体.在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单证对 ...
- mysql数据库设计规则总结
MySQL数据库设计总结 规则1:一般情况可以选择MyISAM存储引擎,如果需要事务支持必须使用InnoDB存储引擎. 注意:MyISAM存储引擎 B-tree索引有一个很大的限制:参与一个索引的 ...
- MySQL 数据库设计的“奥秘”
2 MySQL 数据库设计的"奥秘" [主题]逻辑设计:数据类型与 Schema 所谓"万丈高楼平地起",一个稳固的建筑离不开扎实的基础.同样,良好的的「逻辑设 ...
- mySql 数据库设计原则
mysql数据库设计原则: 必须使用InnoDB存储引擎 解读:支持事务.行级锁.并发性能更好.CPU及内存缓存页优化使得资源利用率更高 禁止使用存储过程.视图.触发器.Event 解读:高并发大数据 ...
- 数据库设计中的Soft Delete模式
最近几天有点忙,所以我们今天来一篇短的,简单地介绍一下数据库设计中的一种模式——Soft Delete. 可以说,该模式毁誉参半,甚至有非常多的人认为该模式是一个Anti-Pattern.因此在本篇文 ...
- 将Hive统计分析结果导入到MySQL数据库表中(一)——Sqoop导入方式
https://blog.csdn.net/niityzu/article/details/45190787 交通流的数据分析,需求是对于海量的城市交通数据,需要使用MapReduce清洗后导入到HB ...
- mysql数据库设计三范式
为了建立冗余较小.结构合理的数据库,设计数据库时必须遵循一定的规则.在关系型数据库中这种规则就称为范式.范式是符合某一种设计要求的总结.要想设计一个结构合理的关系型数据库,必须满足一定的范式. 在实际 ...
- MySQL数据库设计复习笔记及项目实战
最近手头上有3个项目开动,其他2个都是从底层开始的,一个已经开始了一段时间的了,在小城市小团队开发的条件下,都没有专门的DBA来做数据库的设计和维护,往往都是开发人员顶上,可是看了很多的数据库的设计, ...
- mysql 数据库设计(转)
本规范适用于mysql 5.1或以上版本使用 数据库范式 第一范式(1NF)确保每列保持原子性 第一范式(1NF):数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项. ...
随机推荐
- Unable to convert MySQL date/time value to System.DateTime问题解决方案
原因:可能是该字段(date/datetime)的值默认缺省值为:0000-00-00/0000-00-00 00:00:00,这样的数据读出来转换成System.DateTime时就会有问题: 解决 ...
- [js]this关键字代表当前执行的主体
点前是谁,this就是谁 <div id="div1" class="div1"></div> <div id="div ...
- 【Java】NO.83.Tool.1.GlassFish.1.001-【GlassFish 5 安装使用】-
1.0.0 Summary Tittle:[Java]NO.83.Tool.1.GlassFish.1.001-[GlassFish 5 安装使用]- Style:EBook Series:Java ...
- 家庭记账本之微信小程序(四)
json的学习 JSON:JavaScript 对象表示法(JavaScript Object Notation). JSON 是存储和交换文本信息的语法.类似 XML. JSON 比 XML 更小. ...
- selenium.common.exceptions.WebDriverException: Message: unknown Error: cannot find Chrome binary
使用Chrome浏览器时,经常会遇到以下报错:浏览器没有调用起来 selenium.common.exceptions.WebDriverException: Message: unknown Err ...
- Ajax 监听
$.ajaxSetup({ beforeSend: function (XMLHttpRequest) { alert("ajax请求之前"); } });
- halcon脱离hdvp运行
halcon如何脱离HDevelop运行:第一种方式(测试多台电脑全部正常):(推荐)使用本站开发的脱机修复助手:https://www.51halcon.com/thread-1217-1-1.ht ...
- VSCode 打开文件tab键空格数量异常问题
[1]现象与原因 现象:用Notepad++打开文件,tab键占4个空格键.但是,用VSCode打开,tab键缺变成了3个空格键. 原因:因为VSCode默认启用了根据文件类型自动设置tabsize的 ...
- 20190402 管道符,分号,单引号,双引号,&&的使用
:分号叫顺序执行 格式:命令:命令 && :前一条命令执行成功,后面命令继续执行:前面命令执行失败,后者不执行 格式:命令+空格&&空格+命令 || :两管道逻辑执行, ...
- ubuntu 16.04 tip
参考 1. 安装 python3.6 sudo add-apt-repository ppa:jonathonf/python-3.6 sudo apt-get update sudo apt-ge ...