数据库的三范式及BC范式

  • 依赖
  • 三范式
    • 第一范式(1NF):唯一性,数据列不可再分割
    • 第二范式(2NF):唯一性,消除非主键元素/列对组合主键中部分元素/列的依赖
    • 第三范式(3NF):独立性,消除传递依赖即是非主键元素/列不能依赖其他非主键元素/列
    • 三个范式一句话总结
  • BC范式(BCNF):在关系模式中每一个决定因素都包含候选键,也就是说,只要属性或属性组A能够决定任何一个属性B,则A的子集中必须有候选键(或者说A必须为超键)。

依赖

如果一个值/元素A,可以确定另一个值/元素B,则称B依赖于A。例:

函数 y =  x²

就有,y依赖于x。

同理,在数据库表中: 如果表中一个字段/元素Column1能够确定另一个字段/元素Column2,那么就可称 Column2依赖于Column1。

三范式

第一范式(1NF):唯一性,数据列不可再分割

错误示范:

教师 备注
张三,高级职称
这里的教师列,不但存储了姓名,还存储了职称,违反了第一范式的原子性。

正确示范:

教师 职称 备注
张三, 高级

第二范式(2NF):唯一性,消除非主键元素/列对组合主键中部分元素/列的依赖

  • 所有的非主键元素/列都会依赖于主键(这是主键的定义)
  • 如果主键不是组合形式,只是单个元素/列的话,则不会存在违反第二范式。

错误示例

学号 课程号 课程名 得分
SN001 CN_a 毛选 80
SN001 CN_b 邓理 85
SN002 CN_c 江三 90

上表中联合主键为: 学号 + 课程号
但是,非主键元素/列 课程名依赖于组合主键中的 课程号, 所以违反了第二范式。

正确示例
拆成两张表, 将课程单独设计为一张表

学号 课程号 得分
SN001 CN_a 80
SN001 CN_b 85
SN002 CN_a 90
课程号 课程名
CN_a 毛选
CN_b 邓理
CN_c 江三

第三范式(3NF):独立性,消除传递依赖即是非主键元素/列不能依赖其他非主键元素/列

错误示例

学号 班级 班级人数
SN001 1班 80
SN001 2班 85
SN002 3班 90

上表中, 主键为 学号。非主键列班级人数依赖了班级列,违反了第三范式。

正确示例:
将班级单独设计为一个表

班级 人数
1班 80
2班 85
3班 90
学号 班级
SN001 1班
SN002 2班
SN003 3班

三个范式一句话总结

每个列都不能再拆分,非主键列只能依赖于主键。

注:当主键为组合主键时,非主键列必须依赖整个组合主键,而不是组合主键中的某一列,否则就违反了第二范式。

BC范式(BCNF):在关系模式中每一个决定因素都包含候选键,也就是说,只要属性或属性组A能够决定任何一个属性B,则A的子集中必须有候选键(或者说A必须为超键)。

要满足BC范式,需要先满足第三范式。

解释:

属性A决定(确定)属性B,
即是 A ----> B , 表示 B依赖于A
那么, A(或A的子集)一定要有候选关键字

错误示例:

学号 课题 课题编号 课题学分
CN001 课题1 CN_a 5.0
CN001 课题1 CN_a 5.0
CN002 课题2 CN_b 4.0
CN002 课题2 CN_b 4.0

如上表,将 学号 + 课题 设计为组合主键
由于课题编号可以确定课程,所以要满足BC范式,那么课程编号必须为候选关键字,由表可知课程编号并不是候选关键字,所以违反了 BC范式。

正确示例

学号 课程编号 课程学分
CN001 CN_a 5.0
CN001 CN_a 5.0
CN002 CN_b 4.0
CN002 CN_b 4.0
课程编号 课程
CN_a 课题1
CN_b 课题2

一般原则:

  • 通过增加列或者表来满足更多/更高级别的范式
  • 要满足更高的范式得保证满足了前面低级别的范式
  • 遵循三范式有利于减少数据冗余、消除插入异常、更新异常、删除异常
  • 实际设计时,有时适当的冗余也是允许的(其他方面综合权衡考虑,如效率等)

参考:https://blog.csdn.net/A_art_xiang/article/details/113880638

