Informatica
Informatica
Forme normali
Le forme normali di un database sono un insieme di regole che aiutano a progettare schemi di database
efficienti e ben strutturati. L'obiettivo principale è eliminare la ridondanza dei dati e migliorare l'integrità dei
dati, evitando anomalie durante le operazioni di inserimento, aggiornamento ed eliminazione. Esistono
diverse forme normali, ognuna con requisiti più stringenti rispetto alla precedente. Le più comuni sono:
La normalizzazione è un processo iterativo. Si inizia con la 1NF e si procede verso forme normali più elevate
fino a raggiungere un livello di normalizzazione considerato adeguato per le esigenze dell'applicazione. La
scelta del livello di normalizzazione dipende da un compromesso tra la riduzione della ridondanza e la
complessità delle query. Un'eccessiva normalizzazione può portare a un numero elevato di join, che possono
influire negativamente sulle prestazioni.
1 / 38
Forme normali
Esempi di Normalizzazione
Nome_Studente dipende solo da Matricola, non dalla chiave composta → Non in 2NF
Matricola Nome_Studente
S1 Marco Neri
S2 Anna Bianchi
2 / 38
Forme normali
Iscrizioni
Matricola Cod_Corso
S1 C1
S1 C2
S2 C1
Corsi
Cod_Corso Nome_Corso
C1 Reti
C2 Basi di Dati
Docenti
ID_Docente Nome_Docente
D1 Prof. Verdi
D2 Prof. Bianchi
3 / 38
Forme normali
Database
Un database è una raccolta organizzata di dati, generalmente memorizzati e accessibili elettronicamente da
un sistema informatico. I database sono progettati per gestire grandi quantità di informazioni in modo
efficiente, consentendo agli utenti di archiviare, recuperare, aggiornare e cancellare dati in modo strutturato.
Concetti Chiave
Schema: La struttura del database, che definisce come i dati sono organizzati, inclusi i tipi di dati, le
tabelle, le relazioni e i vincoli.
Tabella: Una collezione di dati correlati organizzati in righe e colonne. Ogni riga rappresenta un record, e
ogni colonna rappresenta un attributo del record.
Record (Riga): Un insieme di campi che contengono informazioni su una specifica entità.
Campo (Colonna): Un singolo elemento di informazione all'interno di un record.
Chiave Primaria: Un attributo (o insieme di attributi) che identifica univocamente ogni record in una
tabella.
Chiave Esterna: Un attributo in una tabella che fa riferimento alla chiave primaria di un'altra tabella,
stabilendo una relazione tra le due tabelle.
Query: Una richiesta di dati da un database. Le query sono espresse in un linguaggio specifico, come
SQL.
Tipi di Database
Esistono diversi tipi di database, ognuno con le proprie caratteristiche e adatto a specifici casi d'uso:
Database Relazionali (SQL): Organizzano i dati in tabelle con righe e colonne, e utilizzano SQL
(Structured Query Language) per interrogare e gestire i dati. Esempi includono MySQL.
Database Non Relazionali (NoSQL): Offrono modelli di dati diversi dai database relazionali, adatti per
gestire dati non strutturati o semi-strutturati. Esempi includono MongoDB (database orientato ai
documenti), Cassandra (database a colonne larghe), Redis (database chiave-valore) e Neo4j (database
a grafo).
4 / 38
Forme normali
5 / 38
Forme normali
Deployment Diagram
Il Deployment diagram : è un diagramma UML (Unified Modeling Language) che mostra come i
componenti software sono distribuiti sui dispositivi hardware. I nodi (ambienti di esecuzione )
rappresentano le macchine fisiche o virtuali (come server, PC, smartphone), i componenti sono le parti
software installate su di essi (come applicazioni o database), e le connessioni indicano le comunicazioni tra
i nodi (come reti locali o Internet).
Serve a visualizzare l’architettura fisica del sistema e come interagiscono i suoi elementi.
6 / 38
Forme normali
ACID
Le proprietà ACID sono un insieme di caratteristiche che garantiscono l'affidabilità delle transazioni in un
database. ACID è un acronimo che sta per:
1. Atomicità (Atomicity):
La transazione è considerata un'unità indivisibile di lavoro.
Significa che o tutte le operazioni all'interno della transazione vengono completate con successo,
oppure, in caso di errore, l'intera transazione viene annullata (ROLLBACK).
In altre parole, non ci sono stati intermedi: la transazione è "tutto o niente".
2. Coerenza (Consistency):
Ogni transazione deve mantenere l'integrità del database.
Dopo il completamento di una transazione, il database deve passare da uno stato valido a un altro
stato valido.
La transazione deve rispettare tutte le regole e i vincoli definiti nel database (es: chiavi primarie,
chiavi esterne, vincoli di dominio).
3. Isolamento (Isolation):
Le transazioni devono essere eseguite in modo isolato l'una dall'altra.
Una transazione in corso non deve essere influenzata da altre transazioni concorrenti.
Questo significa che i risultati intermedi di una transazione non dovrebbero essere visibili ad altre
transazioni finché la prima non viene completata (COMMIT).
I livelli di isolamento (READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ,
SERIALIZABLE) controllano il grado di isolamento tra le transazioni.
4. Durabilità (Durability):
Una volta che una transazione è stata completata con successo (COMMIT), le modifiche apportate al
database devono essere permanenti.
Queste modifiche devono sopravvivere a eventuali guasti del sistema (es: crash del server,
interruzioni di corrente).
Il database deve essere in grado di ripristinare lo stato delle transazioni completate anche in caso di
problemi.
7 / 38
Forme normali
MySQL
MySQL è un sistema di gestione di database relazionale (RDBMS) open-source. In termini più semplici, è un
software che ti permette di organizzare, archiviare e recuperare dati in modo efficiente.
Caratteristiche di MySQL:
Relazionale
Open-source
Client - Server
SQL language
Ampia diffusione
8 / 38
Forme normali
MongoDB
MongoDB è un database NoSQL orientato ai documenti. Invece di utilizzare tabelle e righe come i database
relazionali, MongoDB utilizza documenti e raccolte. Un documento è un insieme di coppie chiave-valore, e
una raccolta è un gruppo di documenti.
Caratteristiche principali:
Orientato ai documenti: I dati sono memorizzati in documenti flessibili, simili a JSON, che possono
variare in struttura.
Schema-less: Non è necessario definire uno schema rigido in anticipo. Questo permette una maggiore
flessibilità e velocità di sviluppo.
Scalabilità: MongoDB è progettato per essere scalabile orizzontalmente, distribuendo i dati su più
server.
Alte prestazioni: Grazie alla sua architettura e all'utilizzo di indici, MongoDB offre buone prestazioni per
una vasta gamma di carichi di lavoro.
Supporto per indici: È possibile creare indici per migliorare le prestazioni delle query.
Replica set: Supporta la replica dei dati per garantire l'alta disponibilità e la tolleranza ai guasti.
Concetti chiave:
Esempio di documento:
{
"_id": ObjectId("64f..."),
"nome": "Mario",
"cognome": "Rossi",
"età": 30,
"indirizzo": {
"via": "Via Roma, 1",
"città": "Milano"
},
"interessi": ["programmazione", "sport"]
}
Vantaggi di MongoDB:
9 / 38
Forme normali
Svantaggi di MongoDB:
Mancanza di transazioni ACID complete: Anche se MongoDB supporta transazioni ACID, non sono
complete come nei database relazionali.
Join complesse: Le join tra raccolte sono meno efficienti rispetto ai database relazionali.
Coerenza: La coerenza dei dati potrebbe essere un problema in alcuni scenari, a seconda del livello di
coerenza configurato.
10 / 38
Forme normali
DCL
Il Data Control Language (DCL) è un sottolinguaggio di SQL utilizzato per controllare l'accesso ai dati nel
database. Si occupa principalmente di autorizzazioni, controllo degli accessi e gestione degli utenti.
GRANT: Utilizzato per concedere privilegi specifici a utenti o ruoli del database.
REVOKE: Utilizzato per revocare privilegi precedentemente concessi a utenti o ruoli del database.
Esempi
CREATE USER
Questo comando crea un nuovo utente chiamato 'newuser' che può connettersi solo da 'localhost'
e richiede la password 'password' .
2. Creazione di un nuovo utente senza specificare un host (può connettersi da qualsiasi host):
Questo comando crea un nuovo utente chiamato 'anotheruser' che può connettersi da qualsiasi host
e richiede la password 'securepassword' .
ALTER USER
Questo comando rinomina l'utente 'olduser' in 'newuser' , mantenendo l'host 'localhost' . Nota:
Questo comando potrebbe non essere supportato da tutti i DBMS.
DROP USER
1. Eliminazione di un utente:
11 / 38
Forme normali
Questo comando elimina l'utente 'anotheruser' che può connettersi da qualsiasi host.
GRANT
Questo comando concede all'utente 'user1' che si connette da 'localhost' il permesso di eseguire
query SELECT sulla tabella Employees .
2. Concessione di tutti i privilegi su un database a un utente:
Questo comando concede all'utente 'admin' che si connette da qualsiasi host ( '%' ) tutti i privilegi sul
database CompanyDB e su tutte le sue tabelle.
REVOKE
Questo comando revoca all'utente 'user1' che si connette da 'localhost' il permesso di inserire dati
nella tabella Employees .
2. Revoca di tutti i privilegi su un database a un utente:
Questo comando revoca all'utente 'admin' che si connette da qualsiasi host ( '%' ) tutti i privilegi sul
database CompanyDB e su tutte le sue tabelle.
12 / 38
Forme normali
DDL
Il Data Definition Language (DDL) è un sottolinguaggio di SQL che permette di modificare la struttura del
database.
CREATE: Utilizzato per creare nuovi oggetti del database, come tabelle, viste, indici, stored procedure,
trigger e utenti.
ALTER: Permette di modificare la struttura di un oggetto esistente nel database. Si può usare per
aggiungere, eliminare o modificare colonne in una tabella, cambiare il tipo di dati di una colonna,
aggiungere o rimuovere vincoli, ecc.
DROP: Utilizzato per eliminare oggetti dal database, come tabelle, viste, indici, ecc. È un'operazione
irreversibile, quindi va usata con cautela.
TRUNCATE: Elimina tutti i dati da una tabella, ma mantiene la struttura della tabella stessa. È più veloce
di DELETE perché non registra le singole eliminazioni nel log delle transazioni.
RENAME: Permette di rinominare un oggetto del database.
Esempi
CREATE
2. Creazione di un database:
ALTER
DROP
13 / 38
Forme normali
2. Eliminazione di un database:
TRUNCATE
COMMENT
14 / 38
Forme normali
DML
Il Data Manipulation Language (DML) è un sottolinguaggio di SQL utilizzato per accedere e manipolare i
dati in un database.
Esempi
INSERT
UPDATE
UPDATE Employees
SET Salary = 60000
WHERE ID = 1;
UPDATE Employees
SET Salary = Salary * 1.10, Department = 'Management'
WHERE Department = 'Sales';
DELETE
15 / 38
Forme normali
16 / 38
Forme normali
DQL-Group By
La clausola GROUP BY in SQL viene utilizzata per raggruppare righe che hanno gli stessi valori in una o più
colonne in un'unica riga di riepilogo. Viene spesso utilizzata in combinazione con le funzioni aggregate
(come COUNT() , SUM() , AVG() , MAX() , MIN() ) per calcolare statistiche per ciascun gruppo.
Sintassi
La sintassi di base della clausola GROUP BY è la seguente:
colonna1, colonna2, ... : Le colonne in base alle quali si desidera raggruppare i risultati.
funzione_aggregata(colonna) : Una funzione aggregata applicata a una colonna.
tabella : La tabella da cui si estraggono i dati.
WHERE condizione : (Opzionale) Una condizione per filtrare le righe prima del raggruppamento.
HAVING condizione : (Opzionale) Una condizione per filtrare le righe dopo il raggruppamento.
ORDER BY : (Opzionale) Specifica l'ordinamento dei risultati raggruppati.
Come Funziona
1. Selezione delle Righe: La clausola WHERE (se presente) filtra le righe della tabella in base alla
condizione specificata.
2. Raggruppamento: La clausola GROUP BY raggruppa le righe risultanti in base ai valori delle colonne
specificate. Tutte le righe con gli stessi valori nelle colonne di raggruppamento vengono combinate in un
unico gruppo.
3. Calcolo delle Funzioni Aggregate: Per ogni gruppo, vengono calcolate le funzioni aggregate
specificate nella clausola SELECT .
4. Restituzione dei Risultati: Viene restituita una riga per ogni gruppo, contenente i valori delle colonne di
raggruppamento e i risultati delle funzioni aggregate.
Esempi Pratici
1. Calcolare il numero di esami sostenuti da ogni studente
Spiegazione:
Questa query utilizza un LEFT JOIN per includere tutti gli studenti, anche quelli che non hanno
sostenuto alcun esame.
COUNT(e.ID_Esame) conta il numero di esami per ogni studente.
GROUP BY [Link] raggruppa i risultati per nome dello studente.
17 / 38
Forme normali
2. Trovare l'età media degli studenti che hanno ottenuto un voto superiore a
27
Spiegazione:
La subquery SELECT DISTINCT ID_Studente FROM Esami WHERE Voto > 27 seleziona gli ID degli
studenti che hanno ottenuto un voto superiore a 27.
La query principale calcola l'età media degli studenti il cui ID è presente nel risultato della subquery.
3. Calcolare la media dei voti per ogni studente, mostrando solo quelli con
una media superiore a 27
Spiegazione:
18 / 38
Forme normali
DQL-Subquery
1. Concetto di Chiusura
Definizione: In SQL, la proprietà di chiusura significa che il risultato di una query è sempre una tabella
(virtuale o meno). Questa tabella può essere utilizzata come input per altre query, incluse le subquery.
Esempio:
SELECT Nome
FROM (
SELECT Nome
FROM Studenti
WHERE Eta > 20
) AS StudentiMaggioriDi20;
2. Subquery
Le subquery sono query SQL nidificate all'interno di altre query. Il risultato della subquery viene utilizzato
dalla query principale.
Tipi di Subquery
Subquery Scalari: Restituiscono un singolo valore.
Subquery che restituiscono righe: Restituiscono una o più righe.
Subquery che restituiscono colonne: Restituiscono una o più colonne.
Utilizzo di EXISTS/ANY/ALL
EXISTS: Verifica se una subquery restituisce almeno una riga.
ANY: Confronta un valore con un insieme di valori restituiti da una subquery. La condizione è vera se
almeno uno dei confronti è vero.
ALL: Confronta un valore con tutti i valori restituiti da una subquery. La condizione è vera solo se tutti i
confronti sono veri.
Subquery Correlate: Fanno riferimento a colonne della query principale. Vengono eseguite
ripetutamente, una volta per ogni riga della query principale.
Esempio:
SELECT Nome
FROM Studenti s
WHERE EXISTS (
SELECT 1
19 / 38
Forme normali
FROM Esami e
WHERE e.ID_Studente = s.ID_Studente AND [Link] >= 28
);
WITH NomeCTE AS (
SELECT Colonne
FROM Tabella
WHERE Condizioni
)
SELECT Colonne
FROM NomeCTE
WHERE AltreCondizioni;
Esempi Pratici
1. Studenti ed Esami
2. Vendite Prodotti
20 / 38
Forme normali
COMMIT;
Esempi di Query
Subquery nella clausola WHERE
SELECT Nome
FROM Studenti
WHERE ID_Studente IN (
SELECT ID_Studente
FROM Esami
WHERE Voto = (SELECT MAX(Voto) FROM Esami WHERE ID_Esame = 2)
);
Subquery scalare
SELECT Nome
FROM Studenti s
WHERE ID_Studente =
21 / 38
Forme normali
ANY ( SELECT ID_Studente FROM Esami WHERE Voto >
( SELECT AVG(Voto) FROM Esami ) );
SELECT Prodotto
FROM Vendite
WHERE Prezzo > ALL (
SELECT Prezzo
FROM Vendite
WHERE Prodotto = 'mela'
);
CTE
WITH RicaviPerProdotto AS (
SELECT Prodotto, SUM(Quantità * Prezzo) AS TotaleRicavi
FROM Vendite
GROUP BY Prodotto
)
SELECT Prodotto
FROM RicaviPerProdotto
WHERE TotaleRicavi > 1000;
22 / 38
Forme normali
DQL
Il Data Query Language (DQL) è un sottolinguaggio di SQL utilizzato per interrogare e recuperare dati da
un database. Il comando principale del DQL è SELECT , che permette di specificare quali dati estrarre, da
quali tabelle e con quali condizioni.
Comandi DQL
SELECT: Utilizzato per recuperare dati da una o più tabelle.
SELECT: Elenca le colonne che si desidera visualizzare nel risultato della query.
FROM: Indica le tabelle da cui provengono i dati. È possibile specificare più tabelle per eseguire
operazioni di join.
WHERE: Filtra le righe in base a una o più condizioni. Le condizioni possono includere operatori logici
come AND , OR e NOT .
Opzioni in "SELECT"
La clausola SELECT offre diverse opzioni per personalizzare la selezione dei dati:
Funzioni aggregate
Le funzioni aggregate permettono di eseguire calcoli su insiemi di righe e restituire un singolo valore. Alcune
delle funzioni aggregate più comuni includono:
Opzioni in "FROM"
La clausola FROM permette di specificare diverse opzioni per la selezione delle tabelle:
JOIN (INNER, LEFT, RIGHT, FULL): Combina righe da due o più tabelle in base a una condizione di join.
Ad esempio, un INNER JOIN restituisce solo le righe che hanno una corrispondenza in entrambe le
23 / 38
Forme normali
tabelle, mentre un LEFT JOIN restituisce tutte le righe dalla tabella a sinistra e le righe corrispondenti
dalla tabella a destra (e NULL se non c'è corrispondenza).
Alias ( AS ): Assegna un nome temporaneo a una tabella. Questo è utile per semplificare le query,
soprattutto quando si utilizzano nomi di tabella lunghi o quando si fa riferimento alla stessa tabella più
volte nella stessa query. Ad esempio: SELECT * FROM customers AS c WHERE [Link] = 'New York';
Subquery: Utilizza il risultato di un'altra query come tabella temporanea. Le subquery nella clausola
FROM devono avere un alias. Ad esempio: SELECT * FROM (SELECT id, name FROM products WHERE
price > 100) AS expensive_products;
Funzioni Table-Valued: Alcuni database supportano funzioni che restituiscono una tabella, che può
essere utilizzata nella clausola FROM .
WITH Clause (Common Table Expressions - CTE): Definisce una tabella temporanea che può essere
referenziata più volte all'interno della query. Le CTE sono utili per semplificare query complesse e
migliorare la leggibilità. Ad esempio:
WITH
HighValueOrders AS (
SELECT order_id, customer_id
FROM orders
WHERE total_amount > 1000
)
SELECT
c.customer_name,
COUNT(hvo.order_id) AS high_value_order_count
FROM
customers c
JOIN
HighValueOrders hvo ON c.customer_id = hvo.customer_id
GROUP BY
c.customer_name
ORDER BY
high_value_order_count DESC;
Queste opzioni offrono flessibilità e potenza nella costruzione di query SQL complesse, permettendo di
manipolare e combinare dati da diverse fonti in modo efficace.
JOIN
Le "join" sono operazioni che combinano righe da due o più tabelle in un database basandosi su una
colonna correlata tra di loro. Immagina di avere due tabelle, una con informazioni sui clienti e un'altra con
informazioni sugli ordini. Puoi usare una join per combinare queste tabelle e ottenere un elenco di tutti i
clienti con i loro ordini corrispondenti.
24 / 38
Forme normali
SELECT *
FROM tabella1
JOIN tabella2
ON tabella1.colonna_fk = [Link];
SELECT *
FROM tabella1 t1, tabella2 t2
WHERE t1.colonna_fk = [Link];
25 / 38
Forme normali
Aggregazioni COUNT() , SUM() , AVG() , Usati con HAVING per filtrare gruppi aggregati
(HAVING) MIN() , MAX()
Alias & espressioni HAVING alias > valore Può usare alias di colonne calcolate nel
SELECT , se supportato
Gestione delle date in MySQLLa gestione delle date nella clausola WHERE
richiede un'attenzione particolare, poiché i formati delle date possono
variare a seconda del sistema di database utilizzato.
Formati Data:
Ogni database (MySQL, PostgreSQL, SQL Server, Oracle, ecc.) ha i suoi formati di data predefiniti. Alcuni
formati comuni includono:
È importante conoscere il formato di data utilizzato dal tuo database per evitare errori.
Funzioni Data:
27 / 38
Forme normali
DTL
Il Data Transaction Language (DTL) è un sottolinguaggio di SQL utilizzato per gestire le transazioni
all'interno di un database. Le transazioni sono sequenze di operazioni che vengono trattate come un'unica
unità logica di lavoro. L'obiettivo principale del DTL è garantire l'integrità dei dati, assicurando che le
transazioni siano eseguite in modo affidabile e coerente.
Esempi
BEGIN TRANSACTION (o START TRANSACTION)
BEGIN TRANSACTION;
-- oppure
START TRANSACTION;
Questo comando indica l'inizio di una nuova transazione. Tutte le operazioni successive verranno
considerate parte di questa transazione fino a quando non verrà eseguito un COMMIT o un ROLLBACK .
COMMIT
BEGIN TRANSACTION;
COMMIT;
Questo esempio trasferisce 100 unità dall'account con AccountID = 1 all'account con AccountID = 2 .
Il comando COMMIT salva in modo permanente queste modifiche nel database. Se non ci fossero stati
errori, le modifiche sarebbero state definitive.
ROLLBACK
BEGIN TRANSACTION;
28 / 38
Forme normali
ROLLBACK;
In questo esempio, se si verificasse un errore durante l'esecuzione degli aggiornamenti (ad esempio, un
vincolo di integrità violato), il comando ROLLBACK annullerebbe tutte le modifiche, riportando gli account
al loro stato originale.
SAVEPOINT
BEGIN TRANSACTION;
COMMIT;
In questo esempio, vengono creati due punti di salvataggio ( sp1 e sp2 ). Se si decide di annullare le
modifiche a partire da sp2 , il comando ROLLBACK TO SAVEPOINT sp2 annullerà solo l'ultimo
aggiornamento, riportando l'account 4 al suo stato precedente, ma manterrà la modifica all'account 3. Il
comando COMMIT salverà quindi la modifica all'account 3.
29 / 38
Forme normali
SQL language
SQL, acronimo di Structured Query Language, è il linguaggio standard per interagire con i database
relazionali (usato anche da MySQL). SQL è il linguaggio usato per chiedere informazioni, aggiungere nuovi
dati, modificare quelli esistenti e gestire l'intera struttura dell'archivio.
SQL si divide in diversi "sottolinguaggi" a sua volta:
DDL (Database Definition Language): linguaggio che si occupa della struttura del database.
DML (Database Manipulation Language): linguaggio che si occupa della manipolazione dei dati del
database.
DQL (Database Query Language): linguaggio che si occupa delle richieste (query) al database.
DCL (Database Control Language): linguaggio che si occupa della gestione utenti che hanno accesso
al database.
DTL (Database Transaction Language): linguaggio che si occupa delle transazioni sul database.
Connessione in php
Per connettersi al database in php con sql bisogna fare i seguenti passaggi:
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "nome_db";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
1. Maniera diretta:
if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_assoc()) {
echo "id: " . $row["id"]. " - Name: " . $row["firstname"]. " " .
$row["lastname"]. "<br>";
}
} else {
echo "0 results";
}
$conn->close();
2. Prepared statement:
30 / 38
Forme normali
$id = 1
$stmt = $conn->prepare($query);
L'utilizzo dei prepared statement è consigliato per prevenire attacchi di SQL injection, in quanto i dati
vengono trattati separatamente dalla query, evitando che codice malevolo possa essere iniettato. Inoltre, i
prepared statement possono migliorare le performance, soprattutto in caso di query ripetute con parametri
diversi, in quanto la query viene compilata una sola volta.
31 / 38
Forme normali
Indice: Crea un indice nella prima pagina che rimandi alle singole richieste del testo.
Identifica entità, attributi e relazioni, motivando accuratamente le tue scelte. Questo è particolarmente
importante in sede d'esame.
Ambito: L'ambito generale del problema non deve essere considerato un'entità.
Diagramma: Disegna il modello E/R completo, indicando i versi delle associazioni.
Descrizione: Descrivi ogni entità e ogni attributo, specificando valori di default, range di valori, ecc.
Regole di lettura: Descrivi ogni relazione, aggiungendo le regole di lettura per validarne la correttezza.
Verifica: Dopo aver completato il modello E/R, rileggi il testo e le interrogazioni richieste per verificare
che ogni dato necessario sia presente come attributo di un'entità.
32 / 38
Forme normali
Implementa una semplice pagina web richiesta dalla traccia utilizzando HTML, CSS e JavaScript.
1. Lettura Attenta: Leggi attentamente il testo più volte prima di definire il modello dei dati.
2. Ambito: L'ambito del problema non è un'entità.
3. Regole Generali: Sostantivi = entità, aggettivi/proprietà = attributi, verbi = associazioni.
4. Output: Considera attentamente le richieste di output e le interrogazioni per determinare gli attributi
necessari.
5. Normalizzazione: Attributi descrittivi ripetuti devono diventare entità separate (es: Comuni, causali,
tipologie) con una relazione 1:N. Queste diventeranno tabelle di decodifica (codice, descrizione).
6. Motivazione: Motiva le tue scelte, evidenziando ipotesi aggiuntive e vincoli introdotti.
7. Entità Dinamiche: Le entità dinamiche (movimenti) hanno una data di registrazione e possono avere
una chiave autoincrementale (ID).
8. Verifica Finale: Dopo aver disegnato il modello E/R, rileggilo e usa le regole di lettura per controllare la
correttezza.
1. Tipi di Dato: I campi non usati in calcoli sono di tipo testo (stringa) (es: telefono, partita IVA, CAP).
2. Esempi: Fornisci esempi di dati per ciascuna tabella per facilitare la comprensione.
3. Regole di Lettura: Esplicita le regole di lettura per ogni relazione.
33 / 38
Forme normali
Note Generali
Tempo: La prova dura 6 ore. Scrivi in modo chiaro e ordinato, con caratteri leggibili.
Schemi: Utilizza schemi per organizzare le informazioni.
Suddivisione: Suddividi il lavoro in fasi.
34 / 38
Forme normali
Viste
Le viste in SQL sono tabelle virtuali basate sul risultato di una query. A differenza delle tabelle normali, le
viste non memorizzano fisicamente i dati, ma agiscono come una "finestra" attraverso cui è possibile
accedere ai dati provenienti da una o più tabelle sottostanti.
Tipi di viste
Viste semplici: Basate su una singola tabella e non contengono funzioni di aggregazione o
raggruppamenti.
Viste complesse: Basate su più tabelle, possono contenere join, funzioni di aggregazione,
raggruppamenti e altre operazioni complesse.
Viste materializzate: (Non supportate da tutti i DBMS) Memorizzano fisicamente i dati risultanti dalla
query, migliorando le prestazioni ma richiedendo un aggiornamento periodico.
Esempio pratico
Supponiamo di avere un database con due tabelle: clienti e ordini . Vogliamo creare una vista che
mostri il nome del cliente e il numero di ordini effettuati da ciascun cliente.
35 / 38
Forme normali
LEFT JOIN ordini o ON c.id_cliente = o.id_cliente
GROUP BY [Link];
In questo esempio:
Semplicità: Le viste semplificano le query complesse, rendendo più facile l'accesso ai dati.
Sicurezza: Le viste consentono di limitare l'accesso ai dati, proteggendo le informazioni sensibili.
Flessibilità: Le viste possono essere modificate senza influire sulle applicazioni che le utilizzano.
Consistenza: Le viste garantiscono che i dati siano presentati in modo coerente, indipendentemente
dalla complessità dello schema sottostante.
Prestazioni: Le viste complesse possono influire sulle prestazioni delle query, in quanto il database deve
eseguire la query sottostante ogni volta che la vista viene interrogata.
Aggiornabilità: Non tutte le viste sono aggiornabili. Le viste che coinvolgono join, aggregazioni o altre
operazioni complesse potrebbero non essere modificabili direttamente.
36 / 38
Forme normali
Trigger
I trigger in MySQL sono blocchi di codice SQL che vengono eseguiti automaticamente in risposta a
determinati eventi che si verificano su una tabella. Sono simili a "listener" o "event handler" che monitorano
le operazioni sul database e scatenano un'azione specifica quando si verifica un evento predefinito.
Tipi di trigger
Tempistica (Timing):
BEFORE : Il trigger viene eseguito prima che l'evento si verifichi (es: prima di un inserimento).
AFTER : Il trigger viene eseguito dopo che l'evento si è verificato (es: dopo un aggiornamento).
Evento (Event):
INSERT : Il trigger viene eseguito quando viene inserita una nuova riga nella tabella.
UPDATE : Il trigger viene eseguito quando una riga esistente viene modificata.
DELETE : Il trigger viene eseguito quando una riga viene eliminata.
BEFORE INSERT
AFTER INSERT
BEFORE UPDATE
AFTER UPDATE
BEFORE DELETE
AFTER DELETE
All'interno del codice del trigger, è possibile accedere ai valori delle righe interessate dall'evento tramite le
parole chiave NEW e OLD :
37 / 38
Forme normali
OLD : Contiene i valori della riga prima della modifica (per UPDATE e DELETE ).
Esempio pratico
Supponiamo di avere una tabella ordini con le colonne id_ordine , data_ordine e importo . Vogliamo
creare un trigger che aggiorni automaticamente una tabella di log ( log_ordini ) ogni volta che viene inserito
un nuovo ordine.
In questo esempio:
I trigger possono influire sulle prestazioni del database, soprattutto se contengono codice complesso.
È importante testare accuratamente i trigger per evitare effetti collaterali indesiderati.
I trigger possono rendere più difficile la manutenzione del database, in quanto la logica di business è
distribuita tra le tabelle e i trigger.
38 / 38