数据库的三范式及BC范式
数据库的三范式及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范式相关推荐
- 分解三范式和BC范式
点击此处观看视频作者讲解 R={A B C D E F} F={AE->F,A->B,BC->D,CD->A,CE->F} 在分解三范式和BC范式之前先求候选键 具体做法 ...
- mysql三大范式和反范式_数据库范式:三大范式、BC范式和反范式化
一.什么是数据库范式 无规矩不成方圆,同理范式是数据表设计的一些约束和规范.为了让各个属性间的关系更加合理,减少数据冗余. 一般来说,主要满足 3NF 就可以了,因为范式过高,虽然对数据关系有更好的约 ...
- 第二、三范式与BC范式的区别
在正式开始之前,先来明确以下几个概念: 1.码:能唯一确定一条记录的一个/多个属性.码包括主码和候选码.任意一个候选码也能作为主键.其中主码/候选码的任意一个真子集都不能确定一条记录. 2.主属性:构 ...
- 数据库的范式,第一、二、三、四、五范式、BC范式,为什么分不清
这件事,怪我. 数据库范式 的 来历 数据库的规范化(上一篇博客有写到)的程度不同,便有了这么多种范式.数据库范式是数据库设计必不可少的知识,没有对范式的理解,就无法设计出高效率.优雅的数据库,甚至设 ...
- 数据库三范式和BC范式
文章目录 范式 什么是范式 函数依赖 1. 函数依赖的定义 2. 平凡函数依赖与非平凡函数依赖 3. 完全函数依赖和部分函数依赖 4. 传递函数依赖 第一范式(1NF)--码 定义 目标 第二范式2N ...
- 数据库三大范式、BC范式、第四范式
目录 第一范式(1NF):原子性(存储的数据应该具有"不可再分性") 第二范式(2NF):唯一性 (消除非主键部分依赖联合主键中的部分字段)(一定要在第一范式已经满足的情况下) 第 ...
- 对数据库三大范式及BC范式的理解
1.第一范式:数据库的字段是单一属性,不可再分 不能是复合属性,如果存在,应该拆分为多个属性 不能是多值属性,如果存在,应该建立一个实体,而让此属性与其存在1对多的关系) 不能是重复属性 2.第二范式 ...
- MySQL之库表设计篇:一到五范式、BC范式与反范式详解
引言 MySQL的库表设计,在很多时候我们都是率性而为,往往在前期的设计中考虑并不全面,同时对于库表结构的划分也并不明确,所以很多时候在开发过程中,代码敲着敲着会去重构某张表结构,甚至大面积重构多张表 ...
- 数据库范式概念以及范式分解详解
几个重要知识点 平凡函数依赖与非平凡函数依赖 X→Y,但Y⊈X则称X→Y是非平凡的函数依赖. X→Y,但Y⊆X 则称X→Y是平凡的函数依赖. 完全函数依赖与部分函数依赖 在R(U)中, 如果X→Y,并 ...
最新文章
- 洛谷 P1865 A % B Problem[筛素数/前缀和思想/区间质数个数]
- 一文搞定Qt读写excel以及qt读写xml数据
- JAVA并发编程3_线程同步之synchronized关键字
- python代码200行左右_200行Python代码实现2048
- YUI Compressor
- 想唱你就唱卡拉ok_如何将电唱机与其他设备连接起来
- 七嘴八舌Google
- Typora 图床配置
- 线性代数 第六版 答案
- vs2013 格式化代码 快捷键
- Android相对布局简单案例(附完整源码)
- 【产品经理三节课】第4章 产品调研入门
- 关于如何在Matlab中构造三维几何,以及三棱柱实例演示
- word里面如何插入柱形图
- 转-超声波CX20106A的内部电路图
- Linux ARM 静态网络配置
- android 齐刘海编程,[翻译]Android适配全面屏上的齐刘海
- 计算机资源管理器功能,Windows资源管理器的作用 -电脑资料
- 树和二叉树的基本概念和相关计算
- 进行股票量化交易接口程序化开发要注意的事项