1-M关系数据库设计

时间:2014-09-13 12:40:47

标签: mysql sql sql-server database database-design

我试图为以下场景提出数据库设计。

  

学生可以在学生可以指定的时间注册课程   只有一个注册的程序。但是,他/她必须能够改变   在任何给定时间注册的程序(包括注册新程序)。最终,学生可以   注册到多个程序但他必须只有1个活动   程序

我认为它应该是1-M关系,但如何在给定时间处理这个" 1活跃程序"情况?

2 个答案:

答案 0 :(得分:1)

您的学生表将具有与ProgramID表相关的Program,例如他/她选择并将成为当前程序。现在,每当他/她改变他/她的计划ProgramID将会改变时,会有ProgramHistory来记录这些变化。

因此可能的表格为StudentProgramProgramHistory

示例

<强>学生

StudentID    Lastname    Firstname   Gender  ProgramID
------------------------------------------------------
101          Smith       Jason       M       1
102          Jones       Kate        F       2

<强>程序

ProgramID    ProgramName
------------------------------
1            Computer Science
2            Nursing
3            Electrical Engineering

<强> ProgramHistory

ID         ProgramID    StudentID    Semester    Year
-----------------------------------------------------
1          3            101          Spring      2014
2          2            102          Fall        2014
3          1            101          Fall        2014

答案 1 :(得分:1)

要允许跟踪计划注册的历史记录,您需要有ProgramHistory表格,该表格是StudentProgram之间多对多关系的交集。 / p>

有几种方法可以确保给定学生一次只有一个活动程序。

一种方法是在学生表中放置active_program_key列,并使其成为Program表的外键。这可能不是最好的选择,因为它需要对数据进行非规范化,并且由此产生的重复可能会导致数据不一致,除非您采取重要措施来避免它们。

使用声明性约束的另一个选项是在ProgramHistory表上创建包含student_keyenrollment_date的唯一索引。这可确保学生每个指定日期只能注册一次。活动程序将记录任何给定学生的最新日期。

第二个选项很简单,避免重复任何数据。公平地说,检索当前学生注册的查询会稍微复杂一些。与往常一样,设计是一种权衡取舍。

假设学生可以在任何时间(即不仅仅是在学期之间)更改课程,那么您希望program_start_date表中有ProgramHistory