参考视频:https://www.bilibili.com/medialist/play/ml1197555156/BV1LW411a7wB
1.什么是范式?
范式就是关系型数据库在设计的时候,要遵守一定的规范要求.
有第一范式(1NF),第二范式(2NF),第三范式(3NF),巴基-科德范式(BCNF),第四范式(4NF)和第五范式(5NF).
范式可以理解为一张数据表的表结构所符合的设计标准的等级.
2.使用范式的根本目的?
- 减少数据冗余,尽量让每一个数据只出现一次.
- 保证数据的一致性.
缺点:在获取数据的时候,需要通过 join 连接获取到最后的数据.
3.第一范式(1ND)
满足原子性,字段属性不可再切分
比如:
商品 |
---|
鸡蛋,15,1 |
属性不唯一,还可以切分,所以就不满足第一范式.
正确因还是:
商品名称 | 商品数量 | 商品单价 |
---|---|---|
鸡蛋 | 15 | 1 |
现在每一个字段一个属性,不可再切分.满足第一范式.
4.第二范式(2ND)
不能存在部分函数依赖,就是去除部分依赖关系
比如表:
id | 姓名 | 系名 | 系主任 | 课名 | 分数 |
---|---|---|---|---|---|
000001 | 张三 | 机械 | 陈黎明 | 机械基础 | 60 |
000001 | 张三 | 机械 | 陈黎明 | 专业英语 | 88 |
000001 | 张三 | 机械 | 陈黎明 | 高等数学 | 84 |
000002 | 李四 | 工学 | 张国 | 高等数学 | 64 |
什么是部分函数依赖:
就是A依赖于B和C,A又依赖于B.
什么意思呢?就是通过B和C可以确定A,但是只通过B也可以确定A.这个A就有部分依赖,A依赖于B和C,A又依赖于B,那么C就就是A的部分依赖,多余了.
这个表有两个主键.学号和课名.可以通过两个主键学号id和课名确定分数,但是缺少其中任意一个主键都不能够确认分数,这是完全依赖,可以的.
然后通过学号id和课名可以确定姓名,但是只通过学号id就能确定姓名.所以他是有部分依赖的.
满足第二范式就要去除部分依赖,拆分:
id | 姓名 | 系名 | 系主任 |
---|---|---|---|
000001 | 张三 | 机械 | 陈黎明 |
000002 | 李四 | 工学 | 张国 |
id | 课名 | 分数 |
---|---|---|
000001 | 机械基础 | 60 |
000001 | 专业英语 | 88 |
000001 | 高等数学 | 84 |
000002 | 高等数学 | 64 |
此时不存在部分依赖,满足第二范式.
5.第三范式(3ND)
不能存在传递函数依赖
比如A依赖于B,B依赖于C,然后C就传递函数依赖于A,这就是传递函数依赖.
id | 姓名 | 系名 | 系主任 |
---|---|---|---|
000001 | 张三 | 机械 | 陈黎明 |
000002 | 李四 | 工学 | 张国 |
系名依赖于学号id,系主任依赖于系名,所以系主任传输依赖于学号id,
不满足第三范式,需要拆分:
id | 姓名 | 系名 |
---|---|---|
000001 | 张三 | 机械 |
000002 | 李四 | 工学 |
系名 | 系主任 |
---|---|
机械 | 陈黎明 |
工学 | 张国 |
id | 课名 | 分数 |
---|---|---|
000001 | 机械基础 | 60 |
000001 | 专业英语 | 88 |
000001 | 高等数学 | 84 |
000002 | 高等数学 | 64 |
符合第三范式.
在设计表结构的时候不一定要根据三范式,因为三范式是减少了数据的冗余,但是要查所有的数据就需要将所有的表join,降低了查询效率.
具体要不要完全满足三范式,根据自己业务需求决定吧.