数据库规范化理论详解

关系数据库理论

数据依赖:数据依赖是一个关系内部,属性和属性之间的一种约束关系

常见的数据依赖有函数依赖[1](FD),多值依赖[2](MVD)

对于数据库来说,如果你的关系模型设计的不好,将会存在以下问题:

  1. 数据冗余太大:一个信息被多次存储
  2. 数据更新异常:当一个数据要进行修改时,所有的副本都要进行修改
  3. 插入异常:只有一些必要的信息在数据库中时,你才可以装到数据库里
  4. 删除异常:删除A时,B也会被删除

什么是规范化理论?

规范化理论是用来改造关系模式,通过分解关系模式来消除其中不合适的数据依赖,以解决数据冗余、插入异常、更新异常、删除异常这些问题。

什么是规范化?

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

前置概念

  • 超码:某一个能够唯一标识一条记录的属性或属性集

  • 候选码:某一个属性组的值能够唯一的标识一个元组,而其子集不能,则称该属性组为候选码,候选码是一类特殊的超码,包含候选码的属性组一定是超码

  • 主码:若一个关系中有多个候选码,则选定其中的一个为主码

  • 主属性:候选码属性组中的各个属性称为主属性

  • 非主属性:不包含在候选码中的属性称为非主属性

  • 全码:关系模式的所有属性是这个关系的候选码,则称该属性组为全码

    例子:学生表(学号、姓名、性别、年龄、班级、系)

    1. 学号可以唯一的标识出一个同学的身份,我们可以设置学号为主码。是最简单的候选码。

    2. 当姓名不重复的时候姓名也可以作为唯一标识,也可以用来作为候选码,所以姓名也可以作为候选码

    3. 以此类推,最极端的情况是全表都用来做主码,这时的主码也叫全码。

    4. 所以这里候选码可以是学号,或者姓名(前提是姓名不重复),但是学号+姓名不是候选码,由于它的子集例如学号,姓名能唯一标识一个元组,故不符合定义,它是超码,也就是说候选码中的所有属性都是必须的,缺少了任何一个属性,就不能唯一标识一个元组了,候选码是可以唯一标识一个元组的最少的属性集合而超码是没有最少属性这个要求的。

    5. 由主码的定义可知,主码可以从这两者(学号,或者姓名(前提是姓名不重复))者之间选择一个即可

    6. 主属性为候选码属性组之间的各个属性,例如,候选码:学号,主属性为学号,非主属性为姓名,性别,年龄,班级,系

    7. 注意:主属性不能唯一的标识一个元组,而主码必定能够标识(因为主码必定是候选码),两者是不同的.

第一范式

设 R 为任一给定关系,如果 R 中每个列与行的交点行的取值都是不可再分的基本元素,则 R∈1NF。

意思就是所有属性不可再分,不允许出现表中有表的情况。所有关系模式中的二维表都满足 1NF。

不满足第一范式的数据库模式不能称为关系数据库

栗子:学生信息( 学生ID,学生姓名,所在年级,性别,参加课程,课程ID,课程名称,课程描述,教师ID,教师姓名,教授课程)

不满足1NF,参加课程可以再分

学生表(学生ID,学生姓名,所在年级,性别)

学生课程表(学生ID,课程ID,课程名称,教师ID,教师姓名,课程描述)

1NF 确保属性不可再分,不会出现表中有表的情况

第二范式

若关系模式R∈1NF,并且每一个非主属性都完全函数依赖于任何一个候选码,则R∈2NF

消除部分依赖列,也就是说是否有依赖于一部分主键的列,有就消除

我们需要消除表中部分依赖主键的列,使得非主键字段完全依赖于主键字段。

还用上文中的例子,学生课程表中主键是学生ID和课程ID,但是教师ID,教师名称,课程描述不依赖于学生ID。

所以需要把学生课程表再次拆分

学生表(学生ID,学生姓名,所在年级,性别)

学生课程表(学生ID,课程ID,课程名称)

课程表(课程ID,教师ID,教师名称,课程描述)

这样就好很多

2NF 消除非主属性的部分函数依赖,减少了数据冗余

第三范式

若R∈3NF,则每一个非主属性既不部分依赖于码也不传递依赖于码。

意思是去掉表中不直接依赖于候选码的非主属性,或者说是消除非主属性的传递函数依赖。

在课程表中,教师ID依赖于课程ID,教师名称又依赖于教师ID,有传递依赖

学生表(学生ID,学生姓名,所在年级,性别)

学生课程表(学生ID,课程ID,课程名称)

课程表(课程ID,教师ID,课程描述)

教师表(教师ID,教师名称)

这样就可以了

3NF 清除非主属性的传递函数依赖,解决大多数插入、删除操作异常的问题,数据冗余也有效控制住了。

BC范式

关系模式R<U,F>中,每一个决定因素都包含R的一个码(候选键),则R属于BCNF。

通常认为BCNF是修正的第三范式,有时也称为扩充的第三范式。

举例:假设有 R={A, B, C, D},F={AB→C, AB→D, D→A},不难发现 AB 为 R 的候选键,函数依赖关系中没有非主属性的部分依赖和传递依赖,所以 R 是属于第三范式的。但是不属于 BCNF,由于D→A 的决定因素 D 不包含在 R 的候选码中。

