B0001 数据库设计三大范式
待更新
非受控冗余与第二范式的关系及实例解析
非受控冗余的定义
非受控冗余指数据库中因设计缺陷导致的重复数据,这些数据未被有效管理,导致存储浪费、数据不一致及操作异常。例如,同一信息在多条记录中重复存储(如学生姓名、系别在选课表中多次出现),且更新时需同步多处,易引发数据不一致。
第二范式(2NF)的核心要求
第二范式基于第一范式(1NF),要求非主属性完全依赖于主键,而非仅部分依赖。具体表现为:
- 主键若为复合键(如“学号+课程号”),非主属性(如“姓名”)必须依赖整个主键,而非仅依赖其中一部分(如仅依赖“学号”)。
- 违反2NF会导致部分依赖,进而产生非受控冗余及操作异常(如插入、删除、修改异常)。
非受控冗余与2NF的关联
非受控冗余是2NF未被满足的直接表现。当非主属性部分依赖于主键时,数据会因重复存储而冗余,且更新时需修改多条记录,增加数据不一致风险。2NF通过消除部分依赖,从根源上减少此类冗余。
实例说明
原始设计(违反2NF)
- 表名:学生选课表
- 主键:学号+课程号
- 字段:学号、姓名、系别、系主任、课程号、课程名、成绩
- 问题:
- 非受控冗余:同一学生的“姓名”“系别”“系主任”在每条选课记录中重复存储(如张三选3门课,其信息重复3次)。
- 插入异常:新增“物理系”但无学生选课时,无法插入(因主键需学号+课程号)。
- 修改异常:更换系主任需更新所有相关选课记录,易遗漏。
- 删除异常:删除某学生选课记录时,可能连带删除系信息(如数学系因无学生而消失)。
优化后设计(符合2NF)
通过分解表结构,消除部分依赖:
- 学生表(学号 PK,姓名,系编号 FK)
- 系表(系编号 PK,系名,系主任)
- 课程表(课程号 PK,课程名)
- 选课表(学号 FK,课程号 FK,成绩)
优化效果:
- 非受控冗余消除:学生信息仅存储于“学生表”,选课记录仅关联“学生表”和“课程表”。
- 操作异常解决:插入新系时,仅需在“系表”中添加记录;修改系主任时,仅更新“系表”;删除学生选课记录不影响系信息。
总结
非受控冗余是数据库设计缺陷的体现,而第二范式通过强制非主属性完全依赖主键,从设计层面消除此类冗余。实际开发中,需通过规范化分解表结构(如分解为多张关联表),确保数据一致性并提升存储效率。例如,学生选课系统通过分解为四张表,既符合2NF,又避免了冗余和操作异常,是规范化设计的典型案例。
