一、范式的定义

程序员在做数据库设计时不是心血来潮胡乱设计的,而是需要遵循一定的规范而为之,这些规范就是为了设计出合理而实用的数据库而总结的的,专门适用于任何关系型数据库。

数据库设计在很大程度上取决于数据的存储方式以及开发人员对数据的处理方式。 因此,需要建立科学的规范来满足数据库设计的合理性。

前人总结出的范式是符合一定水平的一组关系模式,关系数据库中的关系必须这些范式的某些要求,而满足不同程度要求的关系则是不同的范例,比如目前已经有第一范式、第二范式、第三范式、第四范式等。

二、什么是第一范式、第二范式和第三范式

第一范式的理解与举例

初学者只看概念是很难弄清楚范式的定义的,下面来看一张数据表的例子理解第一范式的定义。

上表中的进货和销售两列显然不符合第一范式的定义,因为进货还能再分割为数量和单价,销售列也一样,不符合字段不可分割的特性。

因此我们将进货和销售两个字段进行拆分后,该数据表结构所有的字段都是最基本的单元不可再次拆分,满足了数据库第一范式的要求,见下图表结构:

仅仅能够满足第一范式的要求是不够的,还是会存在很多问题,下面我们看一下一张满足第一范式的表存在了哪些问题?根据这些问题引出第二范式,见下图:

上图是一张学生表,所有的字段都满足不可再次分割的情况,但是数据却出现了数据冗余,学号1101的学生三个科目出现了三条数据,我们想要删除该学生记录的话需要删三条记录,修改院系的话也需要修改三条记录,很明显出现了删除异常、插入异常等具体问题,这些问题就需要第二范式解决。

第二范式的理解与举例

第二范式首先要满足第一范式的基本规范,要求非主键属性的所有字段必须完全地依赖主键属性的字段,非主关键字的属性要跟主关键字的属性形成一一对应的关系,并且要求数据表的所有字段都可以被唯一地区分,不能存在非完全依赖的情况。

单看第二范式的定义感觉比第一范式还难理解,如果一张表结构只有一个主键字段,并且所有字段都满足第一范式的话,那么这张数据库表就一定满足第二范式,如果是多个字段组成的联合主键的话,其它所有的字段都必须对联合主键的每一个字段完全依赖。

对于联合主键的完全依赖关系比较晦涩难懂,下面我们还是用一张具体的数据表举例说明一下,详见下图:

上图是小编自己设计的大学生课程数据表,其中设置课程+学号两个字段为联合主键,接下来我们拿每一个字段都去套第一范式和第二范式的定义,首先课程字段、成绩字段以及课程学分字段都不能再次进行拆分了,它首先满足第一范式。

成绩这个字段跟主键学号有依赖关系,跟主键课程也有依赖关系,那我们就可以认为成绩跟联合主键有完全依赖关系,接下来的重点来了,不要眨眼哦。

课程学分字段跟主键课程有依赖关系,但是课程学分跟主键学号没有依赖关系啊,课程的学分跟某一个学生的学号肯定没有半毛钱的关系啊,课程可以决定课程学分的分值大小,但是学号却决定不了课程学分啊,因此我们认为课程学分字段对联合主键(学号+课程)只具备部分依赖关系,满足第一范式不满足第二范式。

既然大学生课程数据表不满足第二范式的要求,接下来我们做一下数据表的拆分和修改以使其满足第二范式,见下图:

大学生选课数据表

大学生信息表

根据课程学分不满足联合主键完全依赖的情况,我们将课程学分独立出来单独设计了一张表,这样就形成了大学生选课数据表和大学生信息表两张表。

根据第一二范式的定义,两张数据表皆满足主键完全依赖的情况,符合数据库设计的第一二范式的规定。

第三范式的理解与举例

一张数据设计表在满足第一第二范式的前提下,非主键字段不但要与主键字段有完全依赖的关系,而且各个非主键属性字段之间不能有任何的依赖关系,各个非主属性字段必须是相互独立的,它们之间不能有直接或间接的函数依赖关系,满足以上前提的规定被称作第三范式。

话不多说,还是上案例能够了解的更透彻一些,见下图的学生表:

上表中设计的单列主键,设置学号为主键,其它的字段如:姓名、性别、班级和班主任都与学号字段一一对应有完全依赖关系,故满足第一范式和第二范式。

下面我们来分析第三范式的问题,首先姓名和性别不存在任何关系,性别和班级没有任何关系,但是班级和班主任就存在依赖关系,哪个班级就决定了它的班主任是哪位,哪个班主任也决定了它所属的哪个班级,此种情况说明班级和班主任两个非主键字段有依赖传递的关系,不满足第三范式。

接下来对上表加以改造,使其满足第三范式,我们将班主任和班级这两个个字段拆分出来,这样就形成了学生表和班级表,如下图:

学生数据库表

班级数据库表

经过对上面表的拆分,这样就不存在班级和班主任之间依赖传递的问题了,轻松的解决了问题,并且满足第一第二第三范式。

通过以上三个案例的详解,大家应该能够很清楚的指导如何区分三大范式了吧,希望对大家有一定的帮助,也希望大家在设计数据库时能够紧扣三大范式的理念,这样设计出的表结构一般就不会有什么大问题了。

三、反三范式的理解

