数据库三大范式(重要)

数据库三大范式(重要)转自微信上周四下午的 VIP 试听课是由芒果给大家介绍的 MySQL 的一些基础知识 在这里芒果给大家分享其中的一部分内容 对数据库三大范式做个小介绍 范式 数据库的设计范式 是符合某一种级别的关系模式的集合 构造数据库必须遵循一定的规则 在关系数据库中 这种规则就是范式 关系数据库中的关系必须满足一定的要求 即满足不同的范式 范式 对于软件的性能 数据库的维护都是我们软件从业人员必须掌握的内容

转自微信

上周四下午的VIP试听课是由芒果给大家介绍的MySQL的一些基础知识,在这里芒果给大家分享其中的一部分内容——对数据库三大范式做个小介绍:

范式(数据库的设计范式)是符合某一种级别的关系模式的集合。构造数据库必须遵循一定的规则,在关系数据库中,这种规则就是范式。关系数据库中的关系必须满足一定的要求,即满足不同的范式。范式,对于软件的性能、数据库的维护都是我们软件从业人员必须掌握的内容。

 

目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、Boyce-Codd范式(BCNF)、第四范式(4NF)和第五范式(5NF)。

满足最低要求的范式是第一范式(1NF),在第一范式的基础上进一步满足更多要求的称为第二范式(2NF),其余范式以次类推。一般说来,数据库只需满足第三范式(3NF)就行了,所以在这里我也就跟大家介绍这三大范式。这六种范式关系如下图所示:

数据库三大范式(重要)

 

 

第一范式(1NF)

确保每列的原子性(强调的是列的原子性,即列不能够再分成其他几列)。实际上,第一范式是所有关系型数据库的最基本要求。

例:

数据库三大范式(重要)

按照1NF的要求如上图的数据表,它的第三列和第四列明显是不符合原子性的,这两列都可以被分割为两列,要符合第一范式,我们可以将其改为以下形式:

 

数据库三大范式(重要)

 

 

第二范式(2NF)

第二范式依赖第一范式,所以第二范式必须符合第一,然后第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。

例:

数据库三大范式(重要)数据库三大范式(重要)

如上图所示数据表,它的主键为:学号+课程(联合主键),而姓名、系名、系主任都是仅仅依赖于学号,与课程无关,明显不符合第二范式。

对于每一个学生的姓名、系名、系主任信息都重复多次——数据冗余;如果学校新开设一个院系,还未招生,无学号即课程表,则系名跟系主任无法插入表格——插入异常;如果删除某一个系所有学生的成绩信息,那么系名、系主任信息也会随之消失——删除异常;如果修改某个学生的姓名,则表格中多条记录都要进行修改——修改异常

对于这样的表格,我们肯定要进行修改的,那么要怎么修改才能满足第二范式呢?

我们首先来看表格属性的关系图:

数据库三大范式(重要)

从上图我们可以看出姓名、系名都与学号相关;而系主任与系名相关,间接与学号相关;分数与学号+课程名相关。因此我们可以根据这些关系依赖将表格,拆分为以下两个表格:

数据库三大范式(重要)

数据库三大范式(重要)

这样分割之后,表1的分数与主键(学号+课程)相关,表2的姓名、系名、系主任与主键(学号)相关,而非部分相关,满足第二范式要求。

 

第三范式(3NF)

在第二范式的基础上更进一层,目标是确保每列都和主键列直接相关,而不是间接相关(另外非主键列必须直接依赖于主键,不能存在传递依赖)。

上面根据第二范式修改的表格中,在表2中,系主任是通过系名与学号间接相关的,明显不符合第三范式。

并且当一个系有多名学生时(在实际记录中,这是必然情况),系主任信息也会有多条——数据冗余;如果学校新开设一个院系,还未招生,无学号即课程表,则系名跟系主任无法插入表格——插入异常没有解决;如果删除某一个系所有学生的成绩信息,那么系名、系主任信息也会随之消失——删除异常也没有解决。 

对于这样的表格,我们肯定要进行修改的,那么要怎么继续修改才能满足第三范式呢?

我们再来看表格属性的关系图:

数据库三大范式(重要)

从上图我们可以看出姓名、系名都与学号直接相关;而系主任与系名直接相关;分数与学号+课程名相关。因此我们可以根据这些关系依赖将上面的表格2,拆分为以下两个表格,具体表格情况如下:

数据库三大范式(重要)

数据库三大范式(重要)

这样就满足了第三范式,而且对于数据冗余、插入异常、删除异常的情况都得到了解决。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233866.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • @RequestParam注解使用

    @RequestParam注解使用1、作用:@RequestParam:将请求参数绑定到你控制器的方法参数上(是springmvc中接收普通参数的注解)2、语法:语法:@RequestParam(value=”参数名”,required=”true/false”,defaultValue=””)value:参数名required:是否包含该参数,默认为true,表示该请求路径中必须包含该参数,如果不包含就报…

    2022年6月30日
    42
  • 金山词霸2009牛津版完整激活成功教程版+绿色精简版下载

    金山词霸2009牛津版完整激活成功教程版+绿色精简版下载山软件推出了最新的《金山词霸2009牛津版》了!这次金山词霸与牛津合作,一次性增加6本牛津词典,这在牛津在全球的翻译软件合作伙伴中也属首次,实属不容易呢,可以说提升了金山词霸在翻译软件类中的权威和经典的形象了。    这次《金山词霸2009牛津版》里面内置了6本牛津词典:《新牛津英汉双解大词典》、《新牛津美语大词典》、《牛津英语习语词典》、《牛津短语动词词典》、《牛津英语搭配词典》、《牛津英语同义

    2022年7月15日
    14
  • django配置文件详解_pycharm配置django

    django配置文件详解_pycharm配置django前言django框架的日志通过python内置的logging模块实现的,既可以记录自定义的一些信息描述,也可以记录系统运行中的一些对象数据,还可以记录包括堆栈跟踪、错误代码之类的详细信息。log

    2022年7月30日
    9
  • Spring Boot 集成MyBatis[通俗易懂]

    Spring Boot 集成MyBatis[通俗易懂]SpringBoot集成MyBatis在配置MyBatis前,我们先配置一个druid数据源。SpringBoot集成druiddruid有很多个配置选项,使用SpringBoot的ConfigurationProperties我们可以很方便的配置druid。创建DataSourceConfig如下:/***数据源**@authorliuzh*@since201

    2022年5月25日
    35
  • StringUtils工具类常用方法「建议收藏」

    StringUtils工具类常用方法「建议收藏」StringUtils类在操作字符串是安全的,不会报空指针异常,也正因此,在操作字符串时使用StringUtils相比使用原生的String会更加安全。一、判空StringUtils提供常用的判断空字符串有两个方法:isEmpty和isBlank,这两者的有何区别呢,直接看源码://isEmptypublicstaticbooleanisEmpty(Stringstr)…

    2022年6月11日
    31
  • 程序员需要什么条件_大厂程序员啥意思

    程序员需要什么条件_大厂程序员啥意思从参加工作到现在,短短的几年内,我投资在自己身上的钱已超过三十多万,光买书籍的钱就已超过总投资的三分之一,买了不少于上千本书,有实体书,也有电子书。这些书不仅提升了我的技术能力,更提升了我的视野和认知。

    2022年8月22日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号