1. 数据库相关笔记①
  2. 数据库相关笔记②
  3. 数据库相关笔记③
  4. 数据库相关笔记④

闭包 Closure

例如,假设我们有以下函数依赖性:

A -> B
B -> C
那么,属性集合 {A} 的闭包就是 {A, B, C},因为 A 可以决定 B,B 可以决定 C。

闭包的概念在数据库设计(特别是在进行范式分解)中非常重要,因为它可以帮助我们理解和使用函数依赖性。

范式

1NF (第一范式)

第一范式要求数据库表的每一列都是不可分割的原子数据项。换句话说,每一列都应该是最小的数据单位,不能再被分割。

例如,一个违反第一范式的表可能如下:

ID Name
1 张三, 李四

在这个例子中,“Name” 列包含了两个名字,违反了第一范式。应该将其分割为两行:

ID Name
1 张三
2 李四

2NF (第二范式)

第二范式要求数据库表满足第一范式的基础上,非主键列完全依赖于主键(如果主键是组合键,则必须完全依赖于整个组合键)。

例如,一个违反第二范式的表可能如下:

ID Course Teacher
1 Math 张三
1 English 李四

在这个例子中,“Teacher” 列只依赖于 “Course” 列,而不是整个主键 “ID, Course”,违反了第二范式。应该将其分割为两个表:

学生表:

ID Course
1 Math
1 English

课程表:

Course Teacher
Math 张三
English 李四

3NF (第三范式)

第三范式要求数据库表满足第二范式的基础上,非主键列必须直接依赖于主键,不能存在传递依赖。

例如,一个违反第三范式的表可能如下:

ID Course Teacher Teacher_Age
1 Math 张三 40
2 English 李四 35

在这个例子中,“Teacher_Age” 列依赖于 “Teacher” 列,存在传递依赖,违反了第三范式。应该将其分割为两个表:

学生表:

ID Course Teacher
1 Math 张三
2 English 李四

教师表:

Teacher Age
张三 40
李四 35

BCNF (博伊斯-科德第四范式)

BCNF 要求数据库表满足第三范式的基础上,对任何的决定因素 X,X 必须是候选键。

例如,一个违反 BCNF 的表可能如下:

ID Course Teacher
1 Math 张三
2 Math 李四

在这个例子中,“Teacher” 列是 “Course” 列的决定因素,但 “Course” 列不是候选键,违反了 BCNF。应该将其分割为两个表:

学生表:

ID Course
1 Math
2 Math

教师表:

Course Teacher
Math 张三
Math 李四

4NF (第四范式)

第四范式要求数据库表满足 BCNF 的基础上,表中不能存在多值依赖。

例如,一个违反第四范式的表可能如下:

ID Course Hobby
1 Math Reading
1 Math Swimming

在这个例子中,“Course” 和 “Hobby” 列存在多值依赖,违反了第四范式。应该将其分割为两个表:

学生表:

ID Course
1 Math

兴趣表:

ID Hobby
1 Reading
1 Swimming