这里有一个问题的答案:Database design for school attendance system
我目前正在做类似的事情,但还有其他一些问题。因此,学校大约有200名学生,但是这种情况正在不断变化。他们参加了大约200天,并且需要将出勤数据保留7年。这是我的创建表语句:
CREATE TABLE attendance (
studentID INTEGER REFERENCES students (studentID),
date DATE,
present BOOLEAN
);
我的问题是,这是创建表的最佳方法吗?
我之前从未真正通过UI完成任何直接的数据库工作,所以我建议的解决方案是:
首先,使用C#DateTime.Today函数获取今天日期的局部变量; 另一个局部变量将从UI中获取StudentID; 然后,出勤值是一个布尔值,由用户界面再次设置并存储为0/1;
所有这些都合并到了插入到SQL语句中。
这是最好的方法吗?任何提示或帮助将不胜感激。
答案 0 :(得分:1)
我建议改为使用此表:
CREATE TABLE StudentAttendance (
StudentId int NOT NULL REFERENCES Students (StudentId),
Date date NOT NULL,
PRIMARY KEY( StudentId, Date )
)
present
列,因为该行的存在或缺乏可以指示当天是否有学生在场。 / li>
StudentId + Date
组成的复合键-这意味着不能有重复的记录(即每个学生每天只有1行)Identity
的缩写,它不是缩写,因此不应全部大写(即使用Id
而不是ID
)。在阅读了其他用户(尤其是@JNevill)的评论后,我意识到您可能想存储学生缺席的原因,这意味着您将需要一个IsPresent bit
列(因为一行现在意味着一个-{present}或不存在),但可以将其扩展到Notes nvarchar(max)
,以存储用于不同类型的出勤记录的枚举值:
tinyint