数据库范式(第一范式-第四范式)、函数依赖与反范式化


函数依赖


部分函数依赖

X,Y 是关系 R 的两个属性集合,存在 X→Y ,若 X’X 的真子集,存在 X’→Y ,则称 Y 部分函数依赖于 X

例子:学生基本信息表 R:(学号,身份证号,姓名) ,学号属性取值是唯一的。在R关系中,(学号,身份证号)→(姓名)(学号)→(姓名)(身份证号)→(姓名) ;所以 姓名 部分函数依赖与(学号,身份证号)


完全函数依赖

X,Y 是关系 R 的两个属性集合,X’X 的真子集,存在 X→Y ,但对每一个 X’ 都有 X’!→Y ,则称 Y 完全函数依赖于 X

例子:学生基本信息表 R:(学号,班级,姓名) ,班级内学号是唯一的,不同班级间学号可以相同。在R关系中,(学号,班级)→(姓名)(学号)!→(姓名)(班级)!→(姓名) ;所以 姓名 完全函数依赖与(学号,班级)


传递函数依赖

X,Y,Z 是关系 R 中互不相同的属性集合,存在 X→Y,Y→Z,Y!→X ,则称 Z 传递函数依赖于 X

例子:在关系 R(学号, 宿舍, 费用) 中,(学号)→(宿舍) , (宿舍)!→(学号)(宿舍)→(费用) , (费用)!→(宿舍)费用 传递函数依赖于 学号


(非)平凡函数依赖

X,Y 均为某关系上的属性集,且 X→Y

  • Y 包含于 X,则称 X→Y平凡函数依赖
  • Y 不包含于 X ,则称 X→Y非平凡函数依赖

多值依赖

R(U) 是一个属性集合 U 上的一个关系模式,X, Y, ZU 的子集,并且 Z=U-X-Y ,多值依赖 X→→Y 成立当且仅当对 R 的任一个关系 rr(X,Z) 上的每个值对应一组 Y 的值,这组值仅仅决定于 X 值而与 Z 值无关。

X→→Y ,而 Z=空集 ,则称 X→→Y 为平凡的多值依赖。否则,称 X→→Y 为非平凡的多值依赖。

例子:课程表(课程C, 教师T, 参考书B) 中,若参考书只与课程有关,则 (C,T)→→B 为多值依赖。



范式


第一范式(1NF)

数据库表的每个属性都是不可分割的基本数据项,同属性中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性

数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。

如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。

例子:不符合的情况:

表:

字段1字段2字段3字段4
字段3.1字段3.2
CS-10001

第二范式(2NF)

如果关系模式 R 为第一范式,并且 R每一个非主属性完全函数依赖于主关键字, 则称为第二范式模式。

所有单关键字的数据库表都符合第二范式,因为不可能存在组合关键字。

假定选课关系表为 SelectCourse(学号, 姓名, 年龄, 课程名称, 成绩, 学分) ,关键字为组合关键字 (学号, 课程名称) 。这个表不满足第二范式,因为存在如下决定关系: (学号, 课程名称) → (姓名)(学号) → (姓名)


存在的问题

由于不符合2NF,关系表 SelectCourse(学号, 姓名, 年龄, 课程名称, 成绩, 学分) 会存在如下问题:

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

第三范式(3NF)

如果关系模式 R 是第二范式,且每个非主属性都不传递依赖于 R 的候选键,即不存在传递函数依赖,则称 R 为第三范式模式。

第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。

例子:假定学生关系表为 Student(学号, 姓名, 年龄, 所在学院, 学院地点, 学院电话) ,关键字为单一关键字 学号 ,这个表不满足3NF,因为存在如下决定关系:(学号)→(所在学院)→(学院地点, 学院电话)


存在的问题

不满足第三范式存在的问题与不满足第二范式存在的问题相同。


鲍依斯-科得范式(BCNF)

若关系模式 R 是第一范式,且每个属性都不传递依赖于 R 的候选键 ,则这种关系模式就是BCNF模式。

即在第三范式的基础上,数据库表中如果不存在任何字段对任一候选关键字段的传递函数依赖则符合BCNF。

例子:仓库管理关系表 StorehouseManage(仓库ID, 存储物品ID, 管理员ID, 数量) ,一个管理员只在一个仓库工作;一个仓库可以存储多种物品。这个数据库表中不满足BCNF,因为存在如下决定关系:(仓库ID) →(管理员ID)(管理员ID) → (仓库ID)


存在的问题

对于仓库管理关系表 StorehouseManage(仓库ID, 存储物品ID, 管理员ID, 数量)

  • 删除异常:当仓库被清空后,所有 存储物品ID数量 信息被删除的同时,仓库ID管理员ID 信息也被删除了
  • 插入异常:当仓库没有存储任何物品时,无法给仓库分配管理员
  • 更新异常:如果仓库换了管理员,则表中所有行的 管理员ID 都要修改

第四范式(4NF)

若关系模式 R 是 BC范式,并且不包含多值依赖关系,则这种关系模式就是第四范式模式。

非形式说:只要两个独立的 1:N 联系出现在一个关系中,那么就可能出现多只依赖。

例子:表 Course(课程, 学生, 先修课) ,由于 (课程, 学生)→→(先修课) 为多值依赖,故该表不满足第四范式。



范式化设计和反范式化设计


范式化

优点:

  • 可以尽量减少数据冗余
  • 更新操作比反范式化更快
  • 表通常比反范式化更小

缺点:

  • 查询需要对多个表进行关联,性能降低
  • 更难进行索引优化

反范式化

优点:

  • 可以减少表的关联
  • 可以更好进行索引优化

缺点:

  • 存在数据冗余及数据维护异常
  • 对数据的修改需要更多的成本


参考

优快云 - 数据库,部分函数依赖,传递函数依赖,完全函数依赖,三种范式的区别

优快云 - 数据库范式(1NF 2NF 3NF BCNF)详解

优快云 - 数据库范式讲解(1NF、2NF、3NF、4NF、BCNF)

优快云 - 数据库基础1—函数依赖 多值依赖

博客园 - 数据库设计范式2——BC范式和第四范式

Segmentfault - 五、范式化设计和反范式化设计的优缺点

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值