【发布时间】:2014-09-13 12:40:47
【问题描述】:
我正在尝试为以下场景设计数据库。
学生可以注册课程,在给定的时间学生可以拥有 只有一个注册程序。但是,他/她必须能够更改 在任何给定时间注册的程序(包括注册新程序)。最终,学生可以 注册到多个程序,但他必须只有 1 个活动 程序。
我认为应该是1-M关系,但是如何处理这种“在给定时间有1个活动程序”的情况?
【问题讨论】:
标签: mysql sql sql-server database database-design
我正在尝试为以下场景设计数据库。
学生可以注册课程,在给定的时间学生可以拥有 只有一个注册程序。但是,他/她必须能够更改 在任何给定时间注册的程序(包括注册新程序)。最终,学生可以 注册到多个程序,但他必须只有 1 个活动 程序。
我认为应该是1-M关系,但是如何处理这种“在给定时间有1个活动程序”的情况?
【问题讨论】:
标签: mysql sql sql-server database database-design
您的学生表将具有与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。
【讨论】: