具有过多缺勤警报的考勤数据库

时间:2011-10-09 10:53:34

标签: sql database database-design ms-access

我有一个非常标准的考勤数据库设计,但我想在学生遇到一定数量的缺席时收到警报。我正在考虑使用一个点系统,每个缺席会积累一定数量的点(在学生表本身上跟踪),它会抛出一条消息。该数据库目前在Access 2003中,但我可能会在不久的将来将其移至MS SQL Server。

这是我的设计理念,只是想确保它的逻辑和规范化。我加粗了我最关心的专栏。

tblAttendance -

  • PK AttendanceID
  • FK EventID
  • FK StudentID
  • 日期出席日期

tblEventEnrollment -

  • PK EventEnrollmentID
  • FK StudentID
  • FK EventID

tblEvents -

  • PK EventID
  • FK EventType
  • nvarchar EventName
  • FK EventLeader

tblEventTypes -

  • PK EventTypeID
  • nvarchar EventType
  • int PointsIfMissed

tblStudents -

  • PK StudentID
  • nvarchar FistName
  • nvarchar姓氏
  • int CurrentPoints

修改 在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。

1 个答案:

答案 0 :(得分:2)

快速浏览一下,为什么会有事件:

FK EventType

而不是

FK EventTypeID

在我看来,如果学生参加该活动,他们只会错过一个活动,所以不是在学生表中的int CurrentPoints,而是从注册到出勤的LEFT JOIN获得积分,以找到错过的活动。