一、什么是范式

  1.1、范式:Normal Format,是离散数学的知识,是为了解决数据的存储与优化而提出来的。要求存储数据后,凡是能够通过关系寻找出来的数据,坚决不再重复存储,终极目标是为了减少数据的冗余。

  1.2、范式是一种分层的规范,分为6层,每一层都比上一层更加严格,若要满足下一层范式,前提是满足上一层范式。6层范式:1NF,2NF...6NF;1NF是最底层,要求最低,6NF最高层,要求最严格。

  1.3、mysql属于关系型数据库,有空间浪费,表设计时也要致力于节省存储空间。这与范式要解决的问题不谋而合,所以在设计mysql数据库时,会利用范式来指导设计。但是数据库不单是要解决空间问题,还要保证效率问题,范式只为解决空间问题,所以数据库的设计不可能完全按照范式的要求做。一般情况下,满足前三种范式就可以了。

  1.4、范式在数据库的设计中是有指导意义,但不是强制规范。

二、第一范式

  1NF:第一范式。在数据表存储数据的时候,如果表中设计的字段存储的数据,在取出来使用之前还需要额外的处理(拆分),那么表的设计不满足第一范式。第一范式要求字段的数据具有原子性,不可再分。看下面的例子:

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

三、第二范式

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

解决方案:使用逻辑主键

四、第三范式

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

五、逆规范化

  上面的例子中,我们可以通过讲师ID查询讲师表获取讲师信息,但是这需要查询两张表(关联查询),比查询一张表效率要低。如果表记录非常多,为了效率,我们可能会讲师相关的常用信息也添加到开课表,多数情况下我们就查询开课表这一张表就可以满足需求,这样效率高。

  逆规范化会导致数据冗余,所以我们要从数据冗余和查询效率两方面综合考虑。

范式及其在mysql数据库设计中的应用的更多相关文章

  1. MySQL优化技巧之四(数据库设计中的一些技巧)

    1. 原始单据与实体之间的关系 可以是一对一.一对多.多对多的关系.在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体.在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单证对 ...

  2. mysql数据库设计规则总结

    MySQL数据库设计总结   规则1:一般情况可以选择MyISAM存储引擎,如果需要事务支持必须使用InnoDB存储引擎. 注意:MyISAM存储引擎 B-tree索引有一个很大的限制:参与一个索引的 ...

  3. MySQL 数据库设计的“奥秘”

    2 MySQL 数据库设计的"奥秘" [主题]逻辑设计:数据类型与 Schema 所谓"万丈高楼平地起",一个稳固的建筑离不开扎实的基础.同样,良好的的「逻辑设 ...

  4. mySql 数据库设计原则

    mysql数据库设计原则: 必须使用InnoDB存储引擎 解读:支持事务.行级锁.并发性能更好.CPU及内存缓存页优化使得资源利用率更高 禁止使用存储过程.视图.触发器.Event 解读:高并发大数据 ...

  5. 数据库设计中的Soft Delete模式

    最近几天有点忙,所以我们今天来一篇短的,简单地介绍一下数据库设计中的一种模式——Soft Delete. 可以说,该模式毁誉参半,甚至有非常多的人认为该模式是一个Anti-Pattern.因此在本篇文 ...

  6. 将Hive统计分析结果导入到MySQL数据库表中(一)——Sqoop导入方式

    https://blog.csdn.net/niityzu/article/details/45190787 交通流的数据分析,需求是对于海量的城市交通数据,需要使用MapReduce清洗后导入到HB ...

  7. mysql数据库设计三范式

    为了建立冗余较小.结构合理的数据库,设计数据库时必须遵循一定的规则.在关系型数据库中这种规则就称为范式.范式是符合某一种设计要求的总结.要想设计一个结构合理的关系型数据库,必须满足一定的范式. 在实际 ...

  8. MySQL数据库设计复习笔记及项目实战

    最近手头上有3个项目开动,其他2个都是从底层开始的,一个已经开始了一段时间的了,在小城市小团队开发的条件下,都没有专门的DBA来做数据库的设计和维护,往往都是开发人员顶上,可是看了很多的数据库的设计, ...

  9. mysql 数据库设计(转)

    本规范适用于mysql 5.1或以上版本使用 数据库范式 第一范式(1NF)确保每列保持原子性 第一范式(1NF):数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项. ...

随机推荐

  1. Unable to convert MySQL date/time value to System.DateTime问题解决方案

    原因:可能是该字段(date/datetime)的值默认缺省值为:0000-00-00/0000-00-00 00:00:00,这样的数据读出来转换成System.DateTime时就会有问题: 解决 ...

  2. [js]this关键字代表当前执行的主体

    点前是谁,this就是谁 <div id="div1" class="div1"></div> <div id="div ...

  3. 【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 ...

  4. 家庭记账本之微信小程序(四)

    json的学习 JSON:JavaScript 对象表示法(JavaScript Object Notation). JSON 是存储和交换文本信息的语法.类似 XML. JSON 比 XML 更小. ...

  5. selenium.common.exceptions.WebDriverException: Message: unknown Error: cannot find Chrome binary

    使用Chrome浏览器时,经常会遇到以下报错:浏览器没有调用起来 selenium.common.exceptions.WebDriverException: Message: unknown Err ...

  6. Ajax 监听

    $.ajaxSetup({ beforeSend: function (XMLHttpRequest) { alert("ajax请求之前"); } });

  7. halcon脱离hdvp运行

    halcon如何脱离HDevelop运行:第一种方式(测试多台电脑全部正常):(推荐)使用本站开发的脱机修复助手:https://www.51halcon.com/thread-1217-1-1.ht ...

  8. VSCode 打开文件tab键空格数量异常问题

    [1]现象与原因 现象:用Notepad++打开文件,tab键占4个空格键.但是,用VSCode打开,tab键缺变成了3个空格键. 原因:因为VSCode默认启用了根据文件类型自动设置tabsize的 ...

  9. 20190402 管道符,分号,单引号,双引号,&&的使用

    :分号叫顺序执行 格式:命令:命令 && :前一条命令执行成功,后面命令继续执行:前面命令执行失败,后者不执行 格式:命令+空格&&空格+命令 || :两管道逻辑执行, ...

  10. ubuntu 16.04 tip

    参考 1. 安装 python3.6 sudo add-apt-repository ppa:jonathonf/python-3.6  sudo apt-get update sudo apt-ge ...