首页 > 数据库 >数据库三范式说的到底是啥?

数据库三范式说的到底是啥?

时间:2023-10-13 10:45:36浏览次数:45  
标签:教师 非主 范式 到底 数据库 课程 职称 属性

数据库三范式说的到底是啥?

数据库三范式说的到底是啥?

冰红茶 冰红茶 Coding!  

大家好,我是小斌。

数据库相关课程上我们常常会听到著名的三范式,这到底说的是啥?

先来看看一些概念定义:

第三范式(Third Normal Form,3rd NF)就是指表中的所有数据元素不但要能唯一地被主关键字所标识,而且它们之间还必须相互独立,不存在其他的函数关系。也就是说,对于一个满足2nd NF 的数据结构来说,表中有可能存在某些数据元素依赖于其他非关键字数据元素的现象,必须消除。

书上的定义总是力求准确规范,下面试着说点人话。

1.第一范式(1NF)

表中无表,即每个属性都是不可分割的。

不满足第一范式的数据库就不是关系型数据库,所以说能在MySql建立的表肯定满足第一范式。

其中 联系方式 这个属性还能继续被分割,这样无法建立MySql表。

2.第二范式(2NF)

满足第一范式基础上,非主属性必须完全依赖于主属性。

即主键的整体才能确定一个非主属性。

如果主键的部分属性就确定了一个非主属性就不满足第二范式。

有一张表 R (学号,课程号,成绩,姓名, 老师,老师职称),标红的是主键,其余的是非主键,又叫做非主属性。

下面我们来观察一下,主键和非主键之间的关系。

第一步,我们先观察成绩:

(学号,课程号) → (成绩)。
我们发现无论是学号还是课程号都无法单独确定成绩情况,只有知道了一个人的学号和课程号才能确定有效的成绩。

学号和成绩必须作为一个整体才能决定成绩。

此时我们称成绩完全函数依赖于(学号,课程号)。

记作:X(学号,课程号)

Y(成绩),这里的f是full全部的意思。

接着你可以自行判断,教师和教师职称都满足完全函数依赖。

第二步,我们再观察姓名:

我们可以发现其实(学号)→姓名,意思是就是主属性的其中的某一部分属性(学号)就可以确定姓名。

所以我们称姓名部分函数依赖于(学号,课程号),记作

X(学号,课程号)

Y(姓名),这里的p就是part一部分。

最后我们回到第二范式:

非主属性必须完全依赖于主属性,很明显这张表并不满足第二范式。因为姓名部分函数依赖于主属性。

那么,不满足第二范式的表会存在什么弊端呢?

比如说我们现在要新增一个学生,该学生还没有选课,因此就不能新增。课程号是关键码,又必须添加,产生了冲突。这是因为知道学号,姓名就确定一个学生,并不需要课程号。

因此我们必须将消除表中对主属性部分依赖的非主属性,这里指的就是姓名。

C(学号,课程号,成绩,教师,教师职称)

S(学号,姓名)

 

3.第三范式(3NF)

满足第二范式基础上,且消除对主属性的传递依赖。

通过观察我们可以发现(学号,课程号)之所以能决定教师职称并不是直接得出来的,是因为我们知道了教师才知道教师职称。

即X(学号,课程号)→Y(教师),Y(教师)→Z (教师职称) 导致的X(学号,课程号)→Z(教师职称)。

我们称教师职称是传递依赖于(学号,课程号)。

存在传递依赖也有弊端,比如:

老师职称改变了,要修改很多条数据。(修改异常)

没人选某个老师的课时候,该老师的职称记录就会被全部删除。(删除异常)

新来老师还没有定教哪门课,教师职称不知该保存到什么地方。(插入异常)

所以,我们必须消除传递依赖。具体做法就是消除传递依赖的非主属性:

(学号,课程号,成绩,教师)

(教师,教师职称)

再举一个例子:

 

 

 

下面是一道题目,欢迎大家一起交流~

 

