考勤标记数据库

时间:2018-05-09 02:53:58

标签: sql database-design

我是网络编程的新手。我试着建立一个考勤标记系统。我想下面的方法就可以了。

| student_id | 2018_5_8 | 2018_5_9 |
|------------|----------|----------|
|            |          |          |

我每天都要添加一列。如果学生的现值是1或者其他是0.这是一个好方法还是坏方法?为什么?有没有其他方法可以做到这一点?

2 个答案:

答案 0 :(得分:3)

这是一种非常糟糕的方法。在SQL中,表具有固定的列集。建议不要每天添加新列。

您要做的是将数据放在不同的行中。我会推荐这样的东西:

create table attendance (
    attendanceid int primary key,  -- "autoincrement", "serial", or "identity" depending on the database
    studentid int,
    attendancedate date,
    mark int
);

答案 1 :(得分:1)

为了扩展Gordon Linoff的答案(应该被接受为正确的答案),将每个日期作为自己的行(而不是新列)的好处是,这使得表更容易查询。 (除此之外还有许多其他好处,但为了您的目的,让我们从简化查询开始)。因此,按照他建议的架构,您的表可能包含如下数据:

| attendanceid | studentid | attendancedate | mark |
|--------------|-----------|----------------|------|
| 1            | 5         | 2018-05-08     | 1    |
| 2            | 3         | 2018-05-08     | 1    |
| 3            | 5         | 2018-05-09     | 0    |
| 4            | 3         | 2018-05-09     | 1    |

现在,您可以轻松地看到,在任何特定日期,特定学生是否被标记为现在。因此,如果您想快速查看学生5的出勤记录,您可以使用:

SELECT * FROM attendance
WHERE studentid = 5

会返回类似的内容:

| attendanceid | studentid | attendancedate | mark |
|--------------|-----------|----------------|------|
| 1            | 5         | 2018-05-08     | 1    |
| 3            | 5         | 2018-05-09     | 0    |

如果您只想查看学生5错过的日期,可以使用:

SELECT * FROM attendance
WHERE studentid = 5 AND mark = 0

并获得:

| attendanceid | studentid | attendancedate | mark |
|--------------|-----------|----------------|------|
| 3            | 5         | 2018-05-09     | 0    |

或者,如果您想知道每个学生缺席的天数,您可以使用:

SELECT studentid, COUNT(*) AS missed_days FROM attendance
WHERE mark = 0
GROUP BY studentid

对于上面的示例数据,将返回:

| studentid | missed_days |
|-----------|-------------|
| 3         | 0           |
| 5         | 1           |

如果不是不可能的话,尝试使用每个日期有数百列的表来执行此操作将很困难。