2014-09-13 152 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