标签:教师,非主,范式,到底,数据库,课程,职称,属性
From: https://www.cnblogs.com/sexintercourse/p/17761530.html

相关文章

  • Lumen框架 之数据库迁移
    一、基本操作1、/database/migrations/目录下生成一个php文件,这个文件主要包括两个函数,在up()函数中根据你的需求定义数据库字段phpartisanmake:migrationcreate_users_table--create=users<?phpuseIlluminate\Database\Migrations\Migration;useIlluminate\Datab......
  • 公费生违约到底是责任心的缺失还是追求个人利益的胜利
    看了个新闻:https://baijiahao.baidu.com/s?id=1779517583554810308&wfr=spider&for=pc              =============================================  在东北某高校读PhD,身边就有一些公费生,在学校里享受各种特权,平时虽然有些看不过眼,......
  • Oracle数据库迁移注意事项
    本文基于使用数据泵(datapump)迁移数据库时,特别需要注意的几点。1.sys下别其他用户调用的package,procedure等-场景:大型数据库中,都会有自定义的表分区管理procedure2.tnsnames.ora、listener.ora、sqlnet.ora的信息-场景:有些场景可能会使用oraclewallet,因......
  • java数据库与JDBC
    java数据库与JDBCjava与MYSQL1.下载驱动https://dev.mysql.com/downloads/connector/j/https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-j-8.1.0.zip2.导入mysql-connector-j.*.jar包3.然后在src目录下新建一个java类4.写入数据库连接测试代码import......
  • 数据库的底层逻辑
    服务器向客户端请求一共分别三层第一层:连接层第二层:服务层第三层:引擎层存储层(1)服务器处理客户端请求服务器进程对客户端进程发送的请求做了什么处理,才能产生最后的处理结果呢?这里以请求为例展示:下面具体看一下第一层:连接层系统(客户端)访问MySQL数据库之前,做的第一件事就......
  • 持续测试新范式:拨压测一体化
    作者:拂衣近日,在TiD2023质量竞争力大会上,来自阿里云云原生可观测团队的吴垚进行了《持续测试新范式:拨压测一体化》主题分享,本次分享包含三部分:业务连续性对稳定性平台的需求阿里稳定性平台的演进及趋势分析拨压测一体化的概念及最佳实践如何保证业务连续性在正式开始今......
  • 数据库解决获取一个字段parent中某个字符串child第一次和第二次出现的位置之间的内容c
    下面就postgresql数据和oracle数据库分别提供两种解决方法--postgresql数据库解决获取一个字段parent中某个字符串child第一次和第二次出现的位置之间的内容cut--方法一selectcasewhenposition(childinparent)>0thensubstring(parent,position(childinparent)+l......
  • Oracle数据库导入、导出详解
    Oracle11g数据库导入导出方式传统方式【exp(导出)和(imp)导入】数据泵方式【expdp导出和(impdp)导入】第三方工具【PL/sqlDevelpoer】一、什么是数据库导入导出?Oracle11g数据库的导入/导出,就是我们通常所说的Oracle数据的还原/备份。 数据库导入:把.dmp格式文件从本地导入到......
  • 【2023年10月12日】stf61-MySQL数据库
     stf61-MySQL数据库前言1)为什么学?● 常见的笔试题● 有利于更好的开展测试工作2)学什么?理论:基本的术语和概念实操:数据库操作、表操作、数据操作、其他常见数据库功能3)怎么学?多在实训环境里练习,在练习中掌握 理论 数据库系统: 表:8条记录/行,6个字段/列 ......
  • 推荐 四种优秀的数据库设计工具
    众所周知,良好的数据库设计能够大幅减少后期的运维工作,同时也能最大程度地减少软件项目出错的可能。由于我们所面临的真实项目需求往往五花八门,因此需要找到合适的设计工具,来实现事半功倍的效果。本文将从如下四个方面和您一起比较四种优秀数据库设计工具的各自优缺点。用户界面可支......