【问题标题】:Building many-to-many relationship off of another?从另一个建立多对多关系?
【发布时间】:2015-07-08 04:22:49
【问题描述】:

我目前正在编写我的第一个用于测试中心的数据库。我对如何建模某种关系有些困惑:

我在学生和课程之间有多对多的关系。课程与考试是一对多的。我现在正在做的事情是学生和考试,它需要存储每个学生考试的特定信息。

建立多对多关系是否可能且合乎逻辑?在标准化之后有没有更简单的方法来做到这一点?

【问题讨论】:

  • 听起来您需要一个所谓的中间表,它将两个一对多关系捕获到您所描述的多对多中。
  • 如果您指的是促进多对多关系的表(在本例中为 Student Courses),我的问题是是否有可能且合乎逻辑地建立第二个中间表学生课程和考试。
  • 我认为这个设计会导致一个 student_exam 表。假设考试表理论上会有一个exam_id 键,它将作为返回到考试表的外键,而考试表又将course_id 外键返回到课程中。
  • 所以我不应该有一个 student_course 表,而应该只有一个 student_exam 表,因为考试已经参考了课程。那应该行得通。谢谢!
  • 我认为这是合理的。现在,请记住,从与考试无关的角度来看,student_course 表可能是合理的 - 仅考虑注册,例如学生 -> 课程。

标签: database database-design


【解决方案1】:

让我们回顾一下关系。

  • 一名学生修读一门或多门课程。
  • 一门课程有 1 名或更多学生。
  • 一门课程提供一门或多门考试。
  • 学生参加 1 门或多门考试。
  • 有 1 名或多名学生参加考试。
  • 考试与课程相关联。

Student、Course 和 Exam 是对象表。

Student
-------
Student ID
Student Name
...

Course
------
Course ID
Course Name
...

Exam
----
Exam ID
Course ID
...

课程 ID 是外键。这是课程和考试之间的一对多关系。一门课程有 1 个或多个考试。考试与课程相关联。

由于学生和课程之间存在多对多关系,因此我们创建了一个联结表。

StudentCourse
-------------
Student ID
Course ID
Semester Year
Semester Third (or Quarter)
...

现在,您的问题中包含了所有这些。我重复一遍,是为了让我对考试的回答更有意义。

StudentExam
-----------
Student ID
Exam ID
Exam Time Stamp
Grade
...

考试表将考试与课程联系起来,因此无需重复课程 ID。我们在学生和考试之间存在多对多关系,因此我们创建了另一个联结表。

在向 StudentExam 表写入一行之前,软件或数据库必须验证学生是否在提供考试的课程中。

这是五阶归一化。您可以通过加入 Course 表、Exam 表和 StudentExam 表来获取所需的课程信息。

【讨论】:

    【解决方案2】:

    请参阅 David W 在 cmets 部分中发布的该问题的上述答案:

    我认为该设计会导致一个 student_exam 表。鉴于 理论上,考试表将有一个考试 ID 键,这将 作为外键返回到考试表,这反过来又具有 course_id 外键回到课程中。

    【讨论】:

      猜你喜欢
      • 2021-12-11
      • 1970-01-01
      • 2011-06-19
      • 1970-01-01
      • 2019-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多