目录
基础知识
(相关资料图)
函数依赖
1NF 第一范式
2NF 第二范式
3NF 第三范式
BCNF 鲍依斯-科得范式
四种范氏之间的关系
基础知识
实体:现实世界中客观存在并可以被区别的事物。比如“一个学生”、“一本书”、“一门课”等等。值得强调的是这里所说的“事物”不仅仅是看得见摸得着的“东西”,它也可以是虚拟的,比如说“老师与学校的关系”。
属性:教科书上解释为:“实体所具有的某一特性”,由此可见,属性一开始是个逻辑概念,比如说,“性别”是“人”的一个属性。在关系数据库中,属性又是个物理概念,属性可以看作是“表的一列”。
元组:表中的一行就是一个元组。
分量:元组的某个属性值。在一个关系数据库中,它是一个操作原子,即关系数据库在做任何操作的时候,属性是“不可分的”。否则就不是关系数据库了。
码:表中可以唯一确定一个元组的某个属性(或者属性组),如果这样的码有不止一个,那么大家都叫候选码,我们从候选码中挑一个出来做老大,它就叫主码。
全码:如果一个码包含了所有的属性,这个码就是全码。
主属性:一个属性只要在任何一个候选码中出现过,这个属性就是主属性。
非主属性:与上面相反,没有在任何候选码中出现过,这个属性就是非主属性。
外码:一个属性(或属性组),它不是码,但是它别的表的码,它就是外码。
函数依赖
部分函数依赖:设X,Y是关系R的两个属性集合,存在X→Y,若X’是X的真子集,存在X’→Y,则称Y部分函数依赖于X。
举个例子:
码用(学号+课程),为什么要加课程呢?因为不同课程成绩是通过学号查不出来的。
不过用(学号+课程)当作码是不是有些问题?
(学号+课程)->姓名,但是学号->姓名
(学号+课程)->系名,但是学号->系名
(学号+课程)->系主任,但是学号->系主任
这个就是部分依赖,说实话我看定义一脸懵逼。
要是上面那张表符合第二范式。需要将表拆分为两张表。
一张是 学号、课程、分数表
另外一张是 学号、姓名、系名、系主任表
完全函数依赖:设X,Y是关系R的两个属性集合,X’是X的真子集,存在X→Y,但对每一个X’都有X’!→Y,则称Y完全函数依赖于X。
例子:学生基本信息表R(学号,班级,姓名)假设不同的班级学号有相同的,班级内学号不能相同,在R关系中,(学号,班级)->(姓名),但是(学号)->(姓名)不成立,(班级)->(姓名)不成立,所以姓名完全函数依赖与(学号,班级);
传递函数依赖:设X,Y,Z是关系R中互不相同的属性集合,存在X→Y(Y !→X),Y→Z,则称Z传递函数依赖于X。
例子:在关系R(学号 ,宿舍, 费用)中,(学号)->(宿舍),宿舍!=学号,(宿舍)->(费用),费用!=宿舍,所以符合传递函数的要求;
1NF 第一范式
数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。
定义:如果一个关系模式R的所有属性都是不可分的基本数据项,则R属于1NF。
也可表述为:数据库表中的字段都是单一属性的,不可再分。
例如,下面的数据库表是符合第一范式的:
字段1 字段2 字段3 字段4
而这样的数据库表是不符合第一范式的:
字段1 字段2 字段3 字段4
字段3.1 字段3.2
具体的例子:
比如“地址”属性应该拆分为“城市”、“区县”、“具体地址”便于使用。
很显然,在当前的任何关系数据库管理系统(DBMS)中,谁也不可能做出不符合第一范式的数据库,因为这些DBMS不允许你把数据库表的一列再分成二列或多列。因此,想在现有的DBMS中设计出不符合第一范式的数据库都是不可能的。
2NF 第二范式
若关系模式R∈1NF,并且每一个非主属性都完全函数依赖于R的码(多个主属性字段的组合),则R∈2NF
也可表述为:数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖(部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况),也即所有非关键字段都完全依赖于任意一组候选关键字。
具体的可以参照上面部分函数依赖的例子
3NF 第三范式
关系模式R<U< em="">,F> 中若不存在这样的码X、属性组Y及非主属性Z(Z ÍY), 使得X→Y,Y→Z,成立,则称R<U< em="">,F> ∈ 3NF。
也可表述为:在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。所谓传递函数依赖,指的是如果存在"A → B → C"的决定关系,则C传递函数依赖于A。因此,满足第三范式的数据库表应该不存在如下依赖关系:关键字段 → 非关键字段x → 非关键字段y
比如:
BCNF 鲍依斯-科得范式
设关系模式R<U< em="">,F>∈1NF,如果对于R的每个函数依赖X→Y,若Y不属于X,则X必含有候选码,那么R∈BCNF。
也可表述为:在第三范式的基础上,数据库表中如果不存在任何字段对任一候选关键字段的传递函数依赖则符合第三范式。
比如:仓库管理关系表为(仓库ID, 存储物品ID, 管理员ID, 数量),且有一个管理员只在一个仓库工作;一个仓库可以存储多种物品。这个数据库表中存在如下决定关系:
(仓库ID, 存储物品ID) →(管理员ID, 数量)
(管理员ID, 存储物品ID) → (仓库ID, 数量)
所以,(仓库ID, 存储物品ID)和(管理员ID, 存储物品ID)都是表的候选关键字,表中的唯一非关键字段为数量,它是符合第三范式的。但是,由于存在如下决定关系:
(仓库ID) → (管理员ID)
(管理员ID) → (仓库ID)
即存在关键字段决定关键字段的情况,所以其不符合BCNF范式。数据表应修改为:
仓库管理:(仓库ID, 管理员ID);
仓库:(仓库ID, 存储物品ID, 数量)。
四种范氏之间的关系
每一个范氏都是进一步约束的关系,如下图:
四种范式之间的关系