Хранение данных о посещаемости в sql

Немного продолжения от этого вопроса здесь: Дизайн базы данных для системы посещаемости школы

В настоящее время я делаю нечто подобное, но у меня есть несколько дополнительных вопросов. Итак, в школе около 200 учеников, но это постоянно меняется. Они посещают примерно 200 дней, и требуется хранить данные о посещаемости в течение 7 лет. Это мой оператор создания таблицы здесь:

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

Мой вопрос: это лучший способ создать таблицу?

Раньше я не делал никаких прямых работ с базами данных из пользовательского интерфейса, поэтому я предложил следующее решение:

Сначала локальная переменная, которая будет использовать функцию C# DateTime.Today для получения сегодняшней даты; Другая локальная переменная, которая будет получать StudentID из пользовательского интерфейса; Затем значение посещаемости, которое является логическим, снова устанавливается пользовательским интерфейсом и сохраняется как 0/1;

Все это затем объединяется в оператор Insert into SQL.

Это лучший способ? Любые советы или помощь будут оценены, спасибо.

Мне нравится! Он хорошо масштабируется, чтобы удерживать столько дней, сколько вам нужно, и он хорошо расширяется, если вы хотите добавить новый атрибут attendance, например absence_reason или что-то в этом роде.

JNevill 13.09.2018 19:08

Кажется разумным, но настоящий тест - сможете ли вы получить из него нужные данные?

stuartd 13.09.2018 19:08

Вы уверены, что вам нужна колонка present? Не может ли отсутствие ряда для данного ученика в данный день означать, что он отсутствует?

Dai 13.09.2018 19:08

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

gunr2171 13.09.2018 19:11
0
4
539
1

Ответы 1

Я бы предложил вместо этого эту таблицу:

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), но мы можем расширить его до 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 )
)

Другие вопросы по теме