相关概念
函数依赖
这里我纯白话解释了,纯概念去百度查。
我们设 R(U) 是属性集合 U 的一个关系模式,可以理解为一张表就算关系 R,里面的属性的集合就是 U。
其中 U = {学号,姓名,年龄,身份证号,系名,系位置,课号,成绩}。
名词 | 概念解释 | 示例(基于属性集合 U) |
函数依赖 | 通过属性(组) A 必能得出属性(组) B,就可以说 B 依赖于 A,用 A→B 表示。 | 学号→{姓名,年龄} |
完全函数依赖 | 通过{A,B}能得出C,但是A 或 B单独得不出C,则 C 完全依赖于{A,B}。 | {学号,课号}→成绩,学号或课号单独无法确定成绩。 |
部分函数依赖 | 通过{A,B}能得出C,A 或 B单独也能得出C,则 C 部分依赖于{A,B}。 | {学号,身份证号}→姓名,学号或身份号单独也能确定姓名 |
传递函数依赖 | 通过 A 得出 B,通过B 得出 C,但是 C 得不到B,B 得不到 A,则 C 传递依赖于 A。 | 学号→系名,系名→系位置,但是反过来无法得出。 |
码的相关概念
名词 | 说明 |
元组 | 二维表的每行数据,就是一个元组,每列就是一个属性。 |
数据库码 | |
候选码 | 如果关系中的某一属性(组)的值能唯一地标识一个元组,则称该属性组为候选码。 |
主码 | 就主键,一个关系中有多个候选码,选定其中一个为主码。 |
外码 | 就是外键。一个关系中的一个属性是另外一个关系中的主码则这个属性为外码。 |
主属性 | 候选码中的属性称为主属性。 |
非主属性 | 不包含在任何候选码中的属性称为非主属性。 |
实体的完整性 | 每个数据表都必须有主键,而作为主键的所有字段,其属性必须是唯一且非空。 |
约束类型 | 主键约束、唯一约束、自动增长列 |
第一范式(1NF)
【概述】
确保每列保证原子性,保证这个属性(字段)不能在被分割。
【示例】
下表中院系可以分割为系名和位置,故该设计不符合第一范式。
系号 | 院系 | 老师 |
X001 | 计算机系在逸夫楼 | 图灵 |
X002 | 金融系在尚贤楼 | 巴菲特 |
应修改为:
系号 | 系名 | 位置 | 老师 |
X001 | 计算机系 | 逸夫楼 | 图灵 |
X002 | 金融系 | 尚贤楼 | 巴菲特 |
第二范式(2NF)
【概述】
在第一范式的基础上,消除了非主属性对于主键的部分函数依赖,也就是说非主属性必须完全依赖于主键,一般针对多字段组成的主键才会违反该范式。
【示例】
下表已满足第一范式,主键只能是{学号,课程号},其他的字段都是非主属性。其中{学号,课程号}→姓名,并且学号→姓名,这就构成了姓名部分依赖于{学号,课程号},故违反第二范式。
学号 | 姓名 | 院系 | 年龄 | 课程号 | 课程名 | 学分 |
S001 | 张三 | 计算机 | 20 | K001 | 4 | |
S002 | 李四 | 物理 | 22 | K002 | 光学 | 2 |
应进行拆分两张表:
学生表 | 课程表 | ||||||
学号 | 姓名 | 院系 | 年龄 | 课程号 | 课程名 | 学分 | |
S001 | 张三 | 计算机 | 20 | K001 | 4 | ||
S002 | 李四 | 物理 | 22 | K002 | 光学 | 2 |
第三范式(3NF)
【概述】
第三范式在第二范式的基础之上,消除了非主属性对于候选码的传递函数依赖
。就是说非主属性之间不能有依赖关系,它们是互相独立的。
【示例】
下表已满足第二范式,主键是学号。其他字段都是非主属性,均完全依赖于主键,都能直接通过主键获取。但是,这里存在传递依赖关系为,学号→专业编码→专业名称/专业位置。其中,专业编码、专业名称、专业位置之间存在依赖关系,故违反第三范式。
学号 | 姓名 | 年龄 | 专业编码 | 专业名称 | 专业位置 |
S001 | 张三 | 20 | J001 | 计算机 | 逸夫楼 |
S002 | 李四 | 22 | W001 | 物理 | 尚贤楼 |
应拆分为:
学生表 | 专业表 | ||||||
学号 | 姓名 | 年龄 | 专业编码 | 专业编码 | 专业名称 | 专业位置 | |
S001 | 张三 | 20 | J001 | J001 | 计算机 | 逸夫楼 | |
S002 | 李四 | 22 | W001 | W001 | 物理 | 尚贤楼 |
反范式
有时候我们想要对查询效率进行优化,反范式化也是一种优化思路,我们可以通过在数据表中增加冗余字段来提高数据库的读性能。
比如我们才独去员工表时,经常需要获取该员工的部门名称,根据三范式,员工表中只要存储员工的部门编码就好,这样我们就需要频繁的联表查询,效率会低。这时冗余部门名称字段就可以减少频繁的联表查询。
BC范式
【概述】
BC范式(BCNF):对于关系模式R,若 R为第一范式,且每个属性都不是部分依赖于候选键也不是传递依赖于候选键,则R称之为BC范式。
也可理解为在第三范式的基础上,进一步消除了主属性对候选码的部分函数依赖和传递函数依赖。
什么意思呢?就是说表中的候选码不止主键一个,出现了其他字段,这时候就出现主属性部分依赖于候选键,违反 BC 范式,造成造成了字段冗余。
【示例】
例如,关系模式STJ(S,T,J)中,S表示学生,T表示老师,J表示课程。其中,每一个老师只教一门课程,每门课程有一个老师,某个学生选修某个教师的课就确定了所选课的名称。
候选码:(S,J)、(S,T)
函数依赖:(S,J)→T,(S,T)→J,T→J;
主属性:学生、老师、课程;
非主属性:无。
因为没有任何非主属性对码传递依赖或部分依赖,故STJ是3NF,但T是决定因素而T不包含码,故STJ不是BCNF关系。