数据库三大范式(重要)

数据库三大范式(重要)转自微信上周四下午的 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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 如何利用装饰者模式在不改变原有对象的基础上扩展功能

    点击上方“全栈程序员社区”,星标公众号 重磅干货,第一时间送达 作者:双子孤狼 blog.csdn.net/zwx900102/article/details/107740212 …

    2021年6月27日
    76
  • windows10上安装mysql(详细步骤)

    windows10上安装mysql(详细步骤)windows安装mysql(详细步骤)环境:windwos10(1511)、mysql5.7.14时间:2016年9月5日一、下载mysql1.在浏览器里打开mysql的官网http://www.mysql.com/2.进入页面顶部的”Downloads”3.打开页面底部的“Community(GPL)Downloads”

    2022年5月6日
    132
  • android源码学习:ActivityManager类全理解

    android源码学习:ActivityManager类全理解android.app下有个ActivityManager类,给类的作用,官方的解释是:这个类提供有关、交互、activities,services和包含process的信息。这个类中的许多方法都是为了调试或信息的目的,它们不应该被用来影响应用程序的运行时行为,这些方法在方法级文档中被调用。大多数应用程序开发人员不应该使用这个类,大多数的方法都是专门用例的。然而,一些方法更广泛地适

    2022年5月16日
    51
  • java tcp数据包_java tcp封装成数据包【相关词_ tcp数据包处理java】

    2-1.数据序号32位,TCP为发送的每一个字节都编一个号码,这里存储当前数据包数据第一包括网络编程结构数据JavaTCPIP的信息,所有JAVA网络编程:TCP/IP数据包结构相关内Java实现以太网帧的封装_360问答600×312-74KB-PNG第三篇:微信公众平台开发实战Java版之请求消1054×564-171KB-JPEG求助!wireshark抓取分析htt…

    2022年4月18日
    56
  • Centos7安装Promethus(普罗米修斯)监控系统完整版

    Centos7安装Promethus(普罗米修斯)监控系统完整版相关博文:1、Centos7安装Promethus(普罗米修斯)监控系统完整版2、Promethus(普罗米修斯)监控Mysql数据库3、Promethus(普罗米修斯)安装Grafana可视化图形工具4、Promethus的Grafana图形显示MySQL监控数据5、Promethus(普罗米修斯)的Grafana+onealert实现报警功能目录一、普罗米修斯…

    2022年6月5日
    35
  • 网页自动化操作之-全自动下单(淘宝/天猫)

    网页自动化操作之-全自动下单(淘宝/天猫)声明:本博客所有软件不含任何恶意代码,请放心使用QQ/微信112908676最新下载地址https://webcrawl.lanzous.com/b0dvn942d密码:htig旧版2019.11.08版本2.4.3,下载地址:https://www.lanzous.com/i785doh下载结束如遇360弹出压缩包解密提醒,请直接取消忽略操作视频2019.03.07更新优酷:https://v.youku.com/v_show/id_XNDA4OTE2O.

    2022年5月20日
    41

发表回复

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

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