BCNF 确保决定因素必须包含主键,解决了所有插入、删除操作异常的问题。

第四范式

关系模式R<U,F>属于1NF,如果对于R的每个非平凡多值依赖X->->Y(Y不包含于X),X都含有码,则称R<U,F>属于4NF

多值依赖

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

例子:学校某一门课程由多个教授讲授,他们使用同一套参考书。每个教师可以讲授多门课程,每种参考是可以供多门课程使用。可以用一个非规范化的关系来表示教师T、课程C和参考书B之间的关系。

课程C教师T参考书B
物理李勇普通物理学
物理李勇光学原理
物理李勇物理习题集
物理王军普通物理学
物理王军光学原理
物理王军物理习题集
数学李勇数学分析
数学李勇微分方程
数学李勇高等代数
数学张平数学分析
数学张平微分方程
数学张平高等代数

关系模式Teacher(C,T,B)的码是(C,T,B),所以Teacher属于BCNF,但是当某一课程增加一名讲课教师时,必须插入多个元组,类似的情况,如果某一门教材需要删除时,则必须删除多个元组。

  • 在关系模式Teacher中,对于一个(物理,光学原理)有一组T值{李勇,王军},这组值仅仅决定于课程C上的值(物理)。对于另一个(物理,普通物理学),它对应的一组T值仍是{李勇,王军},但是参考书的值已经改变啦,因此T多值依赖于C。

  • 同样在关系模式Teacher中,对于一个(数学,李勇)有一组B值{数学分析,微分方程,高等代数},这组值仅仅决定于课程C上的值(数学)。对于另一个(数学,王军),它对应的一组B值仍是{数学分析,微分方程,高等代数},但是教师T值已经改变啦,因此B多值依赖于C。

例子:关系模式WSC(W,S,C)中,W表示仓库,S表示保管员,C表示商品。假设每个仓库由若干个保管员,有若干个商品。每个保管员保管所在仓库的所有商品,每种商品被所有保管员保管。

WSC
W1S1C1
W1S1C2
W1S1C3
W1S2C1
W1S2C2
W2S2C3
W2S3C4
W2S4C5
W2S4C4

在关系模式WSC中,W->->C,W->->S,它们都是非平凡的多值依赖。然而W不是码,关系模式WSC的码是(W,S,C),所以关系模式WSC不属于4NF。

一个关系模式达到了BCNF但不是4NF ,仍然具有不好的性质,以WSC为例,WSC不属于4NF,但是WSC属于BCNF。在某一时刻时,某一仓库W1有n个保管员,存放m件物品,则关系中 分量W1的元组数目一定有mxn个。每个保管员重复存储m次,每种物品重复存储n次,数据的冗余度太大。采用投影分解法,消去非平凡且非函数依赖的多值依赖。

WS(W,S)
WC(W,C)

分解算法

对所有函数依赖,先将函数依赖集化成最小函数依赖集,只要左边相同,就把他们合并起来,形成的集合作为符合3NF的一个属性集。

例子:
A->B,AB->C,D->AC,D->E

最小函数依赖集:
第一步:先把右边有多个的拆成右边只有一个的
A->B,AB->C,D->A,D->C,D->E
第二步:去除左边的冗余项
因为A->B,AB->C冗余了,所以有B->C
结果为:A->B,B->C,D->A,D->C,D->E
第三步:去除传递函数依赖
D->A->B->C,去除D->C
最终结果为:
A->B,B->C,D->A,D->E


开始3NF的分解
第一步:
找候选码
L:D   R:C,E
N:     LR:A,B
对D求闭包,最终能够包含全部元素集合,因此D是该元素集合的唯一候选码
第二步:于是遵循左部相同合并原则,对其进行合并,形成属性集
R1={A,B}
R2={D,A,E}
R2={B,C}
第三步:查看上述集合有没有包含关系,如果有就吸收合并
显然上面没有
第四步:看分的属性组中有没有包含码,如果有就是无损且保持函数依赖的3NF,没有包含就不是无损且保持函数依赖的3NF,就添加一个属性组,把原来关系的码加进去
最终得到结果为:
R1={A,B}
R2={D,A,E}
R2={B,C}
这三个关系集上的函数依赖均满足3NF的要求

投影算法

假设有关系R(A,B,C,D,E)和FD集{AB->DE,C->E,D->C,E->A},假设要把这些FD投影到S(A,B,C),求出在S上成立的FD集合

第一步:将原来的FD转换成右边只有一个的情况
AB->D,AB->E,C->E,D->C,E->A
第二步:通过直接观察,或传递依赖,找到S(A,B,C)上的函数依赖
AB->D->C 即AB->C
C->E->A 即C->A
所以在S上成立的FD集合为{AB->C,C->A}

参考

1:http://t.csdn.cn/oUbjw

2:http://t.csdn.cn/ZZ54C

3:http://t.csdn.cn/94WpG

4:https://zhuanlan.zhihu.com/p/20028672

5:http://t.csdn.cn/4UFPS

6:http://t.csdn.cn/saSIW

7:http://t.csdn.cn/V43Ay

8:http://t.csdn.cn/ad2QG

  • 5
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值