一、数据库范式的目标及弊端
1、目标
(1)消除插入异常(Insert Anomaly)
插入异常:由于没有某些属性信息,而该属性又不能为 null,导致无法插入。
(2)消除删除异常(Delete Anomaly)
删除异常:只想删除一条信息却连带的删除了其他信息。
(3)消除更新异常(Update Anomaly)
更新异常:更新一条记录却连带的需要更新其他多条记录。
(4)减少数据冗余(Redundancy)
避免同一信息在表中存储多次。
以上三个异常都是由于数据冗余造成的。
2、弊端
应用的范式等级越高,则表越多。
查询时要连接多个表,增加了查询的复杂度。
查询时需要连接多个表,降低了数据库查询性能。
而现在的情况,磁盘空间成本基本可以忽略不计,所以数据冗余所造成的问题也并不是应用数据库范式的理由。
(1)反规范化
①、增加冗余列或派生列。
②、表的合并和分割。
二、函数依赖
函数依赖是属性间的约束关系。
一张表中,在属性(或属性组)X 的值确定的情况下,必定能确定属性 Y 的值,那么就可以说 Y 函数依赖于 X,写作 X → Y。
(1)平凡函数依赖和非平凡函数依赖
①、平凡函数依赖
X → Y 且 Y 属于 X。
②、平凡函数依赖
X → Y 且 Y 不属于 X。
(2)完全函数依赖和部分函数依赖
①、完全函数依赖
X、Y 是表的属性或属性组,若 X → Y,且对于 X 的任何一个真子集(假如属性组 X 包含超过一个属性的话),X → Y 不成立,那么我们称 Y 完全函数依赖于 X 。
②、部分函数依赖
X、Y 是表的属性或属性组,若 X → Y,且存在 X 的一个真子集(假如属性组 X 包含超过一个属性的话),X → Y 成立,那么我们称 Y 部分函数依赖于 X 。
(3)传递函数依赖和非函数传递依赖
①、传递函数依赖
X → Y,Y → Z,且 Y 不包含于 X,X 不函数依赖于 Y,则 Z 传递函数依赖于 X。
②、非函数传递依赖
X → Y,Y → Z,且 Y 不包含于 X,X 不函数依赖于 Y,则 Z 传递函数依赖于 X,否则称 Z 非传递函数依赖于 X。
三、多值依赖
多值依赖是元组值之间的约束关系。
在关系 R 中,如果有 X+Y+Z=U,对于任意的,都有 Y 与之对应,且 Y 只与 X 的值有关,与 Z 无关,就称 R 为多值依赖.也就是说对于任意的<X, Yi>,<X, Yj> 都对应一个 y。就是一对多,整张表就是多对多。
任一元组( 课程, 授课对象) 都有一组教师与之对应, 而这组教师仅取决于课程。
就是一个 X 值对应一组 Y 值,X →→ Y。
(1)平凡多值依赖和非平凡多值依赖
①、平凡多值依赖
设 X、 Y 是关系 R(U)的属性, U=X+Y。如果 X →→ Y,则称为平凡多值依赖。
②、非平凡多值依赖
设 X、 Y、 Z 是关系 R(U)的属性, U=X+Y+Z。如果 X →→ Y,则称为非平凡多值依赖。
四、范式
(1)第一范式(1NF,First Normal Form)
不存在复合属性(一个属性由多个子属性复合而成)及多值属性(一个属性的一条记录包含多个值),只存在单值属性。
仍然存在四个问题。
(2)第二范式(2NF,Second Normal Form)
1、满足 1NF;
2、不存在非主属性对任一候选键的部分函数依赖。
插入异常和数据冗余问题有改进,但仍存在,仍存在删除异常和更新异常。
模式分解:
(3)第三范式(3NF,Third Normal Form)
1、满足 2NF;
2、不存在非主属性对任一候选键的传递函数依赖。
四个问题都有改进,但仍存在。
(4)Boyce-Codd 范式(BCNF,Boyce-Codd normal form)
1、满足 3NF;
2、不存在主属性对任一候选键的部分函数依赖与传递函数依赖。
(5)第四范式(4NF,Fourth Normal Form)
1、满足 BCNF;
2、不存在非平凡多值依赖。
就是去掉多对多关系。
参考:
https://www.zhihu.com/question/24696366
http://www.cnblogs.com/CareySon/archive/2010/02/16/1668803.html
http://www.cnblogs.com/waj6511988/p/7027127.html
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于