📜  DBMS规范化:1NF,2NF,3NF和BCNF的示例(1)

📅  最后修改于: 2023-12-03 15:00:22.635000             🧑  作者: Mango

DBMS规范化:1NF,2NF,3NF和BCNF的示例

在关系型数据库中,规范化是一种重要的技术,它可以帮助我们设计出结构良好、高效、易于维护的数据库。常见的规范化级别包括1NF、2NF、3NF和BCNF。

1NF

1NF是指一个表中的每个属性都是原子的,即不可再分的。如果存在复合属性,需要将其拆分成多个独立的属性。以下是一个未达到1NF的表:

| 学生编号 | 姓名 | 联系方式 | | -------- | ---- | ------------- | | 001 | 张三 | 010-12345678 | | 002 | 李四 | 010-1234-5678 |

可以看到,联系方式包含多个信息,需要进行拆分:

| 学生编号 | 姓名 | 电话区号 | 电话号码 | | -------- | ---- | --------- | ---------- | | 001 | 张三 | 010 | 12345678 | | 002 | 李四 | 010 | 1234-5678 |

现在,每个属性都是原子的,符合1NF的要求。

2NF

2NF是在1NF的基础上,进一步要求每个非主属性只依赖于主键,而不是依赖于主键的一部分。以下是一个未达到2NF的表:

| 课程编号 | 学生编号 | 学生姓名 | 成绩 | | -------- | -------- | ----------- | ---- | | 001 | 001 | 张三 | 90 | | 001 | 002 | 李四 | 80 | | 002 | 001 | 张三 | 95 | | 002 | 002 | 李四 | 85 | | 002 | 003 | 王五 | 70 |

可以看到,课程编号和学生编号组成了主键,但是学生姓名与学生编号不是直接依赖于主键,而是间接依赖于主键中的课程编号。因此,需要将其拆分成两个表:

  • 学生表:

| 学生编号 | 学生姓名 | | -------- | -------- | | 001 | 张三 | | 002 | 李四 | | 003 | 王五 |

  • 选课表:

| 课程编号 | 学生编号 | 成绩 | | -------- | -------- | ---- | | 001 | 001 | 90 | | 001 | 002 | 80 | | 002 | 001 | 95 | | 002 | 002 | 85 | | 002 | 003 | 70 |

可以看到,在选课表中,学生姓名已经被去除,每个非主属性都只依赖于主键中的完整信息,满足2NF的要求。

3NF

3NF是在2NF的基础上,要求每个非主属性不依赖于其他非主属性,即非传递依赖。以下是一个未达到3NF的表:

| 员工编号 | 员工姓名 | 部门名称 | 部门负责人 | | -------- | -------- | -------- | ---------- | | 001 | 张三 | 政治部 | 李四 | | 002 | 李四 | 人事部 | 王五 | | 003 | 王五 | 核心部 | 张三 |

其中,部门负责人的信息并不直接依赖于员工编号,而是和部门名称相关。因此,需要将其拆分成两个表:

  • 员工表:

| 员工编号 | 员工姓名 | 部门编号 | | -------- | -------- | -------- | | 001 | 张三 | 001 | | 002 | 李四 | 002 | | 003 | 王五 | 003 |

  • 部门表:

| 部门编号 | 部门名称 | 部门负责人 | | -------- | ---------- | ---------- | | 001 | 政治部 | 002 | | 002 | 人事部 | 003 | | 003 | 核心部 | 001 |

可以看到,在部门表中,部门负责人不再依赖于员工编号,而是直接依赖于部门编号,达到了3NF的要求。

BCNF

BCNF是在3NF的基础上,进一步要求每个非主属性都和主键有完全依赖关系。以下是一个未达到BCNF的表:

| 订单编号 | 商品编号 | 商品名称 | 商品单价 | 订单数量 | | -------- | -------- | ---------- | -------- | -------- | | 001 | 001 | 苹果 | 5.0 | 2 | | 001 | 002 | 香蕉 | 3.0 | 3 | | 002 | 001 | 苹果 | 5.0 | 4 | | 002 | 003 | 葡萄 | 6.0 | 1 |

可以看到,商品名称和商品单价都和商品编号有关系,因此存在依赖的冗余。需要将其拆分成两个表:

  • 商品表:

| 商品编号 | 商品名称 | 商品单价 | | -------- | -------- | -------- | | 001 | 苹果 | 5.0 | | 002 | 香蕉 | 3.0 | | 003 | 葡萄 | 6.0 |

  • 订单表:

| 订单编号 | 商品编号 | 订单数量 | | -------- | -------- | -------- | | 001 | 001 | 2 | | 001 | 002 | 3 | | 002 | 001 | 4 | | 002 | 003 | 1 |

现在,每个非主属性都和主键有完全依赖关系,达到了BCNF的要求。

综上所述,规范化是设计关系型数据库的一个重要步骤,通过将不符合规范化要求的表进行拆分,可以设计出结构良好、高效、易于维护的数据库。