上面的三大范式充分做到了没有数据冗余的情况,但是不存在数据冗余却未必是最好最高效的数据库设计,相反适当的数据冗余还会减少关联查询涉及的表的数量,从而提高查询效率,这种做适当冗余的数据库设计规范被称作反三范式。

反三范式是基于第三范式所调整的,范式越高意味着表的划分更细,多表联查时表数量太多,严重地降低了数据库查询性能,而反三范式可以减少关联管理,更多有用的数据在一张表上显示。

反范式化一定要做到合理和适可而止的适度操作,切不可打乱原先的三大范式的平衡,反范式一定是要在满足原先符合第一、第二、第三范式的基础上稍微调整的,具体操作还需要实际工作中的实际业务练手和增加这方面的相关经验。

java的第一范式,数据库第一范式第二第三范式关系详解相关推荐

  1. java oracle数据库连接代码,java连接oracle数据库代码实例(注释详解)

    import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sq ...

  2. 关系型数据库表之间的联系[关系]详解

    关系型数据库表之间的联系[关系]详解 在表中,行和列的逻辑顺序无关紧要.每个表至少包含一列,该列被称为主键,它唯一地标识了表中的每一行. 键是表中扮演特殊角色的列,有两种键:主键.外键. 主键(Pri ...

  3. Java中常见RuntimeException与其他异常表及Exception逻辑关系详解

    Java中常见RuntimeException与其他异常表及Exception逻辑关系详解 前言 常见`RuntimeException` 其他错误类型 `Error`类 `Exception`类 E ...

  4. java 修改mysql数据库表结构_MYSQL数据库表结构优化方法详解

    摘要:这篇MySQL栏目下的"MYSQL数据库表结构优化方法详解",介绍的技术点是"mysql数据库表结构.MySQL数据库.数据库表结构.MySQL.据库表结构.数据库 ...

  5. Java操作数据库方式二DBCP使用详解

    ##概述 DBCP的全称是:DataBase connection pool,翻译是:数据库连接池. 在Java操作数据库方式一JDBC使用详解中说到直接使用JDBC非常消耗资源.为了避免频繁关闭链接 ...

  6. 数据库随笔-1NF,2NF,3NF详解

    数据库随笔-1NF,2NF,3NF详解 基础概念 通过表的更新来举例说明 总结 基础概念 1. 第一范式(1NF):每一列都是不可分割的原子数据项 2. 第二范式(2NF):在1NF的基础上,非码属性 ...

  7. slf4j log4j logback关系详解和相关用法 【by Sinte-Beuve】

    slf4j log4j logback关系详解和相关用法 slf4j log4j logback的关系 The Simple Logging Facade for Java是什么? log4j和log ...

  8. hbase 二进制数据写入_分布式数据库HBase的架构设计详解(有彩蛋)

    原标题:分布式数据库HBase的架构设计详解(有彩蛋) 本文根据DBAplus社群第99期线上分享整理而成,文末还有好书送哦~ 讲师介绍 陈鸿威 云财经大数据CTO 曾任百度高级工程师,现主持设计开发 ...

  9. 好程序员前端教程之JavaScript闭包和匿名函数的关系详解...

    好程序员前端教程之JavaScript闭包和匿名函数的关系详解 本文讲的是关于JavaScript闭包和匿名函数两者之间的关系,从匿名函数概念到立即执行函数,最后到闭包.下面一起来看看文章分析,希望你 ...

最新文章

  1. AMAZING AUCTION (第三届省赛)
  2. 白话Elasticsearch52-深入聚合数据分析之fielddata内存控制、circuit breaker短路器、fielddata filter、预加载机制以及序号标记预加载
  3. ITK:遮罩图像的归一化相关性
  4. 秒杀多线程第十六篇 多线程十大经典案例之一 双线程读写队列数据
  5. c swap方法在哪个库里面_swap
  6. bzoj4403-序列统计【Lucas,组合数学】
  7. 关于线程轮流打印0-99
  8. Python地理数据处理库GDAL调研记录
  9. JavaScript-取消事件-e.preventDefault();
  10. 一文带你全面了解虚拟机的四种网络模型(图文并茂)
  11. Delphi2010新手学习(1)
  12. 百度NLP架构与应用
  13. OpenGL——场景设计
  14. design pattern scard
  15. shiro+jwt登录认证anon配置无效
  16. 【图文】实操重置密码
  17. html制作学生成绩表,学生成绩查询系统的制作方法——Excel篇
  18. 【蓝桥】2019第十届蓝桥杯省赛C/C++大学B组题目及感想(考场代码和思考)
  19. python关键字定义_python 关键字与含义
  20. 查看网站黑链的几种方法

热门文章

  1. 遗传算法在离散型工厂选址问题中的应用
  2. 做网站服务器e3,用e3做游戏服务器
  3. 部门精细化管理流程优化记(三)
  4. HTML与CSS基础练习~字体大小、高与行高
  5. 米家激光投影仪与当贝X3激光投影仪买哪个?
  6. Python+tkinter+PyAudio录制电脑扬声器声音
  7. 实现图文混排ListView展示 ---- Android版
  8. 小程序地图插入图标后 怎么实现点击图标弹出窗口
  9. java贪吃蛇学期,Java实现贪吃蛇
  10. 装linux分区给多大,linux安装分区大小分配(转载)