我想爲以下情況提出數據庫設計。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
。