https://blog.csdn.net/wyh7280/article/details/83350722

范式通俗理解:1NF、2NF、3NF和BNCF
原创hongiii 最后发布于2018-10-24 21:03:43 阅读数 14993 收藏
展开
范式通俗理解:1NF、2NF、3NF和BNCF
准备知识
超键、候选键、主键
函数依赖
部分依赖
传递依赖
范式
1NF
2NF
3NF
BCNF
参考
准备知识
超键、候选键、主键
超键
超键(super key):在关系中能唯一标识元组的属性集称为关系模式的超键

候选键
候选键(candidate key):不含有多余属性的超键称为候选键。也就是关系中的一个属性组,其值能唯一标识一个元组。若从属性组中去掉任何一个属性,它就不具有这一性质了,这样的属性组称作候选键。

主属性:任何一个候选键中的属性称作主属性。(请记住这个概念)

主键
主键(primary key):用户从一个关系的多个候选键中,选定一个作为主键。

结合具体的例子进行解释,现有学生表如下:
学生(学号,姓名,性别,身份证号)

学号 姓名 性别 身份证号
1 小王 男 344
2 小吴 女 354
3 小丽 女 364
4 小张 男 374
超键
由超键的定义可知,在学生表中含有学号或者身份证号的任意组合都可以唯一标识一个学生,那么它们就是此表的超键。如:(学号)、(身份证号)、(学号,姓名)、(身份证号,性别)等。

候选键
候选键属于超键,它是最小的超键,就是说如果再去掉候选键中的任何一个属性它就不再是超键了。对于(学号、姓名)来说,去掉姓名后仍是一个超键,那么它就不是候选键。其中,学生表中的候选键为:(学号)、(身份证号),主属性就是学号、身份证号。

主键
主键就是候选键里面的一个,用户可以选择,那么在这里我们选择(学号)作为学生表的主键。

键 = 码,英文key。

函数依赖
这里先给出数学描述,再进行通俗解释。

数学描述

通俗理解
函数依赖的英文定义是:
The value of one or a group attributes can decide the value of other
attributes.

很容易理解,也就是一个或者一组属性的值可以决定其他属性的值。候选键都可以做到。

部分依赖
数学描述

