数据库基础(5)1NF,2NF,3NF,BCNF 四大范式的定义和判别
范式很重要呀,我们关系数据库的设计都要满足范式关系
这里总结一下1NF,2NF,3NF和BCNF
1.第一范式(1NF)
定义
(1NF, Normal Form) 如果一个关系模式R中的每个属性A的域值都是原子的,即属性值是不可再分的,则关系模式R属于第一范式,简记为R ∈ 1NF。若数据库模式R中的每个关系模式都是1NF,数据库模式 R∈1NF。
这个非常好理解,基本上,只要题目给了,他就是一个满足第一范式的关系模式
2.第二范式(2NF)
定义
2NF指的就是,我们的关系模式中的所有非主属性完全依赖于每个键。什么意思呢,这里呢最重要的是理解什么是非主属性
,什么是主属性
,什么是键
推荐看另外一个博客的总结,理解一下键的含义: https://blog.csdn.net/fjxcsdn/article/details/76549751
看我之前写的博客理解完全依赖和部分依赖的含义: 数据库基础(3)函数依赖-平凡依赖,完全依赖,部分依赖,传递依赖
那非主属性和主属性怎么理解呢,举个例子:关系模式R={A,B,C,D} ,已知R的候选键是AD , 那么AD中的A和D就是主属性,而B和C就是非主属性。包含在候选键里的属性就是主属性!
现在理解键和依赖关系的含义之后,我们就可以好好看看2NF是个什么了
举例子1:
已知,R={A,B,C},函数依赖集为 F ={ B →C, AC →B } ,判断关系模式是不是2NF
那么我们首先看这个R关系模式里面的键是谁
利用数据库基础(4)中我们学习的属性闭包算法
求出R的候选键为:AC
所以第二步 就是看是否有非主属性部分依赖于主属性AC (我们这里的非主属性就是B)
很明显并没有B部分依赖于A或者C ,所以R是2NF
举例子2
已知,R={A,B,C,D},函数依赖集为F ={ A →C,AD →B },判断关系模式是不是2NF
和第一个例子一样,我们首先看这个R中的键是谁
用属性闭包算法,求出R的候选键为:AD (AD+ = ABCD) ,所以C和B都是非主属性,A和D是主属性
所以,很明显,我们发现 AD中的A竟然可以单独决定C(A->C),所以C部分依赖于AC ,存在非主属性部分依赖于主属性,R不是2NF
3.第三范式(3NF)
定义
第三范式的意思就是,R中没有非主属性传递依赖
于R的键,R才是3NF
这里也隐含了一个条件,那就是,如果是R中的主属性传递依赖
于R的键,那么R也是满足3NF的
注意区分主属性传递依赖和非主属性传递依赖喔
举例子1
已知R(A,B,C), 其函数依赖集为 F ={ B →C, AC →B };该关系模式是否第3范式
我们来判断判断,首先第一步,找键!我们发现AC是候选键(AC+=ABC,通过属性闭包算法求的候选键)
同时由于AC->B , B->C ,所以C传递依赖于AC ,那么R是不是3NF呢?
R 当然是3NF啦,因为R的候选键是AC,所以C是主属性,因此 这里是主属性C
传递依赖于键AC,R是3NF
注意!只有当非主属性传递依赖于R的时候,R才不是3NF
举例子2
R(A,B,C,D), 其函数依赖集为 F ={AB →C, C →D };该关系模式是否第3范式
什么C++不要沾边,我怕python误会: 可以利用null来保留悬浮链接,从而形成外链接
什么C++不要沾边,我怕python误会: 做自然连接时,不存在公共属性相等的元组,在操作时被舍弃的元组被称为悬浮元组
run之夭夭: 《算法中的最优化方法与实现》
KKKZOZ: 一眼国科大哈哈哈
辣辣哭: 一眼国科大是吧