先决条件—— 数据库规范化和函数依赖概念 .
规范化 是最小化的过程 冗余 来自一个关系或一组关系。相关冗余可能会导致插入、删除和更新异常。因此,它有助于最大限度地减少关系中的冗余。 范式 用于消除或减少数据库表中的冗余。
1.第一范式-
如果一个关系包含复合属性或多值属性,那么它违反了第一范式;如果一个关系不包含任何复合属性或多值属性,那么它就是第一范式。如果一个关系中的每个属性都是 单值属性 .
- 例1- 由于多值属性STUD_PHONE,表1中的关系STUDENT不在1NF中。其分解为1NF的情况如表2所示。
- 例2-
ID Name Courses ------------------ 1 A c1, c2 2 E c3 3 M C2, c3
在上表中,课程是一个多值属性,因此它不在1NF中。
下表为1NF,因为没有多值属性
ID Name Course ------------------ 1 A c1 1 A c2 2 E c3 3 M c2 3 M c3
2.第二范式-
要处于第二范式,关系必须处于第一范式,并且关系不能包含任何部分依赖项。一个关系是2NF,如果它有 没有部分依赖, 即 , 没有非素数属性(不属于任何候选键的属性)依赖于表中任何候选键的任何适当子集。
部分依赖—— 如果候选密钥的适当子集决定了非素数属性,则称为部分依赖。
- 例1- 请考虑下面的表3。
STUD_NO COURSE_NO COURSE_FEE 1 C1 1000 2 C2 1500 1 C4 2000 4 C3 1000 4 C1 1000 2 C5 2000
{请注意,有许多课程的学费相同。}
在这里 课程费不能单独决定课程号或课程号的价值; 课程费和课程号不能决定课程号的价值; 课程费和课程号不能决定课程号的价值; 因此 课程费将是一个非主要属性,因为它不属于唯一的候选项{STUD_NO,COURSE_NO}; 但是,COURSE_NO->COURSE_FEE,即COURSE_FEE依赖于COURSE_NO,它是候选密钥的一个适当子集。非素数属性COURSE_FEE依赖于候选密钥的适当子集,这是一个部分依赖,因此这种关系不在2NF中。
要将上述关系转换为2NF, 我们需要将表拆分为两个表,例如: 表1:种籽号、课程号 表2:课程号,课程费
Table 1 Table 2 STUD_NO COURSE_NO COURSE_NO COURSE_FEE 1 C1 C1 1000 2 C2 C2 1500 1 C4 C3 1000 4 C3 C4 2000 4 C1 C5 2000
2 C5
注: 2NF试图减少存储在内存中的冗余数据。例如,如果有100名学生参加C1课程,我们不需要将其费用存储为1000,而是将其存储在第二个表中,因为C1的课程费用为1000。
- 例2- 考虑关系r(a,b,c,d)中的函数依赖关系
AB -> C [A and B together determine C] BC -> D [B and C together determine D]
在上述关系中,AB是唯一的候选密钥,不存在部分依赖关系,即AB的任何适当子集都不确定任何非素数属性。
3.第三范式-
一个关系是第三范式,如果有 无可传递依赖关系 对于非素数属性以及第二范式。 一个关系是3NF if 至少下列条件之一成立: 在每个非平凡函数中,依赖项X–>Y
- X是一个超级键。
- Y是一个基本属性(Y的每个元素都是某个候选键的一部分)。
传递依赖—— 如果A->B和B->C是两个FD,那么A->C被称为传递依赖。
- 例1- 关于表4中给出的学生,
FD集合:{STUD_NO->STUD_NAME,STUD_NO->STUD_STATE,STUD_STATE->STUD_COUNTRY,STUD_NO->STUD AGE} 候选键:{STUD_NO}
对于表4中的这种关系,STUD_NO->STUD_STATE和STUD_STATE->STUD_COUNTRY为真。所以STUD_COUNTRY是对STUD_NO的过渡依赖,它违反了第三范式。为了将其转换为第三范式,我们将关系STUDENT(STUD_NO、STUD_NAME、STUD_PHONE、STUD_STATE、STUD_COUNTRY_STUD_AGE)分解为: 学生(学号、学名、学号电话、学号州、学号年龄) 国家(州,国家)
- 例2- 考虑关系r(a,b,c,d,e) 公元前, CD->E, B->D, E->A 上述关系中所有可能的候选键都是{A,E,CD,BC}所有属性都位于所有函数依赖项的右侧。
4.Boyce Codd标准型(BCNF)——
如果R是第三范式,则关系R在BCNF中,并且对于每个FD,LHS是超键。在BCNF iff中,每个非平凡函数依赖项X–>Y中都有一个关系,X是一个超键。
- 例1- 求一个关系R(a,B,C,D,E)的最高范式,其中FD设置为{BC->D,AC->BE,B->E} 第一步。正如我们所看到的,(AC)+={A,C,B,E,D}但它的子集都不能确定关系的所有属性,所以AC将是候选键。A或C不能从关系的任何其他属性派生,因此只有1个候选键{AC}。 第二步。素数属性是本例中作为候选键{A,C}的一部分的属性,而在本例中其他属性将是非素数{B,D,E}。 第三步。关系R是第一范式,因为关系DBMS不允许多值或复合属性。 关系处于第二范式,因为BC->D处于第二范式(BC不是候选密钥AC的适当子集),AC->BE处于第二范式(AC是候选密钥),B->E处于第二范式(B不是候选密钥AC的适当子集)。 这种关系不是第三范式,因为在BC->D(BC不是超级键,D也不是质数属性)和B->E(B不是超级键,E也不是质数属性)中,但为了满足第三范式,FD的LHS应该是超级键,或者RHS应该是质数属性。 所以关系的最高范式是第二范式。
- 例2- 例如,考虑关系r(a,b,c) 公元前, B-> A和B都是超级键,所以上面的关系在BCNF中。
关键点——
- BCNF没有冗余。
- 如果关系在BCNF中,则3NF也满足。
- 如果关系的所有属性都是素属性,那么关系总是在3NF中。
- 关系数据库中的关系总是且至少是1NF形式。
- 每个二元关系(一个只有两个属性的关系)总是在BCNF中。
- 如果一个关系只有单个候选键(即每个候选键只包含一个属性),那么该关系总是在2NF中(因为不可能存在部分函数依赖关系)。
- 有时使用BCNF形式可能无法保持功能依赖性。在这种情况下,仅当不需要丢失的FD时,才使用BCNF,否则仅正常化至3NF。
- BCNF之后还有更多的正常形式,比如4NF等等。但在现实世界的数据库系统中,通常不需要超出BCNF。
练习1 :在以下函数依赖项下,在R(A、B、C、D、E)中找到最高范式。
ABC --> D CD --> AE
要点 用于解决上述问题。 1) 最好先从BCNF开始检查,然后再从3NF开始检查,以此类推。 2) 如果任何函数依赖满足标准形式,那么就不需要检查低标准形式。例如,ABC–>D在BCNF中(注意,ABC是一个超级键),因此无需检查低范式的这种依赖关系。
给定关系中的候选键是{ABC,BCD}
BCNF: ABC->D在BCNF中。让我们检查CD->AE,CD不是超级键,所以这个依赖项不在BCNF中。所以,R不在BCNF中。
3NF: ABC->D我们不需要检查这种依赖关系,因为它已经满足BCNF。让我们考虑CD-> AE。因为E不是一个素属性,所以关系不在3NF中。
2NF: 在2NF中,我们需要检查部分依赖性。CD是候选密钥的适当子集,它决定了E,这是非素数属性。所以,给定的关系也不在2nF中。所以,最高标准形式是1nF。
关卡角问题 练习下列问题将有助于测试你的知识。所有问题都是在前几年的GATE或GATE模拟测试中提出的。强烈建议你练习。
- 2012年CS门,问题2
- 2013年CS门,问题54
- 2013年CS门,问题55
- 2005年CS门,问题29
- CS 2002号登机门,问题23
- CS 2002号登机门,问题50
- CS门2001,问题48
- CS门1999,问题32
- 2005年,问题22
- 2008年,问题60
- 2016年CS登机口(第1组),问题31
看见 数据库范式测验 对于前一年的所有问题。
本文由 奏鸣曲 .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以使用 写极客。组织 或者把你的文章寄去评论-team@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。
如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。