数据库范式判断(1F......4NF)
前言
最近复习范式属实是恶心到我了,书本看着看着就迷,晦涩难懂。看完了华中科技大学的数据库PPT、《数据库系统概论(第五版)》,在结合B站众多牛逼的UP主的讲解视频,我终于理解了1F到BCNF的定义和判断。接下来,我将用最小白的语句讲一讲范式是怎么回事。
定义
范式难就难在涉及几个定义,这几个定义极容易混淆。
1NF:不可分割。这个简单,数据库创建的表都是1NF,总不能像EXCEL上创建的那种花里胡哨的表一样吧。
2NF:不存在非主属性对候选码的部分依赖。OK,这里涉及几个知识点。
1. 什么是非主属性,首先需要知道什么是主属性,在此之前必须要说一下啥是候选码。
候选码:候选码能推出所有的属性(候选码一定能推出自身的属性),候选码之间带不带逗号意义完全不同。例如,在U(A,B,C,D)中AB是候选码,表示AB可以推出ABCD所有属性,这里说的ABCD并不是一定要右边完完整整的ABCD,而是他们推出的右边的属性的并集,比如AB->CD,或者AB->C、AB->D这都可以说AB推出ABCD。怎么求等会会说到。(候选码不唯一,但主码唯一)
主属性:候选码中的某些属性为主属性,注意“某些”,当然主属性也可能没有。上个例子说到AB为候选码,则可能经过后面的判断A、B都是主属性。怎么判断后面也会说。
(候选码、主属性、主码辨析)
非主属性:属性中除了主属性,剩下的都是非主属性咯。
2. 什么是部分依赖。举个栗子,AB->C、A->C,这中间A能单独推出C,所以C依赖于A,但是C又依赖于AB,所以C部分依赖于AB。
3NF:不存在非主属性到候选码的传递依赖。
3.传递依赖顾名思义啦,A->B、B->C,所以C对A是传递依赖。当然如果A->B、B->A这可不算传递依赖哦,因为这里A、B都是候选码\主属性,都不存在非主属性,那有传递依赖呀。
注意定义:X->Y (Y⊈X), Y↛ X, Y->Z (Z⊈Y),则称Z对X传递函数依赖。
BCNF:已经完全消除了非主属性对于候选码的部份依赖和传递依赖,不存在主属性对候选码的部份依赖和传递依赖。判断方式很简单,就看所有关系式的左边是否包含全部候选码(候选码AB就是看左边是不是AB,而不是A、B)(可以这么回答:因为所有函数依赖的决定因素?、?、?包含所有候选码,因此是BCNF),如果是就是BCNF,否则就是3NF。
4NF:在BCNF的基础上,一个表中有A->B,A->C(即A->BC),但是BC之间没关系,因此这里存在多值依赖,将此表拆分为两个表,分别是(A,B)和(A,C)即可,成为了4NF。(相关概念很多,也有很多性质,建议结合书本理解)
(任何一个二目关系都是属于4NF(R(X, Y)如果X->->Y,即X、Y之间存在平凡的多值依赖,R属于4NF),因此也属于BCNF、3NF......)
判断步骤
1. 求出闭包。什么是求出闭包,简单来说就是左边元素的组合能推出右边的所有元素,这个左边元素的组合就是闭包。
2. 求出候选码 =》求出主属性 =》求出非主属性。(关于闭包、候选码练习,点击)
3. 从1NF、2NF、3NF、BCNF依次判断。
例题
例1. R( A, B, C),F= { AB->C}
1. 判断闭包。AB->AB、AB->C,所有AB->ABC(这与AB->AB、AB->C是等价的)。
2. 所以AB是候选码(注意不是A、B),所以A、B都是主属性,C是非主属性。
3. 判断范式。肯定是1NF了;判断是否有部分依赖,看是否有A->C或者B->C,没有则表示是2NF;判断是否有传递依赖,很明显没有,表示是3NF;判断是否有主属性对候选码的部分依赖和传递依赖,依然没有(因为左边(AB)全为候选码(AB)),因此是BCNF。
例2. R( A, B, C),F= { B->C, B->A, A->BC}
1. 因为B能推出C和A,因此B->AC,所以B是候选码;因为A->BC,所以A也是候选码。
2. A、B是主属性,C为非主属性。
3. 很明显,左侧都为一个属性,所以不可能有部分依赖;观察关系也没有传递依赖,因此至少为3NF;因为A、B之间也不存在部分依赖和传递依赖(A->B、B->A这不算哦)(因为左边(B、A)全为候选码(A、B)),所以为BCNF。
例3. R( A, B, C),F= {B->C, AC->B}
1. 因为B->C表示B能推出C,所以AB+推出ABC;AC->B,所以AC+能推出ABC。
2. 因此AB、AC为候选码,A、B、C为主属性,不存在非主属性。
3. 没有非主属性,不存在部分依赖、传递依赖,至少为3NF;因为左边(B、AC)不全为候选码(AB、AC)(因为主属性C对候选码AB为部分依赖(B->C)),所以不为BCNF。
例4. R( A, B, C),F= {A->C, A->B}
1. 因为A->C、A->B,所以A->BC,所以A为候选码。
2. A为主属性,B、C为非主属性
3. 左边都只有一个,不存在部分依赖;也不存在传递依赖;左边(A)全为候选码(A),所以为BCNF。
例5. R( A, B, C, D),F= {A->C, AD->B}
1. A->C,得到AD+->AC,因为AD->B,所以AD可以得到ABCD,因此AD为候选码。
2. A、D为主属性,B、C为非主属性
3. 存在非主属性C对主属性A依赖,即A->C,但是对于候选码AD而言,C部分依赖于AD,所以只有1NF。
例6. R( A, B, C, D),F= {A->C, BC->D}
1. A->C,BC->D可以得到ABC+(->AD)->BCDA,因为A->C,所以AB+->ABCD(A->C,可以得到AB->BC,因为BC->D,所以AB->BCD,所以AB+->ABCD)。
2. 候选码为AB,主属性为A、B,非主属性为C、D
3. 非主属性C依赖于主属性A(A->C),所以对于候选码AB而言,非主属性C部分依赖于候选码AB,所以为1NF。