通俗理解
部分依赖是什么情况呢?
举个例子,现有一关于学生的关系模式Student(学生编号 , 学生姓名, 班级编号, 院系, 课程编号 , 成绩)
学生编号 学生姓名 班级编号 院系 课程编号 成绩
S01 杨明 D01 思齐 C01 90
S02 李婉 D01 思齐 C01 87
S01 杨明 D01 思齐 C02 92
S03 刘海 D02 述圣 C01 95
S04 安然 D02 述圣 C02 78
S05 乐天 D03 省身 C01 82
(学生编号#、课程编号#)作为主键,可以唯一标识每条元组,但是对于学生姓名、学生所属的班级编号、院系,这三个属性可以直接通过学生编号来确定,在这里课程编号#显得很多余。于是称,学生姓名、班级编号、院系对(学生编号#、课程编号#)部分函数依赖。

即,非主属性对键有部分函数依赖。

主属性:任何一个候选键中的属性称作主属性。
键在这里理解成候选键

传递依赖
数学描述

通俗理解
继续以Student表为例,
学生编号 学生姓名 班级编号 院系 课程编号 成绩
S01 杨明 D01 思齐 C01 90
S02 李婉 D01 思齐 C01 87
S01 杨明 D01 思齐 C02 92
S03 刘海 D02 述圣 C01 95
S04 安然 D02 述圣 C02 78
S05 乐天 D03 省身 C01 82
学生编号可以唯一确定他所在的院系,但是注意到这中间存在传递过程,即学生编号唯一确定该学生所对应的班级编号,班级编号对应唯一的院系。我们称,院系对学生编号传递函数依赖。

即,非主属性对键有部分函数依赖。

主属性:任何一个候选键中的属性称作主属性。

范式
关系数据库中的模式设计要满足一定的规范,引入了范式这一概念。
不管做哪种范式的设计,最终要的思想是“one fact in one place”,也就是“一事一地”。

1NF
定义:关系中每一分量不可再分。即不能以集合、序列等作为属性。(也就是不能表中套表,要保证数据的原子性。)

举例

学生编号 课程编号
S01 {C1,C2,C3}
S02 {C1,C4}
它就不满足1NF,因为{C1,C2,C3}和{C1,C4}是集合。

修改为符合1NF:

学生编号 课程编号
S01 C1
S01 C2
S01 C3
S02 C1
S02 C4
2NF
定义:在1NF基础上,消除非主属性对键的部分依赖,则称它符合2NF。
根据上面对部分依赖的分析,对于Student表:

学生编号 学生姓名 班级编号 院系 课程编号 成绩
S01 杨明 D01 思齐 C01 90
S02 李婉 D01 思齐 C01 87
S01 杨明 D01 思齐 C02 92
S03 刘海 D02 述圣 C01 95
S04 安然 D02 述圣 C02 78
S05 乐天 D03 省身 C01 82
对于学生姓名、学生所属的班级编号、院系,这三个属性可以直接通过学生编号来确定,在这里课程编号#显得很多余。也就是,学生姓名、班级编号、院系对(学生编号#、课程编号#)部分函数依赖。把Student表进行拆分,可以消除部分依赖。

其中,学生表Student如下:

学生编号 学生姓名 班级编号 院系
S01 杨明 D01 思齐
S02 李婉 D01 思齐
S01 杨明 D01 思齐
S03 刘海 D02 述圣
S04 安然 D02 述圣
S05 乐天 D03 省身
学生-课程表如下:

学生编号 课程编号 成绩
S01 C01 90
S02 C01 87
S01 C02 92
S03 C01 95
S04 C02 78
S05 C01 82
符合2NF。

3NF
定义:在2NF基础上,消除非主属性对键的传递依赖,则称它符合3NF。

根据上面对传递依赖的分析,对于Student表,学生编号可以唯一确定他所在的院系,但是注意到这中间存在传递过程,即学生编号唯一确定该学生所对应的班级编号,班级编号对应唯一的院系。我们称,院系对学生编号传递函数依赖。

把Student表继续进行拆分,可以消除传递依赖。

其中,学生表Student如下:

学生编号 学生姓名 班级编号
S01 杨明 D01
S02 李婉 D01
S01 杨明 D01
S03 刘海 D02
S04 安然 D02
S05 乐天 D03
班级-院系表如下:

班级编号 院系
D01 思齐
D02 述圣
D03 省身
符合2NF。

BCNF
我当时在看BCNF的时候,这块是最懵的地方,网上找的例子五花八门……解释和过程感觉没有比较详细的,最后反正得到了一个结果orz。我本来想把这个范式按照类似的定义来写的……但是到BNCF发现不能直接写成“在3NF基础上,消除主属性对键的部分依赖、传递依赖,则称它符合BCNF。”

因为这样不太好解释,故而调整了方案。我认为,理解更重要。

先给个文绉绉的定义

换言之,对于关系模式R,如果每一个函数依赖的决定因素都包含键,则R属于BCNF范式。

现在举例,现有关系模式:通讯(城市名,街道名,邮政编码)

函数依赖关系集为:
F={(城市名,街道名)-> 邮政编码,邮政编码 -> 城市名}
也就是一个城市名和一个街道名,对应一个邮政编码;一个邮政编码对应一个城市名。

此时,候选键(城市名,街道名)非主属性邮政编码完全依赖于候选键,且无传递依赖,属于3NF。

那么它是否属于BCNF呢?我们按照下面的定义来看一下,

换言之,对于关系模式R,如果每一个函数依赖的决定因素都包含键,则R属于BCNF范式。

对于决定因素(城市名,街道名),它包含键(城市名,街道名),其实它本身就是键了,没问题;
对于决定因素邮政编码,它不包含键(城市名,街道名)

所以它不属于BCNF。在关系模式R中,如果每一个决定因素都包含码,则R属于BCNF。
————————————————
版权声明:本文为CSDN博主「hongiii」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wyh7280/article/details/83350722

范式通俗理解:1NF、2NF、3NF和BNCF的更多相关文章

  1. 一看就懂的数据库范式介绍(1NF,2NF,3NF,BC NF,4NF,5NF)

    原文:http://josh-persistence.iteye.com/blog/2200644 一.基本介绍 设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称 ...

  2. 数据库范式1NF 2NF 3NF BCNF(实例)通俗易懂的讲解

    [转] 数据库范式1NF 2NF 3NF BCNF(实例)通俗易懂的讲解     本文对大多数初学数据库原理的同学绝对是个大福利,哈哈,完完整整的看完此篇博文一定能够清晰地理解数据库的四大范式.    ...

  3. 数据库三大范式(1NF,2NF,3NF)及ER图

    数据库三大范式(1NF,2NF,3NF)及ER图 百度官方解释: 设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据 ...

  4. 数据库范式1NF 2NF 3NF详细阐述

    范式:关系数据库中的关系是要满足一定要求的,满足不同程度要求的不同范式.满足最低要求的叫第一范式,简称1NF ,在第一范式中满足进一步要求的为第二范式,其余以此类推.通俗来说是满足数据库关系表中的一套 ...

  5. 数据库范式(1NF/2NF/3NF)

    本文转载自数据库范式(1NF/2NF/3NF) 概述 范式:英文名称是 Normal Form,它是英国人 E.F.Codd(关系数据库的老祖宗)在上个世纪70年代提出关系数据库模型后总结出来的,范式 ...

  6. 1NF | 2NF | 3NF的区分以及什么是函数依赖、部分函数依赖、值传递依赖(最详细的讲解1NF、2NF、3NF的关系)

    1NF | 2NF | 3NF的区分以及什么是函数依赖.部分函数依赖.值传递依赖 符合3NF一定符合2NF.一定符合1IF 简单区分.2NF不存在部分函数依赖,3NF不存在传递函数依赖 第一范式1NF ...

  7. [MySQL] 关系型数据库的设计范式 1NF 2NF 3NF BCNF

    一.缘由: 要做好DBA,就要更好地理解数据库设计范式.数据库范式总结概览: 为了更好地理解数据库的设计范式,这里借用一下知乎刘慰老师的解释,很通俗易懂.非常感谢!   二.具体说明: 首先要明白”范 ...

  8. 数据库范式(1NF 2NF 3NF BCNF)

    http://blog.csdn.net/xuxurui007/article/details/7738330 http://www.cnblogs.com/laodao1/archive/2009/ ...

  9. 【转】数据库范式(1NF 2NF 3NF BCNF)详解一

    以下内容转自:http://jacki6.iteye.com/blog/774866 --------------------------------------------分割线---------- ...

随机推荐

  1. python类型-序列-字符串

    python中单引号和双引号的含义是一样的.字符串是一种直接量或者说是一种标量,是不可变类型,字符串是由独立的字符组成的,并且这些字符可以通过切片操作顺序的访问. python实际有三类字符串:通常意 ...

  2. typescript 第一弹

    typescript官网: http://typescriptlang.org typescript 在线运行环境: http://www.typescriptlang.org/play/index. ...

  3. Mabitis

    Mybatis 一.框架概念: Java框架,一个软件半成品,简单来说就是一个别人搭好的舞台,你来做表演,说白了Java框架就是封装好方便程序员操作的类,使项目的开发更简单,维护起来也更容易. 而My ...

  4. 同一个环境同时使用python2和python3的方法

    1.首先安装好p2和p3,配置好环境变量.在CMD内执行python返回版本号,返回结果根据配置的环境变量而定,如果p2的环境变量配置在前面,则返回p2的版本号,反之则p3 2.然后把各版本目录下的p ...

  5. Hello,world!一切的开始

    普及知识 当我们准备开发Java程序时,我们需要两样基础的工具--JDK与IDE.在这里需要解释一下什么是JDK还有IDE.JDK的全称是Java Development kit,即Java开发工具集 ...

  6. TCP UDP协议的三次握手

    接触网络协议栈TCP/IP的人,就一定绕不开的一个话题就是TCP的三次握手.下面我将简单介绍一下. 三次握手流程的本质,可以这么理解:TCP的三次握手其实是双方各一次握手,各一次确认,只是其中一次握手 ...

  7. CAD制图系列之怎么画平行线

    CAD怎么画平行线 输入O,点空格,输入距离100,选择已知的线,往你要偏移的方向就好! 具体方法如下:1.打开CAD制图 2.输入快捷键O 3.按下空格键 4.输入你所要的距离,例如12,并按下空格 ...

  8. 迭代器中set的使用

    今天对迭代器中的set方法进行了一下简单的使用,由于之前使用过list方法,所以将他与list进行了一下对比. list中加入对象时不会进行查重,也就是只要是一个符合的对象就可以加到list中,而对于 ...

  9. Sqlite命令行基本操作

    SQLite是遵守ACID的关系数据库管理系统,它包含在一个相对小的C程序库中. 与许多其它数据库管理系统不同,SQLite不是一个客户端/服务器结构的数据库引擎,而是被集成在用户程序中. 1.进入命 ...

  10. 浅谈C语言的数据存储(一)

    作者:冯老师,华清远见嵌入式学院讲师. 程序由指令和数据组成,C语言程序亦是如此.开发者在编写程序的时候往往需要根据不同数据的特点以及程序需求来选择不同的数据存储方式,那么在C语言中数据的存储分为哪些 ...