数据库管理系统中的范式

先决条件—— 数据库规范化和函数依赖概念 .

null

规范化 是最小化的过程 冗余 来自一个关系或一组关系。相关冗余可能会导致插入、删除和更新异常。因此,它有助于最大限度地减少关系中的冗余。 范式 用于消除或减少数据库表中的冗余。

1.第一范式-

如果一个关系包含复合属性或多值属性,那么它违反了第一范式;如果一个关系不包含任何复合属性或多值属性,那么它就是第一范式。如果一个关系中的每个属性都是 单值属性 .

  • 例1- 由于多值属性STUD_PHONE,表1中的关系STUDENT不在1NF中。其分解为1NF的情况如表2所示。

    图片[1]-数据库管理系统中的范式-yiteyi-C++库

  • 例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

    1. X是一个超级键。
    2. Y是一个基本属性(Y的每个元素都是某个候选键的一部分)。

    image5

    传递依赖—— 如果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中。

      关键点——

      1. BCNF没有冗余。
      2. 如果关系在BCNF中,则3NF也满足。
      3. 如果关系的所有属性都是素属性,那么关系总是在3NF中。
      4. 关系数据库中的关系总是且至少是1NF形式。
      5. 每个二元关系(一个只有两个属性的关系)总是在BCNF中。
      6. 如果一个关系只有单个候选键(即每个候选键只包含一个属性),那么该关系总是在2NF中(因为不可能存在部分函数依赖关系)。
      7. 有时使用BCNF形式可能无法保持功能依赖性。在这种情况下,仅当不需要丢失的FD时,才使用BCNF,否则仅正常化至3NF。
      8. 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模拟测试中提出的。强烈建议你练习。

      1. 2012年CS门,问题2
      2. 2013年CS门,问题54
      3. 2013年CS门,问题55
      4. 2005年CS门,问题29
      5. CS 2002号登机门,问题23
      6. CS 2002号登机门,问题50
      7. CS门2001,问题48
      8. CS门1999,问题32
      9. 2005年,问题22
      10. 2008年,问题60
      11. 2016年CS登机口(第1组),问题31

      看见 数据库范式测验 对于前一年的所有问题。

      本文由 奏鸣曲 .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以使用 写极客。组织 或者把你的文章寄去评论-team@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。

      如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。

© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享