1. 首页
  2. Blog
  3. 令爷原创

数据库设计范式实例讲解

数据库设计范式实例讲解

原始数据表(违反1NF)

表名:StudentCourses

学生ID学生姓名选课信息(课程ID+课程)成绩学院教师
S001张三C101-数据库, C102-算法85人工智能学院曾老师
S001张三C101-数据库, C102-算法90人工智能学院曾老师
S002李四C101-数据库78人工智能学院曾老师

问题

  • 选课信息 字段包含多个课程ID和课程名称的组合值(非原子性),违反 1NF。
  • 同一学生的多门课程重复存储冗余信息(如学生姓名、学院、教师)。

第一范式(1NF):拆分非原子字段为多行

要求:每个字段的值不可再分,每列存储原子性数据。

修正后
选课信息 拆分为多行,每行仅含一门课程信息:

学生ID学生姓名课程ID课程名称成绩学院教师
S001张三C101数据库85人工智能学院曾老师
S001张三C102算法90人工智能学院曾老师
S002李四C101数据库78人工智能学院曾老师

第二范式(2NF):消除部分依赖

问题

  • 主键为 (学生ID, 课程ID)
  • 学生姓名 仅依赖 学生ID(部分依赖),课程名称教师 仅依赖 课程ID(部分依赖)。

修正步骤

  1. 拆分学生表、课程表、选课表。

学生表 Students

学生ID学生姓名
S001张三
S002李四

课程表 Courses

课程ID课程名称教师学院
C101数据库曾老师人工智能学院
C102算法曾老师人工智能学院

选课表 Enrollments

学生ID课程ID成绩
S001C10185
S001C10290
S002C10178

第三范式(3NF):消除传递依赖

问题

  • Courses 表中,学院 依赖 教师(假设曾老师属于人工智能学院),而 教师 依赖主键 课程ID,形成传递依赖。

修正步骤

  1. 拆分教师与学院的关系。

教师表 Teachers

教师学院
曾老师人工智能学院

课程表 Courses(修正后)

课程ID课程名称教师
C101数据库曾老师
C102算法曾老师

最终设计(符合3NF)

  1. Students

    学生ID学生姓名
    S001张三
    S002李四
  2. Teachers

    教师学院
    曾老师人工智能学院
  3. Courses

    课程ID课程名称教师
    C101数据库曾老师
    C102算法曾老师
  4. Enrollments

    学生ID课程ID成绩
    S001C10185
    S001C10290
    S002C10178

关键区别总结

范式解决的问题修正方法
1NF字段值非原子性(组合课程信息)拆分为多行,确保每列不可分
2NF部分依赖(学生姓名、课程名称等仅依赖部分主键)拆分实体表和关系表
3NF传递依赖(学院依赖教师而非直接依赖课程ID)拆分教师与学院的关系表

原创文章,作者:曾确令,如若转载,请注明出处:https://www.zengqueling.com/sjksjfssljj/

联系我们

15602395067

在线咨询:点击这里给我发消息

邮件:eden7@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code