簡體   English   中英

1-M關系數據庫設計

[英]1-M Relationship database design

我正在嘗試針對以下情況設計數據庫。

學生可以注冊某個程序,在指定的時間只能注冊一個程序,但是他/她必須能夠在任何給定時間更改注冊的程序(包括注冊一個新程序)。 最終,學生可以注冊到多個程序,但他必須只有一個有效程序。

我認為應該是1-M關系,但是如何處理“給定時間有1個活動程序”的情況?

您的學生表將具有與Program表相關的ProgramID ,例如,他/她選擇的表將是當前程序。 現在,每次他/她更改程序時, ProgramID都會更改,但是會有一個ProgramHistory記錄更改。

因此可能的表將是StudentProgramProgramHistory

范例

學生

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表,該表是StudentProgram之間多對多關系的交集

有幾種方法可以確保給定的學生一次只擁有一個活動程序。

一種方法是在您的學生表中放置一個active_program_key列,並使其成為Program表的外鍵。 這可能不是最佳選擇,因為這需要對數據進行非規范化,並且所導致的重復操作可能會導致數據不一致,除非您采取重要措施避免它們不一致。

使用聲明性約束的另一種方法是在ProgramHistory表上創建一個唯一索引,其中包括student_keyenrollment_date 這樣可以確保每個給定日期學生只能注冊一次。 活動程序將是任何給定學生的最新日期的記錄。

第二個選項很簡單,避免了重復數據。 公平地說,檢索當前學生入學的查詢會稍微復雜一些。 與往常一樣,設計是權衡的。

假設學生可以在幾乎任何時間(即,不僅在學期之間)更改程序,那么您希望在ProgramHistory表中有一個program_start_date

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM