数据库的**三范式(3NF,Third Normal Form)**是数据库设计中的一套规范,旨在减少数据冗余,提高数据一致性。以下是三范式的详细介绍:
第一范式(1NF,First Normal Form)
要求:
- 数据原子性(列不可再分):每一列的值必须是最小单位,不可再拆分。
- 同一列中的数据类型相同:例如,不能在
phone_number
列中同时存放电话号码和电子邮件地址。 - 表中必须有主键:每一行数据必须有一个唯一标识(主键)。
示例(不符合 1NF)
学号 | 姓名 | 电话号码 |
---|---|---|
1001 | 张三 | 13812345678, 13998765432 |
问题:
- 电话号码字段存储了多个电话号码,违反了原子性,应该拆分成单独的行或单独的表。
符合 1NF
学号 | 姓名 | 电话号码 |
---|---|---|
1001 | 张三 | 13812345678 |
1001 | 张三 | 13998765432 |
第二范式(2NF,Second Normal Form)
要求:
- 符合第一范式(1NF)
- 消除部分依赖(消除非主键列对主键的部分依赖):
- 如果主键是复合主键(由多个字段组成),则非主键字段必须完全依赖于整个主键,而不能仅依赖其中的一部分。
示例(不符合 2NF)
订单号 | 产品ID | 产品名称 | 价格 | 购买数量 |
---|---|---|---|---|
001 | P001 | 手机 | 3000 | 2 |
001 | P002 | 电脑 | 5000 | 1 |
问题:
订单号 + 产品ID
作为主键,但产品名称
和价格
仅依赖于产品ID
,与订单号
无关,造成部分依赖。
符合 2NF
拆分成两张表:
-
订单详情表
订单号 产品ID 购买数量 001 P001 2 001 P002 1 -
产品表
产品ID 产品名称 价格 P001 手机 3000 P002 电脑 5000
第三范式(3NF,Third Normal Form)
要求:
- 符合第二范式(2NF)
- 消除传递依赖(非主键字段不能依赖于其他非主键字段):
- 非主键字段必须直接依赖于主键,而不能通过其他非主键字段间接依赖。
示例(不符合 3NF)
员工ID | 姓名 | 部门ID | 部门名称 |
---|---|---|---|
1001 | 张三 | D01 | 市场部 |
1002 | 李四 | D02 | 技术部 |
问题:
部门名称
依赖于部门ID
,而部门ID
依赖于员工ID
,这属于传递依赖。- 如果某个部门没有员工,则
部门名称
无法存储,会导致数据冗余和更新异常。
符合 3NF
拆分成两张表:
-
员工表
员工ID 姓名 部门ID 1001 张三 D01 1002 李四 D02 -
部门表
部门ID 部门名称 D01 市场部 D02 技术部
总结
级别 | 规范 | 解决问题 |
---|---|---|
1NF | 消除重复列,保证原子性 | 防止一个字段存储多个值 |
2NF | 消除部分依赖 | 确保所有非主键列完全依赖于整个主键 |
3NF | 消除传递依赖 | 确保所有非主键列只直接依赖于主键 |
满足三范式后,数据库设计更加规范化,减少了数据冗余,提高了数据一致性,但可能会导致查询时需要多表关联,影响查询效率。因此,在实际应用中,需要在范式化(减少冗余)和反范式化(提高性能)之间做平衡。