数据库三范式

范式(Paradigm)是符合某一种级别的关系模式的集合。关系数据库中的关系必须满足一定的要求,满足不同程度要求的为不同范式。 目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、Boyce-Codd范式(BCNF)、第四范式(4NF)和第五范式(5NF)。 满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多要求的称为第二范式(2NF),其余范式以次类推。一般说来,数据库只需满足第三范式(3NF)就行了。 在解释数据库三大范式之前,先介绍一些概念,理解这些概念是必须的。 --- ## 1、函数依赖:关系理论中函数依赖是指关系中属性间的对应关系 (如:关系中对于属性(组)X的每一个值,属性(组)Y只有唯一的值与之对应,则称Y**函数依赖于**X,或称X函数决定Y。记作X $\rightarrow$ Y。其中X称为决定因素。) 举个**属性 X $\rightarrow$ Y** 的具体例子: $$系表$$ | 系代码 | 系名 | 系地址 | 系电话 | 系专业设置 | | :----: | :----: | :----: | :----: | :----: | | 001 | 外国语学院 | 一教 | 8888 | 商务英语 | | 002 | 经济学院 | 二教 | 7777 | 财务管理 | 函数依赖:(每个系代码的值是唯一的) 系代码$\rightarrow$系名,系代码$\rightarrow$系地址,系代码$\rightarrow$系电话,系代码$\rightarrow$系专业设置 如果系名值是唯一的,即各系名不相同,那么还存在函数依赖: 系名系代码,系名$\rightarrow$系地址,系名$\rightarrow$系电话,系名$\rightarrow$系专业设置。 举个**属性组 X$\rightarrow$Y** 的具体例子: $$成绩表$$ | 学号 | 课程号 | 分数 | | :----: | :----: | :----: | | S1 | C1 | 88 | | S2 | C2 | 68 | 只要学号和课程号两个同时都确定了,就能确定分数。因此,{学号,课程号}$\rightarrow$分数。 ---- 介绍完函数依赖的概念,接下来把函数依赖再细分一下。 ### 1.1 部分函数依赖 如上表“系”中,系代码$\rightarrow$系电话,但从另一个角度来讲,{系代码,系名}$\rightarrow$系电话也是毋庸置疑的。因为{系代码,系名}存在真子集“系代码”,而且系代码$\rightarrow$系电话,所以系电话**部分函数依赖**于{系代码,系名}。 ### 1.2 完全函数依赖。 如果X$\rightarrow$Y且对于X的任何真子集X'都有X'$\nrightarrow$ Y(不存在函数依赖),则称Y完全函数依赖于X。 ### 1.3 传递函数依赖 如果X,Y为关系R中属性,有X$\rightarrow$Y,Y$\nrightarrow$X,但Y$\rightarrow$Z,则称Z传递函数依赖于X。 | 专业编号 | 所属系编号 | 系地址 | 系电话 | | :----: |:----: | :----: | :----: | | ---- | ---- | ---- | ---- | 专业编号决定了所属系编号,所属系编号不决定专业编号,所属系编号决定了系电话。 即**系电话传递函数依赖于专业编号** --- ## 2、候选关键字和主属性 **2.1 候选关键字**:在关系R中属性(组)Y完全函数依赖于属性(组)X,则称X为关系R中的一个候选关键字。 **2.2 主属性**:在一个关系中,如果一个属性是构成某一个候选关键字的属性集中的一个属性,则称它为主属性。 - 就比如"成绩表"中,学号是**候选关键字{学号,课程号}**的其中一个主属性。 --- ## 3、组项,向量和重复组 ![关系模型不允许存在的表](https://upload-images.jianshu.io/upload_images/20891914-593dad25fbc9abe3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) **3.1 组项**:如上表( "关系模型不允许存在的表"),成绩就是组项,它是由单科成绩和总分组成的。 **3.2 向量**:单科成绩就是向量,它是由语文成绩,英语成绩,数学成绩组成的。咦咦咦咦咦!!!作者你是不是建这么多表建糊涂了,这两个不是一样的咩!莫急莫急,且听我细细道来。你看,单科成绩由语文,英语,数学成绩组成,这后者三个是属于同一级别的,而成绩分为单科成绩和总分,单科成绩和总分不是同一级别的。但是向量是组项的一种,是特殊的组项。 ![关系模型不允许存在的另一个表](https://upload-images.jianshu.io/upload_images/20891914-4a8f32a99e1e4a35.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) **3.3 重复组**:如上表("关系模型不允许存在的另一个表"),有的行又可以分为多行,这称为重复组。 ---- ## 4、三大范式 ### 4.1 第一范式(<font color=#008000>行列不可分</font>): **任给关系R,如果R中每个列与行对应单元格的数据都是不可再分的基本元素,则R达到第一范式,简称1NF** (也就是说,不存在组项、向量和重复组,你说向量属于组项,那好吧,那就是说**关系R中不存在组项和重复组**) 把“关系模型不允许存在的表”改为下表就符合第一范式了。 | 姓名 | 语文成绩 | 英语成绩 | 数学成绩 | 总分 | | :----: | :----: | :----: | :----: | :----: | | 小明 | 70 | 80 | 90 | 240 | 注意,敲黑板!! | 姓名 | 性别 | 班级 | | :----: | :----: | :----: | | 小明 | 男 | ~~***二年级一班***~~ | 二年级一班是可分的组项。 ### 4.2 第二范式(<font color=#008000>主键完全依赖</font>): **如果一个关系达到第一范式,且不存在任何非主属性对候选关键字的部分函数依赖,则称关系达到第二范式,2NF** 如: | 本人身份证号 | 关系人身份证号 | 关系人职务 | 与本人关系 | | ---- | ---- | ---- | ---- | | 大头儿子 | 小头爸爸 | 经理 | 父亲 | 如上表,{本人身份证号,关系人身份证号}$\rightarrow$关系人职务,{本人身份证号,关系人身份证号}$\rightarrow$与本人关系,对于“与本人关系”来说,“与本人关系”完全函数依赖于{本人身份证号,关系人身份证号},但是,对于“关系人职务”,关系人身份证号$\rightarrow$关系人职务,“关系人职务”部分依赖于{本人身份证号,关系人身份证号},存在“非主属性对候选关键字的部分函数依赖”,不符合第二范式。 应改为: $$社会关系表$$ | 本人身份证号 | 关系人身份证号 | 与本人关系 | | :----: | :----: | :----: | | ---- | ---- | ---- | $$关系人职务表$$ | 关系人身份证号 | 关系人职务 | | :----: | :----: | | ---- | ---- | ### 4.3 第三范式(<font color=#008000>无传递依赖</font>): **如果一个关系达到第二范式且不存在非主属性对候选关键字的传递函数依赖,则称为达到第三范式,简称3NF** 将介绍传递函数依赖时的那个表改为: | 专业编号 | 所属系编号 | | :----: | :----: | | ---- | ---- | | 系编号 | 系地址 | 系电话 | | :----: | :----: | :----: | | ---- | ---- | ---- | --- ## 5、第二范式和第三范式区别 **第二范式是指:全部的非主键列依赖于全部主键** ![955092202009010926338511897302181.png](https://cos.easydoc.net/17082933/files/kgahxd93.png) **第三范式是指:非主键列必须直接依赖于主键,不能存在传递依赖** ![955092202009010926456971510000657.png](https://cos.easydoc.net/17082933/files/kgahxs2g.png) --- 转载: [https://blog.csdn.net/Cat_likeFishs/article/details/79440698](https://blog.csdn.net/Cat_likeFishs/article/details/79440698) [第一范式、第二范式、第三范式](https://www.cnblogs.com/guanghe/p/10784270.html)