数据库范式

第一范式 (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的成立