数据库范式
第一范式 (1NF)
描述:确保每个字段都是原子值,不能有重复组或多值属性
正例:
| 学生ID | 学生姓名 | 课程 |
|--------|----------|--------|
| 1 | Alice | 数学 |
| 1 | Alice | 科学 |
反例:
| 学生ID | 学生姓名 | 课程 |
|--------|----------|--------------|
| 1 | Alice | 数学, 科学 |
问题分析
- 问题:
课程
字段包含多个值(数学
和科学
)。 - 原因:在1NF中,每个字段必须是原子值,不能包含重复或多值。
第二范式 (2NF)
-
描述:在满足1NF的基础上,消除部分依赖。所有非主属性必须完全直接依赖于主键(单个主键或者多列复合主键),即使存在间接依赖。
-
正例
| 学生ID | 课程 | 教师 | |--------|--------|-----------| | 1 | 数学 | Mr. Smith | | 1 | 科学 | Ms. Johnson |
-
反例
| 学生ID | 课程 | 教师 | 学生姓名 | |--------|--------|-----------|----------| | 1 | 数学 | Mr. Smith | Alice | | 1 | 科学 | Ms. Johnson | Alice |
问题分析
- 问题:
学生姓名
只依赖于学生ID
,而不是整个主键(学生ID
和课程
的组合)。 - 原因:在2NF中,所有非主属性必须完全依赖于主键,而不是主键的一部分。
第三范式 (3NF)
-
描述:在满足2NF的基础上,消除传递依赖。非主属性不能依赖于其他非主属性。
-
正例
| 学生ID | 课程 | 教师ID | |--------|--------|--------| | 1 | 数学 | 101 | | 1 | 科学 | 102 |
-
反例
| 学生ID | 课程 | 教师 | 教师办公室 | |--------|--------|-----------|------------| | 1 | 数学 | Mr. Smith | A101 | | 1 | 科学 | Ms. Johnson | B202 |
存在两个非主属性,教师和教师办公室, 教师办公室依赖于教师
问题分析
-
问题:
教师办公室
依赖于教师
,而不是直接依赖于主键(学生ID
和课程
的组合)。- 原因:在3NF中,非主属性不能依赖于其他非主属性。
第四范式 (4NF)
-
描述:在满足3NF的基础上,消除多值依赖。一个属性集的值不应影响其他属性集的值。
-
正例
| 学生ID | 课程 | |--------|--------| | 1 | 数学 | | 1 | 科学 | | 学生ID | 俱乐部 | |--------|------------| | 1 | 科学俱乐部 | | 1 | 体育俱乐部 |
-
反例
| 学生ID | 课程 | 俱乐部 | |--------|--------|------------| | 1 | 数学 | 科学俱乐部 | | 1 | 科学 | 体育俱乐部 |
问题分析
- 问题:同一学生的课程和俱乐部信息混在一个表中,造成多值依赖。
- 原因:在4NF中,一个属性集的值不应影响其他属性集的值。
直接依赖和间接依赖
直接依赖:这是我们关注的主要内容。如果所有非主属性直接依赖于主键,就满足2NF
间接依赖:指的是一个非主属性依赖于另一个非主属性,而这个非主属性又依赖于主键。比如薪资依赖于岗位,岗位依赖于教师号
部分依赖: 对于复合主键(由字段A和字段B组成)的关系, 某些属性依赖于A, 某些依赖于A、B
举个例子
- 假设有一个关系模式:
- 主键:
教师号
- 属性:
教师号 → 姓名, 部门号, 岗位
- 间接依赖:
岗位 → 薪资
- 主键:
在这个例子中:
姓名
、部门号
、岗位
完全依赖于教师号
,这是直接依赖。薪资
依赖于岗位
(间接依赖),但这并不妨碍教师号
完全确定其他属性。
结论
若主键能完全推导出所有非主属性,且不存在部分依赖,则满足2NF。间接依赖没关系的,不影响2NF的成立