[英]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.