База данных посещаемости - PullRequest
0 голосов
/ 09 мая 2018

Я новичок в веб-программировании. Я пытаюсь создать систему разметки посещаемости. У меня есть следующий метод для этого.

Таблица

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

Каждый день я собираюсь добавить столбец. Если студент имеет текущее значение, равное 1, или иначе, это 0. Это хороший метод или плохой? Зачем? Есть ли другие способы сделать это?

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Просто чтобы расширить ответ Гордона Линоффа (который должен быть принят как правильный), преимущество наличия каждой даты в качестве отдельной строки (а не в качестве нового столбца) состоит в том, что это облегчает запрос к таблице.(У этого есть много других преимуществ помимо этого, но для ваших целей давайте начнем с упрощения запросов).Таким образом, следуя его предложенной схеме, ваша таблица может иметь данные, которые выглядят следующим образом:

| 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           |

Попытка сделать что-либо из этого с таблицей, имеющей сотни столбцов для каждой даты, будеттрудно, если не невозможно.

0 голосов
/ 09 мая 2018

Это очень плохой подход. В SQL таблицы имеют фиксированный набор столбцов. Добавлять новый столбец каждый день не рекомендуется.

То, что вы хотите сделать, это разместить данные в отдельных строках. Я бы порекомендовал что-то вроде этого:

create table attendance (
    attendanceid int primary key,  -- "autoincrement", "serial", or "identity" depending on the database
    studentid int,
    attendancedate date,
    mark int
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...