繁体   English   中英

1-M关系数据库设计

[英]1-M Relationship database design

我正在尝试针对以下情况设计数据库。

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

我认为应该是1-M关系,但是如何处理“给定时间有1个活动程序”的情况?

您的学生表将具有与Program表相关的ProgramID ,例如,他/她选择的表将是当前程序。 现在,每次他/她更改程序时, 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

程序历史

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

为了跟踪程序注册的历史记录,您需要有一个ProgramHistory表,该表是StudentProgram之间多对多关系的交集

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

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

使用声明性约束的另一种方法是在ProgramHistory表上创建一个唯一索引,其中包括student_keyenrollment_date 这样可以确保每个给定日期学生只能注册一次。 活动程序将是任何给定学生的最新日期的记录。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM