ErdDocs

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.

Il tuo schema

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.

Altri esempi