[英]1-M Relationship database design
我正在尝试针对以下情况设计数据库。
学生可以注册某个程序,在指定的时间只能注册一个程序,但是他/她必须能够在任何给定时间更改注册的程序(包括注册一个新程序)。 最终,学生可以注册到多个程序,但他必须只有一个有效程序。
我认为应该是1-M关系,但是如何处理“给定时间有1个活动程序”的情况?
您的学生表将具有与Program
表相关的ProgramID
,例如,他/她选择的表将是当前程序。 现在,每次他/她更改程序时, ProgramID
都会更改,但是会有一个ProgramHistory
记录更改。
因此可能的表将是Student
, Program
, ProgramHistory
。
范例 :
学生
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
表,该表是Student
和Program
之间多对多关系的交集
有几种方法可以确保给定的学生一次只拥有一个活动程序。
一种方法是在您的学生表中放置一个active_program_key
列,并使其成为Program
表的外键。 这可能不是最佳选择,因为这需要对数据进行非规范化,并且所导致的重复操作可能会导致数据不一致,除非您采取重要措施避免它们不一致。
使用声明性约束的另一种方法是在ProgramHistory
表上创建一个唯一索引,其中包括student_key
和enrollment_date
。 这样可以确保每个给定日期学生只能注册一次。 活动程序将是任何给定学生的最新日期的记录。
第二个选项很简单,避免了重复数据。 公平地说,检索当前学生入学的查询会稍微复杂一些。 与往常一样,设计是权衡的。
假设学生可以在几乎任何时间(即,不仅在学期之间)更改程序,那么您希望在ProgramHistory
表中有一个program_start_date
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.