2014-09-13 160 views
0

我想为以下情况提出数据库设计。1-M关系数据库设计

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

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

回答

1

您的学生表的ProgramIDProgram表相关,例如他/她选择并且将是当前程序。现在,每当他/她更改他/她的程序时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 
1

要允许计划内招生的历史的跟踪,你需要有一个ProgramHistory表是StudentProgram

有之间的许多一对多的关系交集的几种方法确保给定学生一次只有一个活动课程。

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

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

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

假设学生可以在几乎任何时间改变节目(即,不只是在学期之间),那么你想在你的ProgramHistory表中有一个program_start_date