参考资料:
首先要明白,范式具有包含关系,也就是2NF包含1NF,3NF包含2NF,以此类推。
- 第一范式(1NF):要求关系模式的每个属性都是原子型的,即不可再分解成更小的数据项。
- 第二范式(2NF):要求关系模式必须满足第一范式,并且不存在非主属性对主键的部分依赖。
- 第三范式(3NF):要求关系模式必须满足第二范式,并且不存在非主属性对主键的传递依赖。
- 巴斯-科德范式(BCNF):要求关系模式必须满足第一范式,并且不存在任何属性对候选键的部分依赖。
- 第四范式(4NF):要求关系模式必须满足BCNF,并且不存在多值依赖。
- 第五范式(5NF):要求关系模式必须满足第四范式,并且不存在联接依赖。
1NF
如果某个域的元素被认为是不可再分的单元,那么这个域就是原子的(atomic)。如果一个关系模式R的所有的属性域都是原子的,我们称关系模式R属于第一范式(first normal form, 1NF)。
称一个关系模式R属于第一范式,如果R的所有属性的域都是原子的。
非原子值使得存储变复杂并且导致数据存贮的冗余。
2NF
对于关系模式S(sno , sname, dno , dean , cno, score),主码(sno, cno),有不良特性:
- 插入异常:如果学生没有选课,关于他的个人信息及所在系的信息就无法插入
- 删除异常:如果删除学生的选课信息,则有关他的个人信息及所在系的信息也随之删除
- 更新异常:如果学生转系,若他选修了k门课,则需要修改k次
- 数据冗余:如果一个学生选修了k门课,则有关他的所在系的信息重复
教材定义:若R∈1NF,且每个属性满足下列准则之一:
- 他出现在一个候选码中
- 他没有部分依赖于一个候选码
消除非主属性对码的部分依赖
所谓“非主属性对主键的部分依赖”,指的是关系模式中某个非主属性(即不属于主键的属性)依赖于主键的某一部分,而不是依赖于整个主键。换句话说,如果一个关系模式中存在非主属性只依赖于主键的某一部分,而不依赖于整个主键,那么这个关系模式就不符合2NF的要求。
例如,一个学生选课信息表的关系模式为(学生编号,课程编号,课程名称,学分),其中主键为(学生编号,课程编号)。如果课程名称只依赖于课程编号,而不依赖于学生编号,那么就存在非主属性对主键的部分依赖,这个关系模式就不符合2NF的要求。
为了满足2NF的要求,可以将上述关系模式拆分为两个关系模式:学生信息表(学生编号,学生姓名,学生性别)和选课信息表(学生编号,课程编号,学分)。这样,每个关系模式都只包含一个主键,不存在非主属性对主键的部分依赖,满足2NF的要求。也就是把部分依赖的属性与自己依赖的属性拆出去。
3NF
对以下关系模式S_SD(sno , sname , dno , dean),有不良特性:
- 插入异常:如果系中没有学生,则有关院系的信息就无法插入
- 删除异常:如果学生全部毕业了,则在删除学生信息的同时有关院系的信息也随之删除了
- 更新异常:如果学生转系,不但要修改dno,还要修改dean,如果换系主任,则该系每个学生元组都要做相应修改
- 数据冗余:每个学生存储了所在系主任的信息
教材定义为:关系模式R<UF>中,F+中所有函数依赖α→β,至少有以下之一成立,则称R∈3NF:
- α→β是平凡的函数依赖
- α是超码
- β−α的每一个属性A都包含在R的候选码中
消除非主属性对码的传递依赖.特别的,当R中所有属性都是主属性,R∈3NF
所谓“非主属性对主键的传递依赖”,指的是一个非主属性依赖于另一个非主属性,而这个非主属性又依赖于主键的情况。
举个例子,假设有一个关系模式R(A, B, C),其中A是主键。如果B依赖于A,而C又依赖于B,那么C就存在非主属性对主键的传递依赖。这是因为C并不直接依赖于主键A,而是通过非主属性B间接依赖于主键A。
这种情况下,如果修改B的值,会导致C的值发生变化,从而破坏数据的一致性和完整性。为了消除非主属性对主键的传递依赖,可以将关系模式R拆分为两个关系模式R1(A, B)和R2(B, C),其中R1的主键为A,R2的主键为B。这样就可以消除非主属性对主键的传递依赖,使得数据更加规范化和完整。
BCNF
不良特性有:
- 插入异常:如果没有学生选修某位老师的任课,则该老师担任课程的信息就无法插入
- 删除异常:删除学生选课信息,会删除掉老师的任课信息
- 更新异常:如果老师所教授的课程有所改动,则所有选修该老师课程的学生元组都要做改动
- 数据冗余:每位学生都存储了有关老师所教授的课程的信息
原因:主属性对码的不良依赖。
教材定义为:关系模式R<UF>中,F+中所有函数依赖α→β,至少有以下之一成立,则称R∈3NF:
- α→β是平凡的函数依赖
- α是超码
BCNF的本质是在(只考虑函数依赖的前提下)只讲一件事,非码决定因素的相关决定关系讲述了另外一件事,有多个码是一件事的不同方面,本质仍是一件事。BCNF一定无损分解。
BCNF比较抽象,略作解释:在学生信息表里,学号是一个候选码,学号可确定学生姓名;(班级,学生姓名)也是一组候选码,有(班级,学生姓名)->学号,因此在主属性问形成了传递依赖。
与3NF相比,BCNF增加了以下约束:
- 每个非主属性必须完全依赖于主键。这意味着每个非主属性必须与主键形成一个候选键,而不仅仅是与主键的某一部分相关。
- 不存在主属性之间的依赖。这意味着主属性之间不能存在函数依赖,否则需要将主属性拆分为多个关系模式。
简单验证: 检查关系模式R是否属于BCNF,仅需检查给定集合F中的函数依赖是否违反BCNF就足够了,不用检查F+中的所有函数依赖。
3NF与BCNF的特点:
3NF | BCNF |
满足无损分解 | 满足无损分解 |
保持依赖 | 可能不满足保持依赖 |
模式分解
无损连接判别方法—快速法:将R分解成 R1 和 R2 ,若F+中存在以下至少一个依赖,则是无损分解:,以上的函数依赖是无损分解的充分条件;这些依赖是必要条件当且仅当所有约束都是函数依赖。
无损连接判别方法—表格法(充分必要条件)
保持函数依赖的判定:
3NF分解
3NF分解分为保持依赖和无损连接两步,为了说明求解保持依赖,我们先要会求最小依赖集。口诀为:
3NF分解整体的口诀为:
BCNF分解
将关系模式R<U,F>分解为一个BCNF的基本步骤是: