文章目录
- 1.函数依赖:
- 1.0.前提范例:
- 1.1.函数依赖定义:
- 1.2. 部分依赖
- 1.3. 完全依赖
- 2.范式
- 2.1. 码、候选码、主码
- 2.2.主属性和非主属性
- 2.3.第一范式(1NF)
- 2.4.第二范式(2NF)
- 2.5.第三范式(3NF)
- 2.6.BC范式(BCNF)
- 3.函数依赖推导规则(todo,没看懂)
1.函数依赖:
1.0.前提范例:
教育局管理系统中学生表:
学生表(学生id,身份证号,姓名,性别,学号,学校id,学校名称)
学生id,可以唯一确定一条学生信息;
身份证号,可以唯一确定一条学生信息;
学号+学校id,可以唯一确定一条学生信息(同一学校内的学号是唯一的);
1.1.函数依赖定义:
函数 y = f(m),如果每个x都有唯一y值与之对应,
那么称:m决定y,或y依赖于m,
写作:m -> y,画作:
例如:
1.函数 :y = m2,每个m取值,y都有唯一值与之对应,所以:
m决定 y 或 y 依赖于 m, 记做: m -> y。
2. 对应0.全局例子中:学生id -> 姓名(姓名依赖于学生id),身份证号->姓名
1.2. 部分依赖
对于1.1.函数依赖定义中:单独一个m,就可以唯一确定y的值,那么用另一个无关变量n和m的组合值,必定也可以唯一确定y的值。
那么称:(m,n)决定y,或y部分依赖于m,
写作:(m,n) -> y,画作:
例如:
1.函数 :y = m2,每个m取值,y都有唯一值与之对应,此时还有另一个函数 z = n2,那么每个唯一的m和n,y也有唯一值与之对应,所以:
(m,n)决定 y 或 y 部分依赖于(m,n), 记做: (m,n) -> y。
2. 对应0.全局例子中:(身份证号,性别) -> 姓名(姓名部分依赖于身份证号和性别)
1.3. 完全依赖
函数 y = f(m,n),如果确定的m和n,都有唯一y值与之对应,
那么称:(m,n)决定y,或y完全依赖于(m,n),
写作:(m,n) -> y ,画作:
例如:
1.函数 :y = m2+n2,单独一个m或n的值,不能唯一确定y的值,但是(m,n)的组合值可以唯一确定y的值。
(m,n) 决定 y 或 y 完全依赖于 (m,n), 记做: (m,n) -> y。
2. 对应0.全局例子中:(学校id,学号) -> 姓名(姓名部分完全于学校id和学号)。
2.范式
2.1. 码、候选码、主码
码、候选码、主码的说明
对应在数据库中的每一条数据中:
码:能唯一确定一条数据的一个属性或一组属性(可以包含冗余属性);
候选码:能唯一确定一条数据的一个属性或一组属性(消除冗余属性);
主码:主码是唯一的,从候选码中选出一个作为主码;
2.2.主属性和非主属性
主属性:在候选码中的属性;
非主属性:不在候选码中的属性;
2.3.第一范式(1NF)
每个属性都是不可分割的原子值;
2.4.第二范式(2NF)
消除非主属性对候选键的部分依赖;
学生表(学生id,身份证号,姓名,性别,学号,学校id,学校名称)
问题:学生表中,(学校id,学号)是一个候选键,但是 ,学校名称部份依赖(学校id,学号),所以就不符合2NF。
解决方法:把(学校id,学校名称)单独抽取成一个学校表,就符合2NF了。
学生表(学生id,身份证号,姓名,性别,学号,学校id)
学校表(学校id,学校名称)
2.5.第三范式(3NF)
消除非主属性对候选键的传递依赖
学生表(学生id,姓名,性别,学校id,学校名称)
问题:学生表中,学生id 是一个候选键,有学校姓名 传递依赖 学生id,不符合3NF
学生id-> 学校id (学校id 依赖 学生id)
学校id -> 学校名称 (学校姓名 依赖 学校id)
所以: 学校姓名 传递依赖 学生id
解决方法:把(学校id,学校名称)单独抽取成一个学校表,就符合3NF了。
学生表(学生id,姓名,性别,学校id)
学校表(学校id,学校名称)
2.6.BC范式(BCNF)
消除主属性对候选键的传递依赖(列出关系中所有的函数依赖,依赖左侧都是候选键)