数据库范式基本概念

本文链接:https://blog.csdn.net/xiaodongdonglht/article/details/93205275
关系型数据库设计时,遵照一定的规范要求,目的在于降低数据的冗余性和数据的一致性,目前业界范式有:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式
(BCNF)、第四范式(4NF)、第五范式(5NF)。
使用范式的根本目的是:减少数据冗余,尽量让每个数据只出现一次,获取数据时通过 join 拼接出最后的数据。
范式的基本概念
1函数依赖
给定一个X一定能查找到Y 就是Y 依赖与X,写作 X → Y。
2完全函数依赖
在一张表中,若 X → Y,且对于 X 的任何一个真子集(假如属性组 X 包含超过一个属性的话),X ’ → Y 不成立,那么我们称 Y 对于 X 完全函数依赖
比如说
(学号,课程名字) -> 分数 这个组合能确定分数,但是分数是不能根据学号或者课程名字任意一个去确定出来,这个就称为完全依赖
3 部分函数依赖
假如 Y 函数依赖于 X,但同时 Y 并不完全函数依赖于 X,那么我们就称 Y 部分函数依赖于 X,记做:在这里插入图片描述
跟上面的概念刚好相反一下
简单来说,(学号,课名)→ 系名,学号 → 系名,那么(学号,课名)p→ 系名。
学号跟课名只要有一个能确定到系名 则我们就说部分函数依赖
4. 传递函数依赖
假如 Z 函数依赖于 Y,且 Y 函数依赖于 X ,且 Y 不包含于 X,X 不函数依赖于 Y,那么我们就称 Z 传递函数依赖于 X,记做:在这里插入图片描述
简单来说,系名 → 系主任,学号 → 系名,那么学号 T→ 系主任。
这个很好理解 就 C能根据B 找到 B 又能根据A找到,那么A就能找到C 就是传递函数依赖

讲完了一些函数依赖,下面开始介绍什么是范式
3.1.3 一范式
一范式(1NF):域应该是原子性的,即数据库表的每一列都是不可分割的原子数据项。
域:域就是列的取值范围,比如性别的域就是(男,女)
就是不能区分,比如给定性别,值确实不详。这就是不符合。
二范式(2NF):在 1NF 的基础上,实体的属性完全函数依赖于主关键字(混合主键), 不能存在部分函数依赖于主关键字(混合主键)。
如果存在某些属性只依赖混合主键中的部分属性,那么不符合二范式。
学生 ID 姓名 所属系 系主任 所修课程 分数
20170901176 王小强 计算机系 马小腾 000001 95
20170901176 王小强 计算机系 马小腾 000002 99
这个表 像 姓名 所属系 系主任 都可以根据学生ID一个找到,这就是部分函数依赖,显然是不符合的。
上述表格中是混合主键(学生 ID + 所修课程),但是所属系和系主任这两个属性只依赖于混合主键中的学生 ID 这一个属性,因此,不符合第二范式。
如果有一天学生的所属系要调整,那么所属系和系主任这两列都需要修改,如果这个学生修了多门课程,那么表中的多行数据都要修改,这是非常麻烦的,不符合第二范式。
为了消除这种部分依赖,只有一个办法,就是将大数据表拆分成两个或者更多个更小
的数据表。
3.1.5 三范式
3NF 在 2NF 的基础之上,消除了非主属性对于主键(复合主键)的传递依赖。

订单ID 商品ID 商品颜色 商品尺寸 商家ID 用户ID

001 0001 深空灰 30027040 XXX旗舰店 00001
很明显,表 3-7 中,商品颜色依赖于商品 ID,商品 ID 依赖于订单 ID,那么非主属性商品颜色就传递依赖于订单 ID,因此不符合三范式,解决方案是将大数据表拆分成两个或者更多个更小的数据表。
表 3-7 符合三范式的表格设计(1)

订单ID 商品ID 商家ID 用户ID

001 0001 XXX旗舰店 00001

商品ID 商品颜色 商品尺寸

0001 深空灰 30027040

发布了19 篇原创文章 · 获赞 7 · 访问量 584

猜你喜欢

转载自blog.csdn.net/liu201812/article/details/102641995