我试图为以下场景提出数据库设计。
学生可以在学生可以指定的时间注册课程 只有一个注册的程序。但是,他/她必须能够改变 在任何给定时间注册的程序(包括注册新程序)。最终,学生可以 注册到多个程序但他必须只有1个活动 程序
我认为它应该是1-M关系,但如何在给定时间处理这个" 1活跃程序"情况?
答案 0 :(得分: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
答案 1 :(得分:1)
要允许跟踪计划注册的历史记录,您需要有ProgramHistory
表格,该表格是Student
和Program
之间多对多关系的交集。 / p>
有几种方法可以确保给定学生一次只有一个活动程序。
一种方法是在学生表中放置active_program_key
列,并使其成为Program
表的外键。这可能不是最好的选择,因为它需要对数据进行非规范化,并且由此产生的重复可能会导致数据不一致,除非您采取重要措施来避免它们。
使用声明性约束的另一个选项是在ProgramHistory
表上创建包含student_key
和enrollment_date
的唯一索引。这可确保学生每个指定日期只能注册一次。活动程序将记录任何给定学生的最新日期。
第二个选项很简单,避免重复任何数据。公平地说,检索当前学生注册的查询会稍微复杂一些。与往常一样,设计是一种权衡取舍。
假设学生可以在任何时间(即不仅仅是在学期之间)更改课程,那么您希望program_start_date
表中有ProgramHistory
。