2010-07-13 64 views
3

我有三個表學生,部門和大學數據庫中的課程... 學生有一個UID作爲主鍵 - >這是學生的唯一ID DEPARTMENT Dept_id作爲主鍵 - >這是部門編號 課程的C_id作爲主鍵 - >哪個是課程/科目Id檢查一個實體的數據的完整性

我需要通過將學生的主鍵,部門和每門課程中的每個學生的課程。

UID Dept_id C_id marks 
1 CS  CS01 98 
1 CS  CS02 96 
1 ME  ME01 88 
1 ME  ME02 90 

的問題是,如果我創建一個表像這樣的標誌的話,我覺得數據操作可能會插入例如一個學生的主鍵的錯誤組合

UID Dept_id C_id marks 
1 CS  CS01 98 
1 CS  CS02 96 
1 ME  CS01 88 //wrong C_id (course id) inputted by the DBA 
1 ME  ME02 90 

在這種情況下,我怎麼能阻止他這樣做? 還有沒有其他方式來存儲每個學生的商標?我的意思是這樣的:

UID Dept_id CS01 CS02 
1 CS  98 96 
3 CS  95 92 

回答

5

你應該儘可能避免在數據庫中的數據複製:

UID Dept_id C_id marks 
1 CS  CS01 98 
    ^^  ^^ 

,你可以:

  • 變化的過程中ID爲兩列鍵(部門,課程編號),例如('CS','01')。

或:

  • 保持課程名稱,因爲它是,但把部門ID字段中course表,並從marks表忽略它。如果您需要計算特定部門的總分數,您仍然可以通過向查詢添加JOIN來輕鬆完成此操作。

你最後的建議似乎是一個壞主意。您需要在表格中爲每門課程設置一列,而大多數值將爲NULL。

+1

除了業務層應該確保數據操作員無法選擇該部門的無效課程。 你不妨映射數據庫中的這種關係。 – BenW 2010-07-13 13:45:36

+0

謝謝你的建議。我想我會使用你的想法並將其修改爲在課程表中包含Dept_id。 – 2010-07-14 05:00:40

2

我不確定爲什麼你需要本表中的部門,如果該課程表明部門。因此,爲什麼你的桌子不是:

UID C_id marks 
1 CS01 98 
1 CS02 96 
1 ME01 88 
1 ME02 90 

這張表缺少的是一些時間的跡象。例如,如果學生第一次失敗,則可以選擇同一課程兩次。因此,您需要額外的專欄來指示學期和年份。

0

您可以將外鍵約束添加到表中,以確保爲學生ID,課程ID和部門ID輸入了有效值。您還可以爲表添加唯一的約束,以確保無意創建重複項。但最後你不能阻止插入不正確的數據;如果你知道這是不正確的,你不需要問它。

例如:1957年2月29日不可能是我的生日; 2025年7月15日不可能是我的生日; 1974年9月27日不是我的生日。

+0

。我正在設計它,並將其交給DBA誰將插入它不是我..所以我很害怕,如果他插入錯誤! – 2010-07-14 11:05:24

1

你的建議將是一個噩夢來維護。每次將新課程添加到課程時,您都必須添加新列。大部分時間查詢也很難。

如果你想確保每門課程是適當的部門,你可以做,在觸發器(確保處理多個記錄插入或更新),或在應用程序中。這仍然不能阻止所有的數據輸入錯誤(這是可能搭載CS89當你CS98的意思),但它會減少誤差量。在這種情況下,這是不可能的數據將來自比其他應用程序的任何地方,所以我可能會選擇執行應用程序的規則。他們選擇部門的下拉式列表,只有該部門的課程纔會顯示出來。

+0

連我覺得我最後的建議是錯誤的,但同樣是進退兩難是否要爲這樣的替代品。 – 2010-07-14 05:03:24