📜  DBMS中1NF和2NF的区别(1)

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

DBMS中1NF和2NF的区别

在设计数据库时,我们需要遵循一定的规范,以保证数据的完整性和一致性。其中1NF和2NF是两个重要的规范,下面我们来具体了解一下它们的区别。

1NF(第一范式)

1NF要求表中的所有列都是不可分割的原子值,也就是说每一列只能有一个值。如果一列中有多个值,就需要将其拆分成多个列,以保证每个列都只有一个值。

例如,我们有一个表格记录员工的出生日期和聘用日期:

| 员工编号 | 员工姓名 | 出生日期 | 聘用日期 | | -------- | -------- | ------------ | ------------ | | 01 | 张三 | 1990-01-01 | 2015-01-01 | | 02 | 李四 | 1988-05-06 | 2016-01-01 |

从上表中可以看出,出生日期和聘用日期列中包含了多个值。因此,我们需要将其拆分成两个单独的列:

| 员工编号 | 员工姓名 | 出生年份 | 出生月份 | 出生日 | 聘用年份 | 聘用月份 | 聘用日 | | -------- | -------- | -------- | -------- | ------ | -------- | -------- | ------ | | 01 | 张三 | 1990 | 1 | 1 | 2015 | 1 | 1 | | 02 | 李四 | 1988 | 5 | 6 | 2016 | 1 | 1 |

这样就符合了1NF的要求。

2NF(第二范式)

2NF要求表中的所有非主属性都必须完全依赖于候选键,也就是说,一个表中应该只记录一种事物,而不是多种事物混杂在一起。

例如,我们有一个学生选课表:

| 学生编号 | 学生姓名 | 课程编号 | 课程名称 | 课程教师 | 职称 | | -------- | -------- | -------- | -------- | -------- | -------- | | 001 | 张三 | 001 | 数据库 | 王老师 | 讲师 | | 002 | 李四 | 002 | Java | 李老师 | 助教 | | 003 | 王五 | 001 | 数据库 | 王老师 | 讲师 | | 004 | 赵六 | 003 | 数据结构 | 张老师 | 教授 |

上表中,课程编号和学生编号组成了候选键,而课程名称、课程教师和职称都是非主属性。注意到课程名称、课程教师和职称都完全依赖于课程编号,而不完全依赖于学生编号。因此,我们需要将课程相关的信息拆分成一个单独的表:

| 课程编号 | 课程名称 | 课程教师 | 职称 | | -------- | -------- | -------- | -------- | | 001 | 数据库 | 王老师 | 讲师 | | 002 | Java | 李老师 | 助教 | | 003 | 数据结构 | 张老师 | 教授 |

然后再将学生编号和课程编号以及选课时间等信息拆分成一个单独的表:

| 学生编号 | 课程编号 | 选课时间 | | -------- | -------- | -------- | | 001 | 001 | 2022-01-01 | | 002 | 002 | 2022-01-01 | | 003 | 001 | 2022-01-01 | | 004 | 003 | 2022-01-01 |

这样就符合了2NF的要求。

总体来说,1NF是保证每一列都只有一个值,2NF是保证一个表只记录一种事物,这两个范式是数据库设计的基础。在实际开发中,我们需要根据具体的业务场景来设计数据库,并且还需要注意数据库的性能和效率问题。