范式

67°C 04-01-2025 notbyai
最近更新于:2025-03-16 11:19:44

在数据库设计中,范式(Normal Forms, NFs)是一种用于规范化数据库结构的理论,用以消除数据冗余、提高数据一致性,同时减少异常问题。范式的核心思想是将数据划分成更小、更独立的表,并通过关系(外键)进行连接。

1. 第一范式(1NF)

目标:确保每列的值是原子值。

  • 要求:
    • 数据库表中的每一列只包含单一值(原子性)。
    • 不允许一列存储多个值(如数组、列表等),也不允许嵌套表。
  • 示例:不符合1NF
学生ID姓名联系方式
1张三12345, 67890
2李四98765

上述表中“联系方式”列包含了多个值,因此不符合1NF。

  • 改进(符合1NF)
学生ID姓名联系方式
1张三12345
1张三67890
2李四98765

2. 第二范式(2NF)

目标:消除非主属性对主键的部分依赖。

  • 要求:
    • 满足1NF。
    • 表中的每一个非主属性必须完全依赖于主键,而不能只依赖于主键的一部分(解决部分依赖)。
  • 示例:不符合2NF
学生ID课程ID课程名称成绩
1C001数学90
1C002英语85

假设主键是(学生ID, 课程ID)的组合,“课程名称”只依赖于课程ID,而不是组合主键,因此违反2NF。

  • 改进(分表,符合2NF)

课程表:

课程ID课程名称
C001数学
C002英语

成绩表:

学生ID课程ID成绩
1C00190
1C00285

3. 第三范式(3NF)

目标:消除非主属性之间的传递依赖。

  • 要求:
    • 满足2NF。
    • 非主属性之间不存在传递依赖(即非主属性不能依赖于另一个非主属性)。
  • 示例:不符合3NF
学生ID系ID系名称
1CS001计算机系
2EE002电气工程系

在此表中,“系名称”依赖于“系ID”,“系ID”又依赖于主键“学生ID”,这是一种传递依赖。

  • 改进(分表,符合3NF)

学生表:

学生ID系ID
1CS001
2EE002

系表:

系ID系名称
CS001计算机系
EE002电气工程系

4. BC范式(BCNF,Boyce-Codd Normal Form)

目标:消除主属性间的依赖关系。

  • 要求:
    • 满足3NF。
    • 对于每一个函数依赖 X → Y , X 必须是超键。(超键是一个或多个属性的组合,这些属性的值可以唯一地标识表中的每一行记录。换句话说,一个超键中的值是足够独特的,它能够用来区分表中的任意两条记录。)
  • 示例:不符合BCNF
教师ID课程名称教师
T001数学R101
T002英语R102

假设(教师ID, 课程名称)为主键,“教室”依赖于“课程名称”,“课程名称”不是超键,因此违反BCNF。

  • 改进(分表)

课程表:

课程名称教室
数学R101
英语R102

教师课程表:

教师ID课程名称
T001数学
T002英语

5. 第四范式(4NF)

目标:消除多值依赖。

  • 要求:
    • 满足BCNF。
    • 表中不能存在非主属性的多值依赖。
  • 示例:不符合4NF
学生ID语言爱好
1英语篮球
1英语足球
1法语篮球
1法语足球

上述表中,“语言”和“爱好”是独立的多值属性,存在多值依赖。

  • 改进(分表)

学生语言表:

学生ID语言
1英语
1法语

学生爱好表:

学生ID爱好
1篮球
1足球

6. 第五范式(5NF)

目标:消除连接依赖。

  • 要求:
    • 满足4NF。
    • 表中每一个关系都应该能够通过其更小的关系表连接复原(避免连接依赖)。

总结:

范式目标主要特点
1NF消除重复组,保证每列值原子性每列只存储单一值
2NF消除部分依赖,非主属性完全依赖主键必须完全依赖主键,不允许部分依赖
3NF消除传递依赖,非主属性只依赖主键非主属性之间不能存在依赖关系
BCNF消除主属性间依赖,所有函数依赖的决定因素为超键更严格的3NF
4NF消除多值依赖,每个关系只存储一个独立主题解决多值属性独立的问题
5NF消除连接依赖,确保关系可以通过小表复原对复杂表分解到极致

评论留言

欢迎您,!您可以在这里畅言您的的观点与见解!

0 条评论