You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

咨询:如何将指定Students表转换为第二范式(2NF)

没问题,我来一步步带你把这个Students表转换成第二范式(2NF),先得搞明白2NF的核心要求:首先得满足第一范式(1NF),然后要消除非主属性对主键的部分函数依赖。咱们从原表开始拆解分析:

第一步:确认原表满足1NF

1NF的核心要求是每个属性都是不可再分的原子值,你的原表Students(Std_id, Std_name, Course_id, Course_credit_hour_, Course_code, Course_name, teacher_name)里的每个字段都是单一独立值(比如Std_id是唯一学号,Std_name是完整姓名,没有拆分的嵌套结构),所以已经满足1NF,这是转换2NF的基础前提。

第二步:确定原表的主键

要找主键,得看哪个(或哪些)字段组合能唯一确定表中的每一条记录:

  • 单独的Std_id只能确定学生信息,没法确定他选了哪门课
  • 单独的Course_id只能确定课程信息,没法确定哪个学生选了这门课

所以复合主键是(Std_id, Course_id),只有这两个字段组合起来,才能唯一对应一条“学生选某门课”的记录。

第三步:识别函数依赖与部分依赖

接下来梳理每个属性的依赖关系,找出违反2NF的部分依赖:

  • Std_id → Std_name:知道学生ID,就能确定学生姓名,这个属性只依赖主键的一部分(Std_id),属于部分函数依赖
  • Course_id → Course_credit_hour_, Course_code, Course_name, teacher_name:知道课程ID,就能确定这门课的学分、代码、名称和授课老师,这些属性都只依赖主键的另一部分(Course_id),也属于部分函数依赖
  • (Std_id, Course_id) → 所有属性:复合主键能确定所有字段,但前面的部分依赖直接违反了2NF的要求
第四步:拆分表消除部分依赖

根据2NF的规则,我们需要把存在部分依赖的属性拆分到独立的表中,只保留完全依赖于复合主键的关联关系:

  1. Students表(学生基础信息表)

    • 字段:Std_id(主键), Std_name
    • 作用:存储学生的核心信息,每个学生唯一对应一条记录,彻底消除Std_name对复合主键的部分依赖
  2. Courses表(课程基础信息表)

    • 字段:Course_id(主键), Course_credit_hour_, Course_code, Course_name, teacher_name
    • 作用:存储课程的核心信息,每门课程唯一对应一条记录,消除所有课程相关属性对复合主键的部分依赖
  3. Student_Courses表(学生选课关联表)

    • 字段:Std_id(外键,关联Students表的Std_id), Course_id(外键,关联Courses表的Course_id)
    • 主键:复合主键(Std_id, Course_id)
    • 作用:专门存储学生和课程的选课关系,这里的所有属性都完全依赖于复合主键,完全符合2NF要求

拆分完成后,三个表都满足2NF的标准:既符合1NF,又不存在非主属性对主键的部分函数依赖。

内容的提问来源于stack exchange,提问作者mohsin_sharif57

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:25:42