Dai, dedichiamo un attimo e ripassiamo quello che abbiamo già visto. Facciamo proprio passo dopo passo tutto quello che succede. Più avanti ci sarà un sacco di roba che si basa su questi concetti, quindi meglio capirli alla perfezione, no?
Riprendiamo il nostro esempio con studenti e corsi. Proprio dall’inizio. Dalla creazione delle tabelle, fino a capire cosa succede in ogni fase. Pronti?
Adesso creiamo la tabella students, che servirà per salvare le info sugli studenti, e la colleghiamo alla tabella courses usando una foreign key. Così vediamo come si usano le foreign key per modellare le relazioni tra le entità.
Creazione della tabella students
La tabella students conterrà le info sugli studenti: il loro identificatore unico, il nome e la data di nascita. La creiamo con il comando CREATE TABLE.
CREATE TABLE students (
student_id SERIAL PRIMARY KEY, -- Chiave unica per ogni record
name TEXT NOT NULL, -- Nome dello studente (campo obbligatorio)
birth_date DATE -- Data di nascita dello studente
);
Cosa succede qui?
student_id SERIAL PRIMARY KEY: Questo è l’identificatore unico per ogni studente. Il tipoSERIALcrea un campo auto-incrementato, ePRIMARY KEYgarantisce che l’id sia unico per ogni riga.name TEXT NOT NULL: Campo per il nome dello studente. Abbiamo messoNOT NULLcosì nessun record può essere inserito senza nome.birth_date DATE: Campo per la data di nascita. Il tipoDATEci aiuta a gestire le date.
Se la tabella fosse una persona, student_id sarebbe il suo passaporto, name il nome ovvio, e birth_date quella cosa che a volte nascondiamo, ma per il database è fondamentale.
Creazione della tabella courses
Ora creiamo una tabella che conterrà le info sui corsi. Avrà l’id del corso, il titolo e la descrizione.
CREATE TABLE courses (
course_id SERIAL PRIMARY KEY, -- Identificatore unico del corso
title TEXT NOT NULL, -- Titolo del corso (campo obbligatorio)
description TEXT -- Descrizione del corso
);
Cosa succede qui?
course_id SERIAL PRIMARY KEY: Anche qui, campo auto-incrementato che crea un id unico per ogni corso.title TEXT NOT NULL: Campo per il titolo del corso. Abbiamo messoNOT NULLperché ogni corso deve avere un nome, ovvio.description TEXT: Campo per una breve descrizione del corso. Questo è opzionale, può anche essere vuoto (senzaNOT NULL).
Un corso senza titolo è come un libro senza copertina. Ma il database non lo permetterà!
Collegare la tabella students con la tabella courses
Immaginiamo ora che ogni studente possa essere iscritto solo a un corso. Per fare questo aggiungiamo una foreign key nella tabella courses, che farà riferimento all’id dello studente dalla tabella students.
CREATE TABLE courses (
course_id SERIAL PRIMARY KEY, -- Identificatore unico del corso
title TEXT NOT NULL, -- Titolo del corso (campo obbligatorio)
description TEXT, -- Descrizione del corso
student_id INT REFERENCES students(student_id) -- Foreign key che collega alla tabella students
);
Cosa fa student_id INT REFERENCES students(student_id)?
- Creiamo il campo
student_id, che sarà un riferimento all’id unico dello studente (student_id) dalla tabellastudents. - La relazione tra le tabelle è gestita dalla parola chiave
REFERENCES. - Questo significa che ogni volta che inseriamo dati in
courses, il valore distudent_iddeve già esistere nella tabellastudents. Se, per esempio, provi a iscrivere a un corso uno studente con unstudent_idche non esiste, ti becchi un errore.
Inserire dati nelle tabelle
Ora che le tabelle ci sono, aggiungiamo qualche studente e corso. Dai, stare in un’aula vuota è noioso, giusto?
Aggiungiamo studenti
INSERT INTO students (name, birth_date) VALUES
('Alex Lin', '2000-05-10'),
('Maria Chi', '1998-02-15'),
('Otto Song', '2001-09-25');
Aggiungiamo corsi
INSERT INTO courses (title, description, student_id) VALUES
('Basi di SQL', 'Studio della sintassi base di SQL', 1),
('Basi di dati relazionali', 'Comprensione dei modelli relazionali', 2),
('PostgreSQL per principianti', 'Installazione e configurazione di PostgreSQL', 3);
Abbiamo indicato lo student_id per ogni corso, collegandolo all’id dello studente nella tabella students.
Verificare la relazione tra le tabelle
Adesso vediamo se le nostre tabelle sono davvero collegate. Facciamo una query che mostra le info sui corsi insieme ai nomi degli studenti.
SELECT
courses.title AS course_title,
courses.description AS course_description,
students.name AS student_name
FROM
courses
JOIN
students ON courses.student_id = students.student_id;
Esempio di risultato: Risultato della query:
| course_title | course_description | student_name |
|---|---|---|
| Basi di SQL | Studio della sintassi base di SQL | Alex Lin |
| Basi di dati relazionali | Comprensione dei modelli relazionali | Maria Chi |
| PostgreSQL per principianti | Installazione e configurazione di PostgreSQL | Otto Song |
Abbiamo collegato i corsi agli studenti tramite la foreign key — e ora possiamo ottenere i dati collegati con una sola query. Ecco come funziona il modello relazionale!
Riepilogo
Spero che tutto quello che abbiamo appena visto sia stato chiaro e semplice. Perché tra poco andiamo avanti, e sarebbe bello che tu fossi sicuro delle tue conoscenze.
GO TO FULL VERSION