第一范式
第一范式:所有属性都是不可分割的原子值。 也就是说,所有属性都是不可分离的。 例如,下图不符合第一范式的要求
事实上,1NF是所有关系数据库最基本的要求,在SQL Server、Oracle、MySQL等关系数据库管理系统(RDBMS )中创建数据表时,数据表的设计是要在RDBMS中表示表的数据,必须如下图所示进行设计。
第二范式(2NF)
第二范式:基于第一范式,要求非主属性都与代码具有完全的依赖关系。 完全依赖是指,不可以存在只依赖于代码的一部分的属性,必须依赖于所有的属性。 如果有只与代码的一部分相关的数据(区别于部分依赖),那就不符合第二种模式。 另外,如果一个数据表的代码中只有一个字段,则必须以该数据表符合第一范式为前提,并符合第二范式。 (由于代码可以由多个字段组成连接代码,所以代码可以是多个属性) 2NF除了1NF之外,还消除了非主属性对代码的部分属性依赖。
让我们先看下图
各学生的学号、姓名、系名、系部长的数据多次重复。 每个系对应的系主任的数据也多次重复——数据,冗长性过高
)假设学校新设了系,但还没有招生的情况下(例如3月新设,到了8月再招),系部长的数据之外无法将系部长的数据添加到数据表中,这是——插入异常的情况
3 )如果删除某个系的所有学生的相关记录,所有系和系部长的数据也会消失(即使一个系的所有学生都没有了,也不是该系就没有了)。 ——消除异常
4 )如果李明转到法律系,为了保证数据库内数据的一致性,需要修改3个记录员和系主任的数据。 ——修正异常
所以,这张表肯定不符合设计规范。 我们用第二种模式进行修改。 首先什么是依赖?
在依存一张表中,属性(或属性组) x的值确定时,如果一定能确定属性y的值,则可以说y函数依存于x,写作X Y。 例如,上图中的数据找不到任何记录,且同一学校编号的对应名称不同。 因此,姓名函数依赖于学号,可以说是学号写姓名。 但是相反,由于可能会出现同名的学生,可能会有两个不同的学生记录,它们的名字值相同,但是对应的学校编号不同,所以不能说学校编号函数依赖于名字。
还有代码是什么?
代码拍摄k是某个表中的一个属性或属性组,除了k以外的所有属性都完全依赖于k时,将k称为候补代码,简称代码。 实际上,在确定了k的情况下,如果该表的除k以外的所有属性的值也确定了,则可以理解为k是代码。 一个表可以有一个以上的代码。 (在实际应用中,为了方便,通常选择其中一个代码作为主代码)如图所示,可知该表中的代码为(学号、课程名称)。
在第二种模式中,所有的非主属性必须依赖于所有的主属性。 从照片中可以得到两个主要属性。 学校编号和课程“学校编号‘和’课”构成共同主键。 (一个表只有一个主键。 主键可以由一个字段或多个字段组成。)
因为我们可以通过学校编号确定一个学生的姓名系系主任的三个属性,所以无法确定课程和分数的属性。 根据学生的学校编号和课程两个属性,可以确定分数。
(学校编号、课程名称)对于姓名,有学校编号姓名,非主属性姓名的代码)、课程名称) )的部分依赖。 没错
于(学号,课名) → 系名,有 学号 → 系名,存在非主属性 系名 对码(学号,课名)的部依赖。 对于(学号,课名) → 系主任,有 学号 → 系主任,存在非主属性 系主任 对码(学号,课名)的部分依赖。
所以表3存在非主属性对于码的部分函数依赖,最高只符合1NF的要求,不符合2NF的要求。
所以做出修改
删除某个系中所有的学生记录 该系的信息仍然全部丢失。——无改进 所以我们要使用第三范式。
第三范式(3NF)
第三范式:任何非主属性不依赖于其它非主属性。 3NF在2NF的基础之上,消除了非主属性对于码的传递函数依赖。
对于选课表,码为(学号,课名),主属性为学号和课名,非主属性只有一个,为分数,不可能存在传递函数依赖,所以选课表的设计,符合3NF的要求。
对于学生表,主码为学号,主属性为学号,非主属性为姓名、系名和系主任。因为 学号 → 系名,同时 系名 → 系主任,所以存在非主属性系主任对于码学号的传递函数依赖,所以学生表的设计,不符合3NF的要求。
为了让数据表设计达到3NF,我们必须进一步进行模式分解为以下形式: 选课(学号,课名,分数) 学生(学号,姓名,系名) 系(系名,系主任)
新的函数依赖关系如图
修改后的表
第二范式和第三范式就是为了消除非主属性对码的部分函数依赖和传递函数依赖
BC范式
BC范式在 3NF 的基础上消除主属性对于码的部分与传递函数依赖。 要了解 BCNF 范式,那么先看这样一个问题: 若: 某公司有若干个仓库; 每个仓库只能有一名管理员,一名管理员只能在一个仓库中工作; 一个仓库中可以存放多种物品,一种物品也可以存放在不同的仓库中。每种物品在每个仓库中都有对应的数量。 那么关系模式 仓库(仓库名,管理员,物品名,数量) 属于哪一级范式?
答:已知函数依赖集:仓库名 → 管理员,管理员 → 仓库名,(仓库名,物品名)→ 数量 码:(管理员,物品名),(仓库名,物品名) 主属性:仓库名、管理员、物品名 非主属性:数量 ∵ 不存在非主属性对码的部分函数依赖和传递函数依赖。∴ 此关系模式属于3NF。
基于此关系模式的关系(具体的数据)可能如图所示:
好,既然此关系模式已经属于了 3NF,那么这个关系模式是否存在问题呢?我们来看以下几种操作: 先新增加一个仓库,但尚未存放任何物品,是否可以为该仓库指派管理员?——不可以,因为物品名也是主属性,根据实体完整性的要求,主属性不能为空。 某仓库被清空后,需要删除所有与这个仓库相关的物品存放记录,会带来什么问题?——仓库本身与管理员的信息也被随之删除了。 如果某仓库更换了管理员,会带来什么问题?——这个仓库有几条物品存放记录,就要修改多少次管理员信息。 从这里我们可以得出结论,在某些特殊情况下,即使关系模式符合 3NF 的要求,仍然存在着插入异常,修改异常与删除异常的问题,仍然不是 ”好“ 的设计。
造成此问题的原因:存在着主属性对于码的部分函数依赖与传递函数依赖。(在此例中就是存在主属性【仓库名】对于码【(管理员,物品名)】的部分函数依赖。
解决办法就是要在 3NF 的基础上消除主属性对于码的部分与传递函数依赖。
仓库(仓库名,管理员) 库存(仓库名,物品名,数量)
这样,之前的插入异常,修改异常与删除异常的问题就被解决了。
168飞艇6种不亏钱的方法db?from=pc”>
修改后的表
第二范式和第三范式就是为了消除非主属性对码的部分函数依赖和传递函数依赖
BC范式
BC范式在 3NF 的基础上消除主属性对于码的部分与传递函数依赖。 要了解 BCNF 范式,那么先看这样一个问题: 若: 某公司有若干个仓库; 每个仓库只能有一名管理员,一名管理员只能在一个仓库中工作; 一个仓库中可以存放多种物品,一种物品也可以存放在不同的仓库中。每种物品在每个仓库中都有对应的数量。 那么关系模式 仓库(仓库名,管理员,物品名,数量) 属于哪一级范式?
答:已知函数依赖集:仓库名 → 管理员,管理员 → 仓库名,(仓库名,物品名)→ 数量 码:(管理员,物品名),(仓库名,物品名) 主属性:仓库名、管理员、物品名 非主属性:数量 ∵ 不存在非主属性对码的部分函数依赖和传递函数依赖。∴ 此关系模式属于3NF。
基于此关系模式的关系(具体的数据)可能如图所示:
好,既然此关系模式已经属于了 3NF,那么这个关系模式是否存在问题呢?我们来看以下几种操作: 先新增加一个仓库,但尚未存放任何物品,是否可以为该仓库指派管理员?——不可以,因为物品名也是主属性,根据实体完整性的要求,主属性不能为空。 某仓库被清空后,需要删除所有与这个仓库相关的物品存放记录,会带来什么问题?——仓库本身与管理员的信息也被随之删除了。 如果某仓库更换了管理员,会带来什么问题?——这个仓库有几条物品存放记录,就要修改多少次管理员信息。 从这里我们可以得出结论,在某些特殊情况下,即使关系模式符合 3NF 的要求,仍然存在着插入异常,修改异常与删除异常的问题,仍然不是 ”好“ 的设计。
造成此问题的原因:存在着主属性对于码的部分函数依赖与传递函数依赖。(在此例中就是存在主属性【仓库名】对于码【(管理员,物品名)】的部分函数依赖。
解决办法就是要在 3NF 的基础上消除主属性对于码的部分与传递函数依赖。
仓库(仓库名,管理员) 库存(仓库名,物品名,数量)
这样,之前的插入异常,修改异常与删除异常的问题就被解决了。