第一范式(1NF)无重复的列

  所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。在第一范式(1NF)中表的每一行只包含一个实例的信息。简而言之,第一范式就是无重复的列。

1NF的定义为:符合1NF的关系中的每个属性都不可再分

下表所示情况,便不符合1NF的要求:

说明:在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。

第二范式(2NF)属性完全依赖于主键

  第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。例如员工信息表中加上了员工编号(emp_id)列,因为每个员工的员工编号是惟一的,因此每个员工可以被惟一区分。这个惟一属性列被称为主关键字或主键、主码。 
        第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。简而言之,第二范式就是属性完全依赖于主键。 

第三范式(3NF)

  满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。例如,存在一个部门信息表,其中每个部门有部门编号(dept_id)、部门名称、部门简介等信息。那么在的员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,否则就会有大量的数据冗余。简而言之,第三范式就是属性不依赖于其它非主属性。 也就是说, 如果存在非主属性对于码的传递函数依赖,则不符合3NF的要求。

实例讲解:

第一范式

如果一个关系模式R的所有属性都是不可分的基本数据项,则R∈1NF(即R符合第一范式)。

两点:

一、每个字段都只能存放单一值

课程有两个值,不符合第一范式,可改为如下

二、每笔记录都要能利用一个惟一的主键来加以识别

这里出现了重复组,同样不满足第一范式,因为缺乏唯一标识码,可改为

第二范式

若关系模式R∈1NF(即R符合第一范式),并且每一个非主属性都完全依赖于R的码,则R∈2NF(即R符合第二范式)。

这里表的码为(学号,课程), 即知道这两项可以确定系名、宿舍、分数,或者是这三项依赖于前两项,可知

分数完全依赖(学号,课程)系名部分依赖(学号,课程),即知道学号或者课程就能确定系名.宿舍楼部分依赖(学号,课程),即知道学号或者课程就能确定宿舍楼.

由于非主属性系名,宿舍楼不完全依赖与码,不符合第二范式,可改为

表一

表二

第三范式

若关系模式R∈3NF(即R符合第三范式),则每一个非主属性既不部分依赖于码也不传递依赖于码。

上面的表2不符合第三范式,这是因为你知道了系名,同样也就知道了宿舍楼,称宿舍楼传递依赖于码(学号),可分解为

-------------------------------------------------------

个人理解:

第一范式:列属性具备业务原子性

第二范式:要有主键

第三范式:两个表格之间尽量减少重复的的属性

Reference:

[1]第一、第二、第三范式之间的理解和比较

第一、第二、第三范式之间的理解和比较(转载)相关推荐

  1. 数据库_第一第二第三范式讲解(通俗易懂)

    第一范式(1NF)无重复的列 所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性.如果出现重复的属性,就可能需 ...

  2. 范式 第一 第二 第三范式

    第一范式(每个数据项不可分) 如果一个关系模式R的所有属性都是不可分的基本数据项,则R∈1NF(即R符合第一范式). 第二范式   (没有部分依赖) 若关系模式R∈1NF(即R符合第一范式),并且每一 ...

  3. java的第一范式,数据库第一范式第二第三范式关系详解

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

  4. c语言代码,输入两个数,输出第一个数到第二个数之间所有的数

    用C语言实现,输入两个数,输出第一个数到第二个数之间包含的所有数 #include <stdio.h> int num(int x, int y); int main() {int a1, ...

  5. (发现)问题才是推动创新的动力系列:两种类型硬币(均匀和非均匀)能否用第一次得正面朝上的概率推断“第一第二次依次获得正面反面情况”的概率?

    两种类型硬币(均匀和非均匀)能否用第一次得正概率推断,第一第二次依次获得正反概率? 2种硬币 均匀的 COIN1  正反概率(正0.5  反0.5) 非均匀的COIN2 (正0.9  反0.1) 问题 ...

  6. matlab实验与系统信号实验二,信号与系统上机实验-matlab(第一第二次实验课)new

    <信号与系统上机实验-matlab(第一第二次实验课)new>由会员分享,可在线阅读,更多相关<信号与系统上机实验-matlab(第一第二次实验课)new(13页珍藏版)>请在 ...

  7. c语言峰值算法_C语言寻找一组数据中的第一第二峰值

    C语言寻找一组数据中的第一第二峰值 实验要求,我需要找出一组数组中的两个峰值:第一个峰值和第二个峰值及其数组下标.这组数据画出的图应该是这样的,我就要找出图中的那两个峰值 我写的程序如下,我试了一下, ...

  8. 深入理解java虚拟机第一第二部分(周志明第三版)

    文章目录 深入理解java虚拟机(周志明第三版) 第一部分.Java的前世今生和未来展望 1.1.概述 1.2.java技术体系 1.3.Java发展史(只记录比较重要的) 1.4.Java虚拟机家族 ...

  9. 西瓜书第一第二章理解

    第一章 机器学习的整体流程: 1.确定数据集 确定特征向量和属性 2.通过某种算法进行学习和训练 3.得到模型(有监督:分类,回归,无监督:聚类) 4.进行预测 奥卡姆剃刀原则 如果多个假设与观察一致 ...

最新文章

  1. win10 更新pip
  2. Linux下磁盘监控及系统版本-CPU-内存等查看
  3. C++突破private的方案
  4. Mac OS X 下文件名乱码出现的原因和解决方法
  5. 深度残差收缩网络:(四)注意力机制下的阈值设置
  6. rc脚本(类的定义与脚本的结构、start方法、stop和status方法、以daemon方式启动)...
  7. perl 访问类方法的几种方式
  8. SAS® Model Manager功能调研
  9. combox高度修改 winfrom_WinForm窗体中ComboBox控件自定义高度和选项文本居中完美解决方案...
  10. Git(4)-- 如何退出 git log 和 git commit 状态
  11. Angr安装与使用之使用篇(十五)
  12. pip install -r requirements.txt 报错。
  13. MATLAB调用电脑摄像头前安装图像采集工具箱硬件支持包
  14. Spring框架浅谈及Spring框架学习小结
  15. mysql 表间关联查询
  16. 阿里云服务器使用freessl配置免费证书Nginx
  17. 如何申请电子邮箱,怎样注册163邮箱
  18. 收入增速环比抬升!从业务数据透视运营商转型战略布局
  19. tf.keras计算FLOPs
  20. 【黑马程序员西安中心】作为应届生的我,终于进入IT行业了

热门文章

  1. maven打包pom.xml备忘
  2. php常用函数time
  3. 为mongodb加上权限
  4. 通电后第一次开机黑屏_电脑无法开机怎么办,8 种情况的修复方法
  5. java 8 stream_深度分析:java8的新特性lambda和stream流,看完你学会了吗?
  6. haarcascade_frontalface_default.xml等文件
  7. unslider制作轮播图
  8. centos7输入systemctl status network.service出现Unit network.service could not be found的解决办法
  9. 利用string 字符串拷贝
  10. Pokémon Go火遍全球,开启全民捕捉小精灵的时代