个人笔记:数据库——范式

本文仅供参考学习使用,谢谢

函数依赖部分

文章目录

  • 范式
  • 第一范式(不可以表中表)
  • 第二范式(通过投影分解 简单的将部分函数依赖化为完全函数依赖)
    • 产生的前提环境,第一范式带来的问题
    • 第二范式定义
    • 不满足第二范式会产生的问题
  • 第三范式(更彻底的通过投影分解的方法消除数据冗余和异常)
    • 产生的前提环境,第二范式带来的问题
    • 第三范式定义
  • BC范式(消除主属性对码的部分和传递函数依赖)
    • 问题分析
    • BC范式定义
  • 小结
    • 例子

范式

  • 范式是符合某一种级别的关系模式的集合。
  • 关系数据库中的关系必须满足一定的要求。
    满足不同程度要求的为不同范式。
  • 范式的种类:

第一范式(1NF)
第二范式(2NF)
第三范式(3NF)
BC范式(BCNF,Boyce和Codd共同提出的范式)
第四范式(4NF)
第五范式(5NF)

  • 各种范式之间存在联系:
    1NF ⊃ 2NF ⊃ 3NF ⊃ BCNF ⊃ 4NF ⊃ 5NF
    某一关系模式R为第n范式,可简记为R∈nNF

一个低一级范式的关系模式,通过模式分解 (schema decomposition)可以转换为若干个 高一级范式的关系模式的集合,这种过程就叫 规范化(normalization)

第一范式(不可以表中表)

定义:
如果一个关系模式R的所有属性都是不可分的基本数据项,则R∈1NF。

PS:第一范式是对关系模式的最起码的要求。不满足第一范式的数据库模式 不能称为关系数据模式。

第二范式(通过投影分解 简单的将部分函数依赖化为完全函数依赖)

产生的前提环境,第一范式带来的问题

个人笔记:数据库——范式_第1张图片

第二范式定义

定义:

若关系模式R∈1NF,并且每一个非主属性都 完 全 函 数 依 赖 于 ‾ \underline{完全函数依赖于} 完全函数依赖于R的 码(候选键),则R∈2NF

说白了就是非主属性完全函数依赖于候选键,需要将部分函数依赖的非主属性通过投影分解消除

S-L-C( S n o , C n o , ‾ \underline{Sno, Cno,} Sno,Cno, Sdept, Sloc, Grade) ∈ \in 1NF
S-L-C( S n o , C n o , ‾ \underline{Sno, Cno,} Sno,Cno, Sdept, Sloc, Grade) ∉ \notin / 2NF

非主属性 Sdept 和 Sloc 部分函数依赖于码(Sno, Cno)。

不满足第二范式会产生的问题

一个关系模式R不属于2NF,就会产生问题
例如S-L-C存在的问题:

  1. 插入异常
//假设Sno=2014102,Sdept=IS,Sloc=N的学生还未选课,因课程号是主属性,因此该学生的信息无法插入SLC。

Sno			Sdept		Sloc		Cno		Grade
2014101		IS			N			3		89
2014101		IS			N			2		97
2014101		IS			N			5		88
2014103		IS			N			1		86
2014103		IS			N			3		92
2014104		IS			N			3		79
2014102		IS			N			null	null
  1. 删除异常
//假定2014104学生只选修了3号课程这一门课。现在因身体不适,他连3号课程也不选修了。因课程号是主属性,此操作将导致该整个元组的删 除。这样,2014104学生信息都被删除了。

Sno			Sdept		Sloc		Cno		Grade
2014101		IS			N			3		89
2014101		IS			N			2		97
2014101		IS			N			5		88
2014103		IS			N			1		86
2014103		IS			N			3		92

2014104		IS			N			3		79 
//如果要删除2014104选修的三号课程的记录将会导致该学生信息全被删除
  1. 数据冗余度大
//如果一个学生选修了8门课程,那么他的Sdept和Sloc值就要重复存储了8次。
Sno			Sdept		Sloc		Cno		Grade
2014101		PISH		NS			3		89
2014101		PISH		NS			2		97
2014101		PISH		NS			5		88
2014103		IS			N			1		86
2014103		IS			N			3		92
2014104		IS			N			3		79
2014101		PISH		NS			1		72
2014101		PISH		NS			4		65
2014101		PISH		NS			6		99
2014101		PISH		NS			7		83
2014101		PISH		NS			8		75
  1. 修改复杂
例如学生转系,在修改此学生元组的Sdept值的同时,还可能需要修改住处(Sloc)。如果这个学生选修了K门课,则必须无遗漏地修改K个元组中全部Sdept、Sloc信息。

原因分析: SLC(Sno, Sdept, Sloc, Cno, Grade) 中
Sdept、 Sloc部分函数依赖于码。SLC的码为(Sno, Cno)

解决方法:
实际上就是将部分函数依赖通过分解关系的方式化为完全函数依赖
采用投影分解法,把S-L-C分解为两个关系模式,消除这些部分函数依赖

