首页 > 解决方案 > 在 SQL 中存储考勤数据

问题描述

从这个问题继续说:学校考勤系统的数据库设计

我目前正在做类似的事情,但还有一些其他问题。所以学校有大约 200 名学生,但这在不断变化。他们参加大约 200 天,并且需要将出勤数据保存 7 年。这是我在这里的创建表语句:

CREATE TABLE attendance (
    studentID INTEGER REFERENCES students (studentID),
    date      DATE,
    present   BOOLEAN
);

我的问题是,这是创建表格的最佳方式吗?

在此之前,我还没有真正从 UI 中直接完成任何数据库操作,因此我提出的解决方案是:

首先是一个局部变量,它将使用 C# DateTime.Today 函数来获取今天的日期;另一个从 UI 获取 StudentID 的局部变量;然后是一个布尔值的出勤值,再次由 UI 设置并存储为 0/1;

然后将所有这些组合到 Insert into SQL 语句中。

这是最好的方法吗?任何提示或帮助将不胜感激。

标签: c#sqldatabase

解决方案


我建议使用这张桌子:

CREATE TABLE StudentAttendance (
    StudentId int  NOT NULL REFERENCES Students (StudentId),
    Date      date NOT NULL,

    PRIMARY KEY( StudentId, Date )
)
  • 我认为不需要present列,因为存在或缺少行可以指示学生当天是否在场。
  • 该表有一个复合键组成StudentId + Date- 这意味着不能有重复的记录(即每个学生每天只有 1 行)
  • “Id”是 的缩写Identity,它不是首字母缩写,因此不应全部大写(即使用Id代替ID)。

更新

在阅读了其他用户(尤其是@JNevill)的评论后,我认识到您可能想要存储学生缺勤原因,这意味着您需要一IsPresent bit列(因为一行现在可能意味着存在或不存在)Notes nvarchar(max)列,但我们可以将其扩展为 a以tinyint存储不同类型的考勤记录的枚举值:

enum StudentAttendanceType
{
    Present = 0,
    UnauthorisedAbsence = 1,
    AuthorisedAbsence = 2,
    MedicalLeave = 3,
    // etc...
}

CREATE TABLE StudentAttendance (
    StudentId int           NOT NULL REFERENCES Students (StudentId),
    Date      date          NOT NULL,
    Type      tinyint       NOT NULL,
    Notes     nvarchar(max) NOT NULL

    PRIMARY KEY( StudentId, Date )
)

推荐阅读