【问题标题】:Attendance Database with Excessive Absence Alert具有过度缺勤警报的考勤数据库
【发布时间】:2013-03-21 18:39:29
【问题描述】:

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

这是我的设计理念,只是想确保它的逻辑性和规范化。我已将我最关心的列加粗。

tbl出勤率-

  • PK 考勤ID
  • FK 事件 ID
  • FK 学生 ID
  • 日期出勤日期

tblEventEnrollment -

  • PK EventEnrollmentID
  • FK 学生 ID
  • FK 事件 ID

tblEvents -

  • PK 事件ID
  • FK 事件类型
  • nvarchar 事件名称
  • FK EventLeader

tblEventTypes -

  • PK EventTypeID
  • nvarchar 事件类型
  • int PointsIfMissed

tbl学生-

  • PK 学生ID
  • nvarchar 拳名
  • 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。

【问题讨论】:

  • 您是否打算让某些缺勤比其他缺勤获得更多积分?如果没有,积分系统似乎……嗯……毫无意义;只计算缺勤次数。无论哪种方式,我认为您应该在需要时通过查询得出分数,而不是将计算值存储在表中。
  • @HansUp 是的,每个事件类型都有一个独特的缺勤分数。因此,例如缺课比缺课更有价值。

标签: sql database database-design ms-access


【解决方案1】:

一目了然,为什么事件有:

FK EventType

而不是

FK EventTypeID

在我看来,学生只有在注册参加该活动时才能错过该活动,因此与其在学生表中输入 CurrentPoints,不如从注册到出席的 LEFT JOIN 中获取积分以查找错过的活动。

【讨论】:

  • FK EventType 是一个错误,谢谢!另外,请参阅我的编辑,了解我想要 CurrentPoints 列的原因。
  • @just 计算字段存在一些问题,尤其是在这种情况下,可能存在关于为什么应该原谅缺席的争论。根据您的规则,您甚至可能需要一张被原谅的桌子或幻影出席:),因为在没有注释的情况下简单地减少计数似乎是一个危险的想法。对于 SQL Server 来说,36,000 似乎并不多。
  • 如果我想将缺席保留在我的表中,我可以添加代码,当缺席被原谅时减去分数。我知道它不是 100% 标准化的,但考虑到查询的数量,我仍然担心。如果我在一次活动中记录 500 名学生的出勤率,那么假设他们都有 2.5 年的数据(总共 750 万行),则每条记录约 15,000 条记录的 500 条查询。如果我将其保留在表中,则它是一列的单个查询。
  • 我认为,在这个阶段,我正在扮演魔鬼的拥护者。问题是“但我可能会在不久的将来将其移至 MS SQL Server”,如果是这种情况,则可以利用计算列。
  • 如何在此处使用计算列? MS 说计算的列定义必须来自同一个表 (msdn.microsoft.com/en-us/library/ms191250.aspx)。
猜你喜欢
  • 2019-11-27
  • 2012-02-27
  • 1970-01-01
  • 2016-07-20
  • 2021-08-01
  • 1970-01-01
  • 2012-05-20
  • 1970-01-01
  • 2011-01-07
相关资源
最近更新 更多