即为将SLC关系分解为:
SC(Sno, Cno, Grade)
S-L(Sno, Sdept, Sloc)

  1. 关系模式SC的码为(Sno, Cno),关系模式S-L的码为Sno
  2. 非主属性对码都是完全函数依赖了。他们都是2NF。
  3. 从而使上述四个问题在一定程度上得到了一定的解决。

第三范式(更彻底的通过投影分解的方法消除数据冗余和异常)

产生的前提环境,第二范式带来的问题

2NF还有什么问题?

  • 采用投影分解法,把S-L-C分解为两个关系模式:SC和S-L,消除了S-L-C中非主属性对码的部分函数依赖。
  • 一般地,如果把1NF关系模式 通过投影分解方法,消除非主属性对码的部分函数依赖,分解为多个2NF的关系模式。
  • 可以在一定程度上减轻 原1NF关系模式中存在的插入异常、删除异常、数据冗余度大、修改复杂等问题。
  • 但是还不能完全消除关系模式中的各种异常情况和数据冗余

问题分析:

  • 2NF关系模式 S-L(Sno, Sdept, Sloc)中存在的问题 :

Sloc传递函数依赖于Sno,即S-L中存在非主属性传递对码的传递函数依赖
Sno → (传递) Sloc 。

S-L关系存在的问题:

  1. 插入异常

如果某个系因种种原因(例如刚刚成立),目前暂时没有 在校学生,我们就无法把这个系的信息,如 MA, S 存入数据库。

Sno			Sdept	Sloc
2014101		IS		N
2014102		IS		N
2014103		IS		N
2014104		IS		N
null		MA		S	//该条无法插入
  1. 删除异常

如果某个系(如IS)的学生全部毕业了,我们在删除该系学生信息的 同时,把这个系的信息,如IS, N,也丢掉了。

Sno		Sdept	Sloc
2014101	IS		N //前四条记录会被直接删除
2014102	IS		N
2014103	IS		N
2014104	IS		N
2014105	PH		S
2014106	PH		S

  1. 数据冗余度大

每一个系的学生都住在同一个地方,关于系的住处的信息却重复出现,重复次数与该系学生人数相同。

Sno			Sdept		Sloc
2014101		IS			N
2014102		IS			N	//重复
2014103		IS			N	//重复
2014104		IS			N	//重复
2014105		PH			S
2014106		PH			S	//重复
2014107		PH			S	//重复
2014108		PH			S	//重复

  1. 修改复杂
    学校调整学生住处时,由于关于每个系的住处信息是重复存储的, 修改时必须同时更新该系所有学生的Sloc属性值。
Sno			Sdept		Sloc
2014101		IS			N	
2014102		IS			N	//修改为S时重复
2014103		IS			N	//修改为S时重复
2014104		IS			N	//修改为S时重复
2014105		PH			S
2014106		PH			S	
2014107		PH			S	
2014108		PH			S	

原因分析:
S-L中Sloc传递函数依赖于Sno
即:非主属性 传递函数依赖 码

解决方法:
采用投影分解法,把S-L分解为两个关系模式,以消除传递函数依赖:
S-D( Sno, Sdept )
D-L( Sdept, Sloc )
S-D的码为Sno,D-L的码为Sdept

在分解后的关系模式中既没有非主属性对码的部分函数依赖, 也没有非主属性对码的传递函数依赖,进一步解决了上述四个问题。

第三范式定义

定义:
关系模式R∈1NF, 若R中不存在这样的码X、属性组Y及非主属性Z (Z ⊄ \not\subset Y) ,使得X→Y,Y→Z,Y↛X,成立,则称R ∈ 3NF

实际上就是在第二范式(消除部分函数依赖的基础上)消除传递函数依赖
要求满足非主属性 不 传递函数依赖于候选键

S-D(Sno, Sdept) ∈ \in 3NF
D-L(Sdept,Sloc) ∈ \in 3NF

S-L 不存在部分函数依赖,但是存在传递函数,所以

S-L(Sno, Sdept, Sloc) ∈ \in 2NF
S-L(Sno, Sdept, Sloc) ∉ \notin / 3NF

3NF的一些性质:

  • 若R∈3NF,则R的每一个非主属性既不部分函数依赖于候选码也不
    传递函数依赖于候选码。
  • 如果R∈3NF,则 R∈2NF。
  • 采用投影分解法将一个2NF的关系分解为多个3NF的关系,可以在一定程度上解决原2NF关系中存在的插入异常、删除异常、数据冗余 度大、修改复杂等问题。
  • 将一个2NF关系分解为多个3NF的关系后,并不能完全消除关系模式 中的各种异常情况和数据冗余。

BC范式(消除主属性对码的部分和传递函数依赖)

问题分析