数据库的三范式及BC范式相关推荐

  1. 分解三范式和BC范式

    点击此处观看视频作者讲解 R={A B C D E F} F={AE->F,A->B,BC->D,CD->A,CE->F} 在分解三范式和BC范式之前先求候选键 具体做法 ...

  2. mysql三大范式和反范式_数据库范式:三大范式、BC范式和反范式化

    一.什么是数据库范式 无规矩不成方圆,同理范式是数据表设计的一些约束和规范.为了让各个属性间的关系更加合理,减少数据冗余. 一般来说,主要满足 3NF 就可以了,因为范式过高,虽然对数据关系有更好的约 ...

  3. 第二、三范式与BC范式的区别

    在正式开始之前,先来明确以下几个概念: 1.码:能唯一确定一条记录的一个/多个属性.码包括主码和候选码.任意一个候选码也能作为主键.其中主码/候选码的任意一个真子集都不能确定一条记录. 2.主属性:构 ...

  4. 数据库的范式,第一、二、三、四、五范式、BC范式,为什么分不清

    这件事,怪我. 数据库范式 的 来历 数据库的规范化(上一篇博客有写到)的程度不同,便有了这么多种范式.数据库范式是数据库设计必不可少的知识,没有对范式的理解,就无法设计出高效率.优雅的数据库,甚至设 ...

  5. 数据库三范式和BC范式

    文章目录 范式 什么是范式 函数依赖 1. 函数依赖的定义 2. 平凡函数依赖与非平凡函数依赖 3. 完全函数依赖和部分函数依赖 4. 传递函数依赖 第一范式(1NF)--码 定义 目标 第二范式2N ...

  6. 数据库三大范式、BC范式、第四范式

    目录 第一范式(1NF):原子性(存储的数据应该具有"不可再分性") 第二范式(2NF):唯一性 (消除非主键部分依赖联合主键中的部分字段)(一定要在第一范式已经满足的情况下) 第 ...

  7. 对数据库三大范式及BC范式的理解

    1.第一范式:数据库的字段是单一属性,不可再分 不能是复合属性,如果存在,应该拆分为多个属性 不能是多值属性,如果存在,应该建立一个实体,而让此属性与其存在1对多的关系) 不能是重复属性 2.第二范式 ...

  8. MySQL之库表设计篇:一到五范式、BC范式与反范式详解

    引言 MySQL的库表设计,在很多时候我们都是率性而为,往往在前期的设计中考虑并不全面,同时对于库表结构的划分也并不明确,所以很多时候在开发过程中,代码敲着敲着会去重构某张表结构,甚至大面积重构多张表 ...

  9. 数据库范式概念以及范式分解详解

    几个重要知识点 平凡函数依赖与非平凡函数依赖 X→Y,但Y⊈X则称X→Y是非平凡的函数依赖. X→Y,但Y⊆X 则称X→Y是平凡的函数依赖. 完全函数依赖与部分函数依赖 在R(U)中, 如果X→Y,并 ...

最新文章

  1. 洛谷 P1865 A % B Problem[筛素数/前缀和思想/区间质数个数]
  2. 一文搞定Qt读写excel以及qt读写xml数据
  3. JAVA并发编程3_线程同步之synchronized关键字
  4. python代码200行左右_200行Python代码实现2048
  5. YUI Compressor
  6. 想唱你就唱卡拉ok_如何将电唱机与其他设备连接起来
  7. 七嘴八舌Google
  8. Typora 图床配置
  9. 线性代数 第六版 答案
  10. vs2013 格式化代码 快捷键
  11. Android相对布局简单案例(附完整源码)
  12. 【产品经理三节课】第4章 产品调研入门
  13. 关于如何在Matlab中构造三维几何,以及三棱柱实例演示
  14. word里面如何插入柱形图
  15. 转-超声波CX20106A的内部电路图
  16. Linux ARM 静态网络配置
  17. android 齐刘海编程,[翻译]Android适配全面屏上的齐刘海
  18. 计算机资源管理器功能,Windows资源管理器的作用 -电脑资料
  19. 树和二叉树的基本概念和相关计算
  20. 进行股票量化交易接口程序化开发要注意的事项

热门文章

  1. Dapp 众筹项目(5)
  2. 物联网助推城市治理智能化
  3. RedisCluster搭建- (create-cluster,分布式部署)
  4. [Python学习第一天]内置数据类型介绍,万物皆对象!
  5. Java编程培训学校,如何看Java培训班是否靠谱?
  6. 一张图掌握精益管理体系
  7. 女生拒绝男生的潜台词!!
  8. Ubuntu连接不上网络
  9. 给自己起了一个英文名字
  10. 什么叫计算机网络?组成由来是什么?NetAlly 1TG2-1500-2PAK测网络吞吐量