2011-10-09 94 views
0

我有一個非常標準的考勤數據庫設計,但我想在學生遇到一定數量的缺席時收到提醒。我正在考慮使用積分系統,每個缺席積累一定數量的積分(在學生桌上本身進行追蹤),它會拋出一條消息。該數據庫目前在Access 2003中,但我很可能會在不久的將來將其移至MS SQL Server。考勤數據庫過量缺勤報警

這是我的設計理念,只是想確保它的邏輯和規範化。我用粗體顯示了我最關心的欄目。

tblAttendance -

  • PK AttendanceID
  • FK事件ID
  • FK StudentID
  • 日期AttendanceDate

tblEventEnrollment -

  • PK EventEnrollmentID
  • FK StudentID
  • FK的EventID

tblEvents -

  • PK的EventID
  • FK的EventType
  • nvarchar的事件名稱
  • FK EventLeader

tblEventTypes -

  • PK EventTypeID
  • nvarchar的事件類型
  • INT PointsIfMissed

tblStudents -

  • PK StudentID
  • nvarchar的FistName
  • nvarchar的名字
  • INT CurrentPoints

EDIT 使用在tblStudents一個CurrentPoints列是基於兩個因素:

  1. 爲了避免過多的加入/聚合。一個學生可能每天有10個活動,每年3650個,並且超過10年36,000+個活動出勤記錄,以便檢查他的分數。(我沒有做過任何測試,看看數據集變大後的實際性能影響)
  2. 允許我重置點。我還考慮在tblStudents中使用Date LastPointResetDate列,然後使用這些行的查詢來計算分數,我只是擔心表現(請記住,我想用每個新的出席記錄來檢查這一點):

    SELECT SUM(tblEventTypes.PoinsIfMissed)AS CurrentPoints FROM tblAttendance INNER JOIN tblEvents ON tblAttendance.EventID = tblEvents.EventID INNER JOIN tblEventTypes ON tblEventTypes.EventTypeID = tblEvents.EventTypeID WHERE tblAttendance.AttendanceDate> tblStudents.LastPointResetDate。

+0

你是否打算有些缺席會比其他人贏得更多積分?如果沒有,一個積分系統似乎......呃......毫無意義;只要計算缺席的次數。無論哪種方式,我認爲您應該在需要時使用查詢來獲得分數,而不是將計算的值存儲在表中。 – HansUp

+0

@HansUp是的,每個事件類型都會有一個獨特的缺席分數。因此,例如,缺課是值得比缺少週末學習更值得。 –

回答

2

快速瀏覽,爲什麼事件有:

FK EventType 

不是

FK EventTypeID 

在我看來,如果他們註冊一個學生只能錯過任何活動該事件,而不是學生表中的int CurrentPoints,從註冊到出席的LEFT JOIN中獲取點以查找錯過的事件。

+0

FK EventType是一個錯誤,謝謝!另外,請參閱我的編輯,瞭解爲什麼我需要CurrentPoints專欄的原因。 –

+0

@just計算字段存在一些問題,特別是在像這樣的情況下,推測可能存在爭論,爲什麼應該原諒缺席。你甚至可能需要一個原諒的表或幻影出席:),這取決於你的規則,因爲簡單地減少計數沒有一些注意看起來像一個危險的想法。對於SQL Server來說,36,000似乎並不那麼重要。 – Fionnuala

+0

我可以添加一些代碼,當缺席被原諒時,如果我想保留在我的表中,可以減去這些代碼。我知道這樣不是100%正常化,但考慮到我仍然擔心的查詢數量。如果我在一個事件中記錄了500名學生的出勤率,那麼假設他們都有2.5年的數據(總共7.5mil),那麼就是500條查詢~15,000條記錄。如果我把它放在表格中,它是一列的單個查詢。 –