2011-10-09 76 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条记录。如果我把它放在表格中,它是一列的单个查询。 –