关系模式STJ(S,T,J)中,S表示学生,T表示教师,J表示课程
语义:
假设每一教师只教一门课 T→J
每门课由若干教师教,但某一学生选定某门课,就确定了一个固定的教师 (S,J)→T
某个学生选修某个教师的课就确定了所选课的名称 (S,T)→J

T→J ,(S,J)→T, (S,T)→J

  1. 候选码:(S,J)和(S,T)
  2. S T J 都是主属性
  3. 不存在非主属性对码的部分函数依赖和传递依赖
  4. STJ∈3NF

虽然STJ(S,T,J)∈3NF,但它仍存在增删改等异常,还不是一个理想的关系模式。

  1. 插入异常:
    如果某个教师开设了某门课程,但尚未有学生选修,则有关信息也无法存入数据 库中。
  2. 删除异常:
    如果选修过某门课程的学生全部毕业了,在删除这些学生元组的同时,相应教师 开设该门课程的信息也同时丢掉了。
  3. 数据冗余度大:
    虽然一个教师只教一门课,但每个选修该教师该门课程的学生元组都要记录这一 信息。
  4. 修改复杂:
    某个教师开设的某门课程改名后,所有选修了该教师该门课程的学生元组都要进 行相应修改。

原因:
主属性J部分依赖于码(S, T)。因为T→J

解决方法:
采用投影分解法,将STJ分解为二个关系模式:SJ(S,J);TJ(T,J)

在分解后的关系模式中没有任何属性对码的部分函数依赖和传递函数依赖。它解决了上述四个问题:
(1) TJ关系中可以存储所开课程尚未有学生选修的教师信息。
(2) 选修过某门课程的学生全部毕业了,只是删除SJ关系中的相应元组,不会影响TJ关系中相应教师开设该门课程的信息。
(3) 关于每个教师开设课程的信息只在TJ关系中存储一次。
(4) 某个教师开设的某门课程改名后,只需修改TJ关系中的一个相应元组即可。

BC范式定义

BCNF(Boyce Codd Normal Form)是由Boyce和Codd提出的,比3NF更进了一步。通常认为BCNF是修正的第三范式,有时也称为扩展的第三范式。

BCNF的定义:
设关系模式R∈1NF,如果对于R的每个函数依赖X→Y,且X ⊇ Y 时,X必含有码,那么R∈BCNF。
即,在关系模式R中,如果每一个决定因素都包含码,则R∈BCNF。

STJ(S,T,J)3NF 	//T→J ,(S,J)→T, (S,T)→J 
SJ(S,J)∈ BCNF		//SJ的码为(S,J), all-key
TJ(T,J)∈ BCNF      //TJ的码为T, T→J


BCNF的关系模式所具有的性质
1.所有非主属性对每一个码都是完全函数依赖。
2.所有主属性对每一个不包含它的码也是完全函数依赖。
3.没有任何属性完全函数依赖于非码的任何一组属性。

  • 如果关系模式R∈BCNF,必定有R∈3NF(证明略)
  • 如果关系模式R∈3NF,不一定有 R∈BCNF(举一个例子说明)
  • 如果一个关系数据库中的所有关系模式都属于BCNF,那么在函数依赖范畴内,它已实现了模式的彻底分解,达到了最高的规范化程度,消除了操作异常诸多问题。

小结

  • 一个关系模式只要其分量都是不可分的数据项,它就是规范化的关系 模式,但这只是最基本的规范化。
  • 规范化程度过低的关系模式不一定能够很好地描述现实世界,可能会 存在插入异常、删除异常、修改复杂、数据冗余等问题,解决方法就 是对其进行规范化,转换成高级范式。
  • 一个低一级范式的关系模式,通过模式分解可以转换为若干个高一级 范式的关系模式集合,这种过程就叫关系模式的规范化。
  • 关系数据库的规范化理论是数据库逻辑设计的工具。

关系模式规范化的基本步骤:

消除决定因素 非码 的 非平凡函数依赖

1NF
↓ 消除非主属性对码的部分函数依赖
2NF
↓ 消除非主属性对码的传递函数依赖
3NF
↓ 消除主属性对码的部分和传递函数依赖
BCNF
↓ 消除非平凡且非函数依赖的多值依赖
4NF
↓ 消除非候选码所蕴含的连接依赖
5NF
HOW:
原则上要

  1. 保持所有的函数依赖关系
  2. 要保证可以无损链接

所以在下面例子中 将传递函数依赖 A→D (A→C , A→D) 化为两个关系 (A,C) (C,D)
个人笔记:数据库——范式_第2张图片

规范化的基本思想:

  • 逐步消除数据依赖中不合适的部分,使模式中的各关系模式
    达到某种程度的“分离”
  • 采用“一事一地”的模式设计原则
    • 让一个关系描述一个概念、一个实体或者实体间的一种联系。
    • 若多于一个概念就把它“分离”出去。
  • 规范化实质上是概念的单一化

你可能感兴趣的:(DataBase)