我想为以下情况提出数据库设计。1-M关系数据库设计
学生可以注册程序,在给定时间学生可以有 只有一个注册programme.However,他/她必须能够在任何时候改变 注册的程序(包括注册到一个新的程序)。最终,学生可以将 注册到多个课程,但他必须只有1个活动的 课程。
我认为这应该是1-M的关系,但是如何处理这个“1给定时间的活动程序”的情况?
我想为以下情况提出数据库设计。1-M关系数据库设计
学生可以注册程序,在给定时间学生可以有 只有一个注册programme.However,他/她必须能够在任何时候改变 注册的程序(包括注册到一个新的程序)。最终,学生可以将 注册到多个课程,但他必须只有1个活动的 课程。
我认为这应该是1-M的关系,但是如何处理这个“1给定时间的活动程序”的情况?
您的学生表的ProgramID
与Program
表相关,例如他/她选择并且将是当前程序。现在,每当他/她更改他/她的程序时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
ProgramHistory
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
。