Схема на база данни за ефективна система за управление на присъствието

Разработвам система за присъствие в училище, която ще обслужва както служителите, така и учениците.

Текущата db схема е

attendance маса

id - primary key for this table
daydate  int(11) - stores timestamp of current day
timing_in varchar(18) - Start time for institution
timing_out - Closing time for institution
status - Status for the day, can be working day - 1 or holiday - 2

След това има различни таблици за служители и студенти, които съхраняват действителните стойности за присъствие.

За персонала присъствието се съхранява в attendance_staff. Схемата на базата данни е

attendance_id - foreign key, references attendance table
staff_id - id of staff member, references staff master table
time_in - stores in timing of a staff member
time_out - stores out timing of a staff member
status - attendance status - can be one among the list, like present, absent, casual leave, half day, late mark, on duty, maternity leave, medical leave etc

За персонала съхранявам както присъстващи, така и не присъстващи записи в таблицата.

Сега към него трябва да се включи и присъствието на учениците.

Тъй като състоянието на всеки ден вече е съхранено в таблица attendance, можем ли да съхраняваме ненастоящи стойности за всеки ученик в таблицата за присъствие на учениците.

Например, таблицата за присъствие на ученици ще съхранява само записи за онези дни, които не присъстват в определен ден.

Схемата за attendance_student ще бъде

attendance_id - references attendance table
student_id - references student table
status - will be leave / absent etc other than present.

Ще бъде ли ефективно да се изчислят настоящите дни от таблицата за посещаемост с помощта на външно съединение??

Благодаря предварително.


person Ehs4n    schedule 31.12.2012    source източник


Отговори (1)


Не се нуждаете от външно присъединяване, за да изчислите присъствието на учениците. Можете просто да преброите записите във вашата таблица за присъствие (еднократно, тъй като ще бъде еднакво за всички ученици) и след това просто да изберете от вашата таблица за присъствие на ученици, за да получите отсъствия.

Ако предпочитате да преброите присъствието с външно присъединяване, бихте могли. Вероятно ще бъде повече от достатъчно ефективно, ако имате индекс на първичния ключ на вашата таблица за присъствие и на външния ключ от таблицата за присъствие на ученици към вашата таблица за присъствие.

person Joel Brown    schedule 31.12.2012
comment
Благодаря ти Джоел. Трябва ли състоянието на настоящето да се съхранява в базата данни и за всеки ученик за всеки ден. Какво ще кажете за това, че трябва да получа присъствие от миналата година за конкретен месец на конкретен студент? Как може да се провери, дали ученикът е бил на разположение в този момент или не. Дали е бил активен / неактивен / спрян и т.н. Тъй като за неактивни студенти присъствието няма да бъде налично в системата. - person Ehs4n; 01.01.2013
comment
@Ehs4n - Ако бях аз, щях да съхраня present изрично. Бих направил това, защото би разграничил присъствието на студенти и липсата на данни. Докато не се запише присъствието, не можете да разберете дали ученик е присъствал или трябва да се определи присъствието. За исторически данни, ако изчистите някоя от вашите таблици, когато учениците напуснат училището или започне нова учебна година, тогава може да обмислите запазването на допълнителен набор от исторически архивни таблици, които включват учебната година като допълнително поле. Вместо да изтривате ученик, който напуска, вместо това ги архивирайте. - person Joel Brown; 01.01.2013
comment
Благодаря ви още веднъж за вашите прозрения. Бихте ли хвърлили повече светлина върху функцията за архивиране. Как може да се постигне това? - person Ehs4n; 01.01.2013
comment
@Ehs4n - Създайте набор от таблици, които са копия на вашите производствени таблици, но помислете за добавяне на допълнителна колона за година. След това, вместо да имате процес, който просто изтрива данни от вашите производствени таблици в края на учебната година, променете този процес, за да копирате първо данните в архивните таблици, задавайки колоната за допълнителна година, докато вървите. След това изтрийте данните от производствените таблици, след като архивното копие е направено. Не всяка архивна таблица трябва да има допълнителна колона за година, а само таблици, които все още нямат вградена дата в тях. - person Joel Brown; 01.01.2013
comment
Благодаря ви за вашите ценни предложения. :) - person Ehs4n; 02.01.2013