【发布时间】: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 列基于两个因素:
- 避免过多的连接/聚合。一个学生每天可能有 10 场活动,每年 3650 场,并且超过 10 年要检查 36,000 多个活动出席记录以获得他的分数。 (我没有做任何测试来查看数据集变大后的实际性能影响)
-
允许我重置积分。我还考虑在 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