Esempi / Gestione di una scuola
Gestione di una scuola
Il database di una scuola collega studenti e materie attraverso le iscrizioni. È la tabella ponte che conserva anche il voto. I docenti tengono i corsi di una materia in un certo periodo. Le presenze sono legate all’iscrizione, con una riga per studente e giorno di lezione.
Qui sotto ErdDocs disegna questo schema dal suo SQL, con tutte le tabelle e le relazioni. Nella scheda «Dizionario dati» c’è la versione da stampare, completa e gratis in questa pagina. Il SQL è più in basso.
Passa sopra una tabella per evidenziarne le relazioni. Un clic le fissa.
A cosa serve ogni tabella
- students / teachersTabelle separate. Studenti e docenti condividono solo il nome, mentre dati e ciclo di vita sono diversi.
- coursesLa voce nel piano di studi. CS-101 esiste una volta sola, per quante volte venga tenuta.
- sectionsIl corso è una materia tenuta da un docente in un certo periodo. È ciò che gli studenti frequentano davvero.
- enrollmentsTabella ponte tra studente e corso. Oltre ai collegamenti, conserva il voto.
- attendanceLegata all’iscrizione con una chiave esterna composta. Non si può segnare presente uno studente in un corso a cui non è iscritto.
Scelte di progetto da riprendere
- La separazione tra materia e corso è alla base dello schema. Se iscrivi gli studenti alle materie, tutto si rompe appena una materia è tenuta due volte. Ci sono due periodi e due docenti, ma una sola colonna del voto, e non si sa più a cosa si riferisce.
- Le presenze fanno riferimento all’iscrizione con una chiave esterna composta (student_id, section_id). Così è il database stesso a rifiutare la presenza di uno studente non iscritto.
- Il voto ammette NULL invece di avere un valore predefinito. Un voto vuoto significa che il periodo è ancora in corso, non che lo studente abbia preso zero.
Il SQL
Dialetto PostgreSQL. Questo SQL è già nello strumento qui sopra, e puoi copiarlo liberamente nel tuo database o in una migrazione.
CREATE TABLE students (
id bigserial PRIMARY KEY,
student_no varchar(20) NOT NULL UNIQUE,
full_name varchar(120) NOT NULL,
enrolled_on date NOT NULL
);
CREATE TABLE teachers (
id bigserial PRIMARY KEY,
full_name varchar(120) NOT NULL,
department varchar(80) NOT NULL
);
CREATE TABLE courses (
id bigserial PRIMARY KEY,
code varchar(12) NOT NULL UNIQUE,
title varchar(160) NOT NULL,
credits int NOT NULL
);
COMMENT ON COLUMN courses.code IS 'Codice della materia, ad es. CS-101';
CREATE TABLE sections (
id bigserial PRIMARY KEY,
course_id bigint NOT NULL REFERENCES courses(id),
teacher_id bigint NOT NULL REFERENCES teachers(id),
term varchar(20) NOT NULL,
room varchar(20)
);
COMMENT ON TABLE sections IS 'Una materia che un docente tiene in un periodo; gli studenti si iscrivono ai corsi, non alle materie';
CREATE TABLE enrollments (
student_id bigint NOT NULL REFERENCES students(id),
section_id bigint NOT NULL REFERENCES sections(id),
grade varchar(2),
PRIMARY KEY (student_id, section_id)
);
COMMENT ON COLUMN enrollments.grade IS 'NULL fino alla fine del periodo';
CREATE TABLE attendance (
student_id bigint NOT NULL,
section_id bigint NOT NULL,
class_date date NOT NULL,
present boolean NOT NULL,
PRIMARY KEY (student_id, section_id, class_date),
FOREIGN KEY (student_id, section_id) REFERENCES enrollments(student_id, section_id)
);Domande frequenti
Dove vanno i genitori o tutori?
In una tabella guardians e in una tabella ponte student_guardians. È una relazione molti a molti: i fratelli condividono i tutori e uno studente può averne più di uno.
Perché non mettere teacher_id in courses?
Perché la stessa materia, in periodi diversi, la insegnano docenti diversi. Il docente appartiene al corso, non alla voce del piano di studi.