Database 数据库建模

Database 数据库建模,database,database-design,Database,Database Design,我的数据模型中有四个表,即: 学生们 选修课 选课价值,以及 学生选修课 学生表包含以学生id为主键的学生列表 选修表包含学院提供的选修课列表,选修课id为主键 可选值表包含每个可选值的可能值列表。此表的主键是可选id和值id的组合(复合主键),因此下一个可选的值从1开始 学生选课表包含学生id、选课id和值id作为主键。但我被要求做以下改变 使用选修值表的id而不是复合主键,并在学生选修表中使用主键(id)。因此,选修表和学生选修课之间的链接中断。我可以知道前一种方法还是后一种方法的最佳方

我的数据模型中有四个表,即:

  • 学生们
  • 选修课
  • 选课价值,以及
  • 学生选修课
学生表包含以学生id为主键的学生列表

选修表包含学院提供的选修课列表,选修课id为主键

可选值表包含每个可选值的可能值列表。此表的主键是可选id和值id的组合(复合主键),因此下一个可选的值从1开始

学生选课表包含学生id、选课id和值id作为主键。但我被要求做以下改变


使用选修值表的id而不是复合主键,并在学生选修表中使用主键(id)。因此,选修表和学生选修课之间的链接中断。我可以知道前一种方法还是后一种方法的最佳方法吗?

第二种方法通常被认为是“更好”的方法,因为它是标准化的,允许选择值在未来以更少的中断进行更改,并允许db引擎动态优化查询。如果值是一个字符串,实际上可以在数据库中节省一些空间。这是你描述的模型:

Student
    StudentID

Elective
    ElectiveID

ElectiveValue
    ElectiveValueID
    FK_ElectiveID
    Value

StudentElective
    StudentElectiveValueID
    FK_StudentID
    FK_ElectiveValueID

样本选修课的可能值是什么?是的,后一种方法的数据模型如上所述。如果你从概念上看,一个学生可以对同一选修课有两个值,但不应该是这样,只有使用复合主键才能避免这种情况。实际上,您可以在FK_StudentID和FK_SelectiveValueId上添加唯一性约束,而无需将其设置为pk。如果规则发生变化,可以在以后对其进行修改。