数据库三大范式详解(软考高频考点)
第一范式(1NF)
核心要求:确保数据表中每个字段具有原子性,即字段值不可再拆分。
目的:消除重复数据组,避免数据冗余和存储异常。
示例:
- 错误设计:用户表(user)中user_info字段存储“地址+电话”。
- 符合1NF设计:将user_info拆分为address和phone两个字段。
软考常见题型:
- 题目:以下哪项设计违反第一范式?A. 学生表中的“姓名”字段B. 订单表中的“商品信息”字段(包含“商品名称+数量”)
- 解析:B选项的“商品信息”字段包含组合数据,需拆分为“商品名称”和“数量”字段。
第二范式(2NF)
核心要求:在满足1NF基础上,所有非主属性必须完全依赖主键,即消除部分依赖。
目的:进一步解决数据冗余和更新异常,确保非主键字段与主键有强关联。
示例:
- 错误设计:成绩表(score)包含复合主键(学生ID, 课程ID),但“课程名称”仅依赖“课程ID”。
- 符合2NF设计:拆分为成绩表(score)(主键:学生ID+课程ID,字段:得分)和课程表(course)(主键:课程ID,字段:课程名称)。
软考常见题型:
- 题目:某表主键为(学号, 课程号),非主键字段包括“成绩”和“教师姓名”。是否符合2NF?
- 解析:若“教师姓名”仅依赖“课程号”,则违反2NF,需拆分为课程表存储教师信息。
第三范式(3NF)
核心要求:在满足2NF基础上,非主属性不能传递依赖于主键,即消除传递依赖。
目的:进一步减少冗余,确保数据直接依赖主键,提高数据独立性和完整性。
示例:
- 错误设计:员工表(employee)包含字段“部门编号”和“部门负责人”,其中“部门负责人”依赖“部门编号”,间接依赖主键“员工ID”。
- 符合3NF设计:拆分为员工表(employee)(字段:员工ID, 姓名, 部门编号)和部门表(department)(字段:部门编号, 部门负责人)。
软考常见题型:
- 题目:某表中包含“订单号(主键)”、“客户ID”、“客户地址”。是否违反3NF?
- 解析:若“客户地址”依赖“客户ID”而非直接依赖主键“订单号”,则违反3NF,需拆分客户表。
总结对比
范式 | 依赖要求 | 典型错误设计 | 修正方法 |
1NF | 字段原子性 | 组合字段(如地址+电话) | 拆分字段 |
2NF | 完全依赖主键 | 非主键字段依赖部分主键 | 拆分表结构 |
3NF | 直接依赖主键 | 非主键字段间存在依赖链 | 拆分关联表 |
软考高频考点:
- 范式升级条件:如2NF需先满足1NF,并消除部分依赖。
- 设计错误判断:根据字段依赖关系判断违反哪一范式。
- 表结构优化:通过拆分表解决冗余或依赖问题,提高数据库设计的规范性和效率。
注:实际考试中可能结合具体表结构设计题目,需熟练识别主键、依赖关系及拆分逻辑。