1NF和2NF都是关系型数据库中的范式。其中,1NF是第一范式,2NF是第二范式。
第一范式(1NF)
第一范式是指关系型数据库中的表中每一个字段都是原子性的,即不可再分解。也就是说,表中的每个字段只能存储单个值,不能存储多个值。
例如,下面这样的表不符合1NF:
学号 | 课程 | 成绩 |
---|---|---|
001 | 数学,英语 | 80,85 |
可以看到,上述表中的“课程”和“成绩”字段都存储了多个值,违反了1NF。正确的做法应该是将其拆分成两张表:
学生表(student)
学号 | 姓名 |
---|---|
001 | 张三 |
成绩表(score)
学号 | 课程 | 成绩 |
---|---|---|
001 | 数学 | 80 |
001 | 英语 | 85 |
这样就符合1NF的要求了。
第二范式(2NF)
第二范式是基于1NF的基础之上的。它要求关系型数据库中的表必须满足以下两个要求:
- 数据表中的每个非主键字段必须完全依赖于主键;
- 数据表中的每个非主键字段不能只依赖于主键中的部分字段。
为了说明2NF的要求,我们来看一下以下的一个表:
订单表(order)
订单号 | 客户名 | 产品名称 | 数量 | 单价 |
---|---|---|---|---|
20180101 | 张三 | 手机 | 2 | 3000 |
20180101 | 张三 | 电脑 | 1 | 6000 |
20180102 | 李四 | 电视 | 1 | 5000 |
20180102 | 李四 | 空调 | 1 | 4000 |
上述表的主键为“订单号”。可以看到,在该表中,“产品名称”和“单价”字段都与主键“订单号”相关,因此符合第一范式的要求。但是,“客户名”字段只与主键中的一部分“订单号”相关,而不是完全依赖于主键“订单号”,因此不符合2NF的要求。
正确的做法是将其拆分成两张表:
订单表(order)
订单号 | 客户名 |
---|---|
20180101 | 张三 |
20180102 | 李四 |
订单明细表(order_detail)
订单号 | 产品名称 | 数量 | 单价 |
---|---|---|---|
20180101 | 手机 | 2 | 3000 |
20180101 | 电脑 | 1 | 6000 |
20180102 | 电视 | 1 | 5000 |
20180102 | 空调 | 1 | 4000 |
这样就符合2NF的要求了。
综上所述,1NF和2NF都是关系型数据库中的范式,是为了保证数据库中数据的完整性、一致性和可靠性而设置的。1NF要求数据表中的每个字段都是原子性的,而2NF则要求非主键字段完全依赖于主键,且不能只依赖于主键中的一部分字段。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:DBMS中1NF和2NF的区别 - Python技术站