范式存在的意义

避免以下情况

  • 数据冗余
  • 各种插入(INSERT),更新(UPDATE),删除(DELETE)异常

一范式(1NF)

一范式的满足条件很简单,需要满足每列元素的不可再分性,即一列下面有多组数据的情况。

二范式(2NF)

二范式需要在一范式的基础上改进,需要满足非主属性必须完全依赖于主键,不然就另起一张表来实现。

  • 举例
    存在如下数据库 选课(学号课号,学分,成绩,姓名)
    该数据库乍一看没什么问题,但是现在课号和学号共同做主键,存在如下函数依赖关系
    (学号,课号)–>成绩,学号–>姓名,课号–>学分

这就出现了以下这些问题

  • 数据冗余
    同一门课程由n个学生选修,"学分"就重复n-1次;同一个学生选修了m门课程,姓名和年龄就重复了m-1次。
  • 更新异常
    若调整了某门课程的学分,数据表中所有行的"学分"值都要更新,否则会出现同一门课程学分不同的情况。
  • 删除异常
    假设一批学生已经完成课程的选修,这些选修记录就应该从数据库表中删除。但是,与此同时,课程名称和学分信息也被删除了。很显然,这也会导致插入异常。
  • 插入异常
    假设要开设一门新的课程,暂时还没有人选修。这样,由于还没有"学号"关键字,课程名称和学分也无法记录入数据库。

解决方法当然是增加两张表。

  • 选课(学号,课号,成绩)
  • 学生(学号,姓名)
  • 课程(课号,学分)

3NF

三范式又需要在二范式的基础上改进,即属性不依赖于其它非主属性,不然就另起一张表实现。

  • 举例
    存在以下表 学号,姓名,学院,学院辅导员,学院地址)
    存在以下函数依赖关系
    学号->姓名,学号->学院,学院->辅导员,学院->学院地址

这就导致了相关问题的出现

  • 数据冗余
    对于同一学院,有多少学生表中就出现了多少次辅导员和地址,其实是一样的数据。
  • 更新异常
    修改某一学院的地址,必须修改所有行地址,否则会出现更新异常。
  • 删除异常
    如果删除一批学生,学院也会被删除,此时如果查找该学院,就会发现学院已经没有了。
  • 插入异常
    如果要新增学院,因为该学院还没有学生,自然没有主键,因此无法实现。

改进方法:创建学院表

  • 学院(学院编号,学院名称,学院辅导员,学院地址)
  • 学生(学号,姓名,学院编号)

判断是否满足3NF

对于每个函数依赖关系 X->A 都有

  • X是key
  • A是key的一部分

3NF的分解算法

  • 【例】关系模型R<U,F>,U={A,B,C,D,E},F={A→BC,ABD→CE,E→D}
    • 首先计算出F的最小依赖集,得到F’={A→BC,AD→E,E→D}。
    • 观察U中是否有属性不在F’中的出现,如果有,则这几个属性组成一对关系R,并在原来的U中删除这些属性。而例子中U中的属性都出现在F中,则可以跳过这一步。
    • 对F’中的函数依赖,把左边的相同分为一组,一组中出现的所有属性为一个关系。如F={A→B,A→C,……},左边都为A的分为一组,出项的所有属性组为一个关系R{A,B,C,……}。例题中左边都不相同,所以一个函数依赖组为一个关系得到转化为3NF的保持依赖分解R1{A,B,C},R2{A,D,E},R3{E,D}。

保持无损分解的算法

  • 先将R转化3NF的保持函数依赖的分解,由算法一得出R1{A,B,C},R2{A,D,E},R3{E,D}。
  • 求出F的key,得到key为AD,AE
  • 将候选码单独组成关系得R4{A,D}和R5{A,E},然后与保持函数依赖后的分解取并集。得R1{A,B,C},R2{A,D,E},R3{E,D},R4{A,D},R5{A,E}。
  • 观察新组成的分解模式中,是否存在包含关系,有则去掉被包含的。如R3{E,D},R4{A,D},R5{A,E}都包含于R2{A,D,E},则删去,最终得到转化3NF的既有无损连接性又保持函数依赖的分解R1{A,B,C},R2{A,D,E}。

BCNF

判断是否满足BCNF

如果关系模式R∈1NF,且所有的函数依赖X->Y,决定因素X都包含了R的一个候选键,则称R属于BC范式。

BCNF的分解

  • 把满足BCNF的函数依赖划为一个表
  • 把不满足BCNF的函数依赖化为另一个表
  • 继续分解不满足BCNF的函数依赖的表

4NF

第四范式(4NF)满足BCNF,要求主关键字信息和非主关键字信息不能有一对多关系。

  • 举例
    存在以下表 学生(学号,姓名,电话号码)
    出现以下数据
学号 姓名 电话号
2212043 小白 18835008888
2212307 小然 15205205205
2212043 小白 18835007777

很明显上面的数据表中出现了冗余 ,而且也会有相应的异常,那么如何解决呢,

当然是只要存在一对多关系就另外开创表啦

  • (学生,姓名)
  • (学生,电话号)

多值函数依赖

设R(U)是属性集U上的一个关系模式。X,Y,Z是U的子集,并且Z=U-X-Y。关系模式R(U)中多值依赖X→→Y成立,当且仅当对R(U)的任一关系r,给定的一对(x,z)值有一组Y的值,这组值仅仅决定于x值而与z值无关。

  • tips 多值函数依赖不会单独出现 ,X->->Y,X->->Z