专栏首页Java帮帮-微信公众号-技术文章全总结数据库三大范式【面试+工作】

数据库三大范式【面试+工作】

设计良好结构的数据库,可以有效减小数据冗余,减少增删改中出现的问题。深入理解数据库设计的三范式,对于设计“健壮的数据库“十分有必要。数据库三范式是设计数据库 时参考的准则,接下来我们一一进行介绍:

一、数据库第一范式:

数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。(保持数据的原子性)

数据原子性很好理解,就是表中的字段不可再分。符合数据库第一范式的表,每个字段表意明确,看个例子:

这是一张简单的员工信息表,其中有工号、姓名、电话三个字段。通过电话这个字段获得的信息有可能是家庭电话,或是工作地点的电话,或是手机,因此表达的信息并不明确,我们可以改成这样:

那这样改完以后,表中所表达的信息就非常明确了。

二、数据库第二范式:

在满足第一范式的基础上,实体的每个非主键属性完全函数依赖于主键属性(消除部分依赖)

主键:凡是接触过数据库的人,肯定都会知道主键,主键明确标识了每条记录,一般是一个字段,也可以由两个或两个字段组成。

依赖:对于X的每个值,Y都有一个值与之对应,反过来则不一定不成立,这叫做X函数决定Y,Y函数依赖X(X往往是主键)。

还拿上面的那张表举来说,对于每个工号,都有一个姓名与之对应,即工号决定姓名,姓名依赖工号;但由于员工之间可能有重名,一个姓名可能对应多个工号,所以姓名不能决定工号。

部分依赖:当主键由两个或两个以上字段构成,而表中的某些信息通过主键的一个字段就能唯一确定,我们称这样的依赖关系为部分依赖,比如这个例子:

学生选课(学号,姓名,专业,课程号,课程名,成绩),该表中一个学生可以选多门课,一门课有多个学生。学号和课程号可以唯一确定一条记录,因此用学号和课程号做主键。

表中的姓名、专业通过主键中的学号就能唯一确定,而课程名通过课程号唯一确定,这就是部分依赖,这样的设计不符合第二范式。

不符合第二范式会带来哪些问题呢?

1、数据信息冗余,可见上表

2、增删改会出现问题,比如有一门《微机原理》没有人选,那么由于缺少学号(主键之一)那么这门课就不能出现在表里。

如何解决呢,我们可以用关系分解的方法消除部分依赖,将上表改成如下三张表:

三、数据库第三范式:

在满足第二范式的基础上,在实体中不存在非主键属性传递函数依赖于主键属性。(表中字段[非主键]不存在对主键的传递依赖)

传递依赖:A依赖于B,B依赖于C,就可以说A依赖C。看这样一张表:

这张表中有如下决定关系: 学号-->姓名,性别,系号-->决定系名,宿舍号-->决定宿舍电话,也有 学号-->系名,学号-->宿舍电话。

在这样一张表中则存在着传递依赖。也就是系名依赖系号,系号依赖学号,那么间接的系名依赖学号,宿舍号、宿舍电话和学号之间也有同样的关系。这样设计表的同样会带来数据冗余,操作异常等问题。那么我们同样可以用关系分解的分解的方法来消除传递依赖,将这张表分成三张表:

这就是数据可设计的三范式了,在设计数据表的过程中注意三范式的应用,多多实践,有助于对三范式有更深入的理解。

本文分享自微信公众号 - Java帮帮(javahelp)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-02-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 性能优化:调整 I/O 相关的等待

    编辑手记:对Oracle数据库进行调整优化,基本上最终都可以归结到I/O调整上,因此,了解如何来优化Oracle数据库的I/O对于一个DBA来说就显得至关重要。...

    数据和云
  • 性能优化:B*Tree 索引分裂之存储参数

    黄玮(Fuyuncat) 黄玮(Fuyuncat),资深 Oracle DBA,从事 Oracle 数据库管理、维护与开发工作十余年,有丰富的大型数据库设计、...

    数据和云
  • Oracle 12c多租户特性详解:PDB 的创建、克隆与维护

    PDB 的创建和访问 在使用 dbca 建库时,创建数据库之前,可以保存一下创建脚本,分析其具体执行过程。以自定义方式创建名称为julia的数据库为例,其主要脚...

    数据和云
  • 自相矛盾:Null is Not Null引发的成本误区

    黄玮(Fuyuncat) 资深Oracle DBA,个人网www.HelloDBA.com,致力于数据库底层技术的研究,其作品获得广大同行的高度评价. 在SQL...

    数据和云
  • 深入原理:Consistent Reads 与 buffer cache

    黄玮(Fuyuncat) 资深Oracle DBA,个人网www.HelloDBA.com,致力于数据库底层技术的研究,其作品获得广大同行的高度评价. 编辑手记...

    数据和云
  • 深入剖析:认识Oracle 中的 NULL 值

    杨廷琨,网名 yangtingkun 云和恩墨技术总监,Oracle ACE Director,ACOUG 核心专家 经常看到很多人提出和NULL有关的问题。N...

    数据和云
  • 深入内核:Asm Rebalance 原理

    李真旭@killdb Oracle ACE,云和恩墨技术专家 个人博客:www.killdb.com 编辑手记:ASM Rebalance 的过程具体发生了什么...

    数据和云
  • 巧用SQL:Oracle中实现split相关方法总结

    尚世波 从事数据库方面工作多年,专注于pl/sql开发、数据库设计、优化方面的研究,喜欢挑战 前文回顾:巧用SQL:oracle pl/sql split函...

    数据和云
  • 高频错误:ORA-01555深入剖析

    黄玮(Fuyuncat) 资深Oracle DBA,个人网站www.HelloDBA.com,致力于数据库底层技术的研究,其作品获得广大同行的高度评价. ORA...

    数据和云
  • 高危防范:巧用触发器,实现DDL监控

    在数据运维过程中,常常因为DBA的疏忽而使数据安全面临威胁,有些威胁来自数据库外部,如rm操作,而有些威胁则来自数据库内部,如Truncate操作.因此对于数据...

    数据和云

扫码关注云+社区

领取腾讯云代金券