一、什么是范式

  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. C# 如何使用长度来切分字符串

    参考网址:https://blog.csdn.net/yenange/article/details/39637211 using System; using System.Collections.G ...

  2. git常用操作命令使用说明

    设置用户名和邮箱 git config --global user.email 'xxx' git config --global user.name 'xxx' 创建分支 git branch xx ...

  3. java之jedis使用

    下载 依赖jar包下载 使用 # Redis settings redis.host=192.168.208.153 redis.port=6379 redis.pass=1234 redis.tim ...

  4. C#设计模式(7)——适配器模式(Adapter Pattern)(转)

    一.引言 在实际的开发过程中,由于应用环境的变化(例如使用语言的变化),我们需要的实现在新的环境中没有现存对象可以满足,但是其他环境却存在这样现存的对象.那么如果将“将现存的对象”在新的环境中进行调用 ...

  5. Java 集合类框架

    1 package test; import java.util.ArrayList; import java.util.Collection; import java.util.Date; impo ...

  6. CentOS 7 keepalived+LVS

    LVS架构中 , 不管是NAT模式还是DR模式 , 当后端的RS宕机了 , 调度器还是会把请求转发到宕掉的RS上 , 然而keepalived可以解决该问题 , 它不仅仅有高可用的功能 , 还有负载均 ...

  7. 自定义Word颜色主题

    外观 说明 看到这个黑色编辑器的界面,第一印象可能认为是Sublime.Atom. VScode或者其它markdown编辑器.其实仅仅是微软的Word经过了自定义主题. 选择清晰易于辨认的字体和深色 ...

  8. PTA第二个编程题总结

    7-1 币值转换 (20 分) 输入一个整数(位数不超过9位)代表一个人民币值(单位为元),请转换成财务要求的大写中文格式.如23108元,转换后变成“贰万叁仟壹百零捌”元.为了简化输出,用小写英文字 ...

  9. vue.js中的computed和watch的区别

    1.computed在调用时不需要加(),watch是不需要调用的2.computed如果属性没有发生改变时会从缓存中读取值,watch当属性发生改变时会接收到2个值:一个为新值,一个为旧值3.com ...

  10. nginx与PHP配置

    一.安装依赖包 yum -y install  libxml2  libxml2-devel  openssl  openssl-devel  curl  curl-devel libjpeg  li ...