范式与规范化是数据库考试必考的内容,相关内容在课本的第6章关系数据理论。本文试图以最通俗易懂的语言整理这一部分的笔记,麻烦看官老爷点赞关注支持一下动力猿吧!
首先要知道,函数依赖是数据依赖的一种。
数据依赖是一个关系内部属性与属性之间的约束关系,这种约束关系是通过属性间值的相等与否体现出来的数据间相关联系。数据依赖是现实世界属性间相互联系的抽象。数据依赖是多种多样的,教材中只讲了最重要的两个:函数依赖(Functional Dependency,FD)和多值依赖(Multi- Valued Dependency, MVD)。
函数依赖其实很容易理解,它极为普遍地存在于现实生活中。比如描述一个学生关系,可以有学号(Sno)、姓名 (Sname)、系名(Sdept)等几个属性。由于一个学号只对应一个学生,一个学生只在一个系学习。因而当“学号”值确定之后,学生的姓名及所在系的值也就被唯一地确定了。属性间的这种依赖关系类似于数学中的函数y=f(x),自变量x确定之后,相应的函数值y也就唯一地确定了。
函数依赖的定义如下:
例如 Sname= f(Sno),Sdept=f(Sno),即Sno函数决定 Sname,Sno函数决定Sdept,就说 Sname和 Sdept函数依赖于Sno,记作Sno→Sname, Sno→Sdep。
(1)平凡的函数依赖:X→Y,但Y ⊆ \subseteq ⊆ X。对于任关系模式,平凡函数依赖都必然成立(X属性肯定能确定X属性自身啊),因此是废话。所以我们只讨论非平凡的函数依赖。
(2)非平凡的函数依赖:X→Y,但Y ⊈ \nsubseteq ⊈ X。X称为这个函数依赖的决定属性组,也称为决定因素。
(3)完全函数依赖: 在R(U)中,如果X→Y,并且对于X的任何一个
真子集X’,X’→Y都不成立,则称Y对X完全函数依赖,记作X → F \overset{F}{\rightarrow} →FY。
(4)部分函数依赖:若X→Y,但Y不完全函数依赖于X,则称Y对X部分函数依赖(partial functionaldependency),记作X → P \overset{P}{\rightarrow} →PY。
(5)传递依赖:在R(U)中,如果X→Y(Y ⊈ \nsubseteq ⊈ X),但Y→X不成立,Y→Z(Y ⊈ \nsubseteq ⊈ X),但Z→Y不成立,则称Z对X传递函数依赖,记作X → 传递 \overset{传递}{\rightarrow} →传递Z。
上面关系模式的函数依赖就是冗余的,我们看冗余的函数依赖会产生什么问题:
但这些问题并非无法解决,如果我们可以把这个单一的模式分解成三个关系模式:
S(Sno,Sdept,Sno→Sdept);
SC(Sno,Cno,Grade,(Sno,Cno)→Grade);
DEPT(Sdept,Mname,Sdept→Mname);
这三个模式都不会发生插入删除更新异常,数据的冗余能得到很好的控制。
由上面可知,冗余的函数依赖必须进行处理,也就是分解不好的关系模式,这实际上就是对关系模式进行规范化。
规范化:为了控制由于冗余带来的问题而要求将一个低一级范式的关系模式通过模式分解转化为若干个高一级范式的关系模式的集合,这一过程称之为规范化(Normalization)。
范式顾名思义比较规范,是数据库中满足一定要求的关系。满足最低要求的叫第一范式简称1NF,随着数字的增高要求逐渐变严格。
考试题绝大部分只考到BCNF,多值依赖和4NF考到的可能性微乎其微,但这里还是简单总结一下。
通过上面的分析,一个模式中的关系模式如果都属于BCNF, 那么在函数依赖的范畴内, 它已实现了彻底的分离, 已消除了插入和删除异常。
尽管如此,一个属于BCNF的关系模式仍有可能存在一些问题,比如下面的关系模式,虽然属于BCNF,但数据的冗余十分明显,对数据的增删也很不方便(增删一名教师或者参考书)。
仔细观察发现,每个课程名都确定一组教师名或者参考书名。
我们把这类情况概括为一种新的数据依赖,称之为多值依赖。
规范化目的: 消除插入、删除异常,修改复杂和数据冗余等问题
规范化实质:概念单一化。即若多余一个概念就把它“分离”出去,最终使一个关系描述一个概念、一个实体或者实体间的一种联系。
规范化过程:通过对关系模式分解来实现。
还未在真题中出现过,有待之后整理。