Sei sulla pagina 1di 224

i manga delle scienze

Database

MANA TAKAHASHi
SHOKO AZUMA
TREND-PRO Co., LTD.
sommario

prefazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . IX

1
che cos’è un database? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
A che cosa servono i database? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
Che succede nel regno? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
I dati vengono duplicati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
I dati possono entrare in conflitto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
I dati sono difficili da aggiornare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Un database: ecco la soluzione! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Come si usa un database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Riassumendo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

2
che cos’è un database relazionale? . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

La terminologia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
I database relazionali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
I modelli di database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Operazioni di estrazione dei dati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Gli operatori di insieme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Gli operatori relazionali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
Domande . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Il database relazionale vince! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
Riassumendo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
Risposte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

3
progettiamo un database! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49

Il modello E-R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
Normalizzare una tabella . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
Che cos’è il modello E-R? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
Come si analizza il modello E-R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
Caso 1: associazioni uno-a-uno . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
Caso 2: associazioni uno-a-molti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Caso 3: associazioni molti-a-molti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Domande . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
Normalizzare una tabella . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
Domande . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
I passi per progettare un database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
Riassumendo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
Risposte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
4
impariamo il linguaggio SQL! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85

SQL: come usarlo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86


La ricerca dei dati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
L’estrazione dei dati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
Unire le tabelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
Creare una tabella . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
Panoramica su SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
La ricerca dei dati con l’istruzione SELECT . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
Stabilire le condizioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
Gli operatori di confronto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
Operatori logici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
I pattern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
Le ricerche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
Domande . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
Le funzioni di aggregazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
Aggregare i dati con l’operatore di raggruppamento . . . . . . . . . . . . . . . . . 110
Domande . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
La ricerca dei dati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
Usare una subquery . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
Usare una subquery correlata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
Domande . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
Unire le tabelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
Creare una tabella . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
Inserire, aggiornare o cancellare le righe . . . . . . . . . . . . . . . . . . . . . . . . . . 116
Creare una vista . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
Domande . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
Riassumendo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
Risposte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119

5
facciamo funzionare un database! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125

Che cos’è una transazione? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126


Che cos’è un blocco? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
Sicurezza e database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
L’indicizzazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
Ripristino in caso di malfunzionamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
Le proprietà delle transazioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
Atomicità . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
Coerenza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
Isolamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
Durabilità . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
In caso di disastro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
Le tipologie di fallimento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
I checkpoint . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
Domande . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162

vi sommario
Gli indici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
Domande . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
Ottimizzare una Query . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
I cicli annidati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
Sort Merge (ordina e unisci) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
Hash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
L’ottimizzatore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
Riassumendo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
Risposte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167

6
i database sono ovunque! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169

I database in uso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175


I database e il web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
Database distribuiti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
Le procedure archiviate e i trigger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
I database nel web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
Usare le procedure archiviate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
Domande . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
Che cos’è un database distribuito? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
La distribuzione orizzontale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
La distribuzione verticale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
Partizionamento dei dati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
Il partizionamento orizzontale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
Il partizionamento verticale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
Prevenire le incoerenze con un commit a due fasi . . . . . . . . . . . . . . . . . . . . . . 199
Domande . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
La replicazione di un database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
La modalità di sola lettura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
La replicazione con accesso a tutti i server . . . . . . . . . . . . . . . . . . . . . . . . 202
Ulteriori applicazioni dei database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
I database orientati agli oggetti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
Riassumendo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
Risposte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
Conclusioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205

appendice
le istruzioni SQL più usate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207

indice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209

sommario vii
prefazione
I database rappresentano una delle componenti fondamentali
di tutti i sistemi aziendali informatici . Alcuni lettori di questo
libro potrebbero prendere in considerazione l’idea di introdurre i
database nella loro esperienza quotidiana di lavoro . Altri potrebbero
avere l’esigenza di sviluppare sistemi basati su database . Il database
è la tecnologia che supporta da dietro le quinte questi sistemi e non
è semplice comprendere la sua vera natura .
Questo libro è concepito per consentirvi di imparare i rudimenti
dei database attraverso la lettura di un manga . Alla fine di ogni
capitolo troverete esercizi pratici di verifica e approfondimento delle
nozioni che avrete appreso . Ogni capitolo è strutturato in modo da
associare alla comprensione della tecnologia dei database la verifica
pratica della vostra comprensione .
La struttura di questo libro è la seguente .
Il Capitolo 1 spiega perché usiamo i database . Perché i database
sono necessari? Quali problemi dobbiamo affrontare se non usiamo
i database? Apprenderete quindi informazioni di base sul loro
utilizzo .
Il Capitolo 2 affronta la terminologia specifica . Scoprirete
diversi modelli di database e altri termini legati ai database .
Il Capitolo 3 spiega come progettare un database, nello specifico
un database relazionale (quello più diffuso) .
Il Capitolo 4 è dedicato a SQL, un linguaggio usato per gestire i
database relazionali . Grazie a SQL imparerete a gestire con facilità i
vostri dati .
Il Capitolo 5 spiega la struttura di un sistema basato su
database . Visto che consente di condividere dati tra molti utenti,
imparerete a farlo nel modo più sicuro .
Il Capitolo 6 è dedicato alle applicazioni per database .
Imparerete come vengono usati i database Web-based o di altro
tipo .
Questo libro è il frutto della collaborazione di molte persone:
Shoko Azuma per il fumetto, TREND-PRO per la produzione e
Ohmsha per la supervisione, l’editing e il marketing . A tutte le
figure coinvolte rivolgo i miei ringraziamenti .
Spero che questo libro si rivelerà utile a tutti i lettori .

MANA TAKAHASHi
1
che cos'è un database?
a che cosa servono i database? clang
clang
fr
puff ag
ol
e
pant

M
el
o
ni
me
le

a
bla bl

o
r eg n di Ko d

non si arrabbi
così!

ma...

principessa
ruruna!
la
be
ne
di
zi
il regno o ne
...guarda quante di kod... “la de
cose devo ancora terra dei ll
a
una montagna!
fare! frutti” te
r ra

il raccolto
quest'anno
sarà molto
abbondante!

dovrebbe essere
contenta di come
vanno le cose.
Ooh...

vorrei solo
Ugh! poter gestire
tutto in modo
ecco, tenga. più efficiente.

lei sa che i nostri rto


repa sono sicura
archivi sono logis
tica buon
che è un
gestiti grazie a lavoro,
sistema
dei file creati... repar
to allora!
ven dit
e ultra-
ester
e efficiente.

reparto
...dal reparto esportazione
la di da la
logistica, dal la di dum!
reparto vendite
estere e dal reparto
esportazione, vero? !
sb a m

sì.

3
mi chiedo se non
mmm... sia poco efficace principessa
gestire tutti i dati in ruruna!
base al reparto da
cui provengono..

quando il prezzo
delle mele è sbam!
salito, l'altro
giorno, è stato un
bel grattacapo.

oh, cain, da mio padre?!


sei tu? che
succede?

ho un
regalo da
parte del
re.

...
o
tr
ie
se i miei genitori a? d
es s
d
a
vivessero ancora al n ci p
Pri
po

dovete
m

castello sarebbe tutto


te

proprio
e

molto diverso...!
ch

andare?
al
qu

izz
str izz
str
cain, ti
i viaggi all'estero affido fai la
fanno parte ruruna brava.
dei miei doveri durante
istituzionali! la nostra s-sì,
assenza. maestà!
oh-oh-oh

...
mi costringete a
incredibile! te lavorare
n
e
cla n s
g e
r

p
cla ng
al e partite in vacanza
cla ng
senza di me! ancora
o
m

non ci credo!
ia
rn
to

che
rabbia!
si calmi,
la
prego.

il re ha deciso
di partire perché una
be' un
si fida di lei, lettera?
pacchet-
principessa
to...
ruruna.

allora?
cosa mi ha
e una
spedito?
lettera.

che cos'è un database? 5


“in una terra
lontana che abbiamo
visitato abbiamo
trovato un libro che
parla di uno strumento
rivoluzionario.

la persona
che ce l'ha consegnato
ci ha detto che questa
tecnica segreta si
chiama database.

abbiamo sentito
che il database è un
sistema che permette
di condividere, gestire
e usare i dati.

ma come viene
utilizzato dipende da chi
legge questo libro.

poi ci ha
consegnato il libro,
nella convinzione
che il regno di kod
l'avrebbe usato per
scopi pacifici.

ruruna...
ma per piacere!
voi non avete idea
...usa questo di quanto mi sento
libro per il stressata!
progresso
della nostra
nazione.”
strapp
strapp!

oh, com'è
vecchio...

ma che cavolo?! frusc

sì, funziona...
non si apre.

ma è chiuso.

mmm...

forse con
c l ic k !
questa chiave?
l'ho trovata nella busta...

oom!
Ka-b
?! ack!

Coff
coff

Aaahhh!

!!!
allora?

dove mi
trovo?

e tu chi
sei?
e voi chi
siete? un
fantasma?!
?!
s-s-
siamo nel
c-castello
di kod.

ma vola...? Zip!

io sono cain!
l'assistente
della
principessa
ruruna di kod.

No!
uffa!
una fatina?
che sgarbata!
io sono tico.

sono una fatina.

n
o u
s on !
n m a
... no antas
f
Flump!
ma solo chi ha
aperto il libro
può vedermi. aaaah!

ih-ih!

questo libro
proprio
possiede poteri
così.
soprannaturali,
può aiutare
chi lo apre a
usare le sue
conoscenze... Ta
sei uscita
- da
da quel ...in modo !
libro? appropriato.

...

ma... allora
sì! ci aiuterai?

che cos'è un database? 9


be', tutto
sommato
sembra
immagino
abbastanza
di sì.
innocua...
già...

basta parlare
di me! avete
aperto il libro
per imparare
va bene,
tutto sui
allora,
database...
comincia-
mo.

...non è così? per


creare un
database...

sarà pure
una domanda
banale...
ferma un
momento!

...ma che cos'è un


database?

oh, non
sapete gestisco
cosa sia? numeri e valori
avete a che collegati
clienti e
fare con molti a diversi
vendite
valori e molti prodotti,
generando file
numeri, giusto? a seconda dei
reparti.
Prodo
tto

vendit
e
clie
nte

sì, e ho
oh, quindi stai
molti
gestendo i dati in
problemi...
modo scoordinato,
divisi per reparto.

mmmh
significa mela: 100au mela: 100au mela: 100au
che i dati vengono
duplicati in ogni
reparto, giusto?

reparto reparto reparto


mm, mm logistica vendite estere esportazione

la valuta corrente nel regno


di kod è l'oro (au), giusto?

secondo
esatto. kolone,

“è un
sistema
efficiente,”

ma...
e ogni reparto ha
i propri dati.

...qualche volta
abbiamo dei
problemi.

come il
caos dell'altro
giorno!

che cos'è un database? 11


già, quando il già, è salito
prezzo delle da 100au a 120au,
mele è salito. se non ricordo
male.

impennata del prezzo di una merce

mm, mm

ho informato aumentate il
prezzo a 120au! uno dei reparti
tutti i si è scordato di
reparti del modificarlo.
cambiamento di
prezzo, ma...

S h ock! stavo dormendo...

non ho
ricevuto
il tuo
messaggio...

ma...?

vendite
estere

mela 100au

il prezzo resta come prima!

12 capitolo 1
un altro reparto
Ca o s !
non solo... ha modificato per
sbaglio il prezzo a
300au.

mela: 120au mela: 100au mela: 300au


ugh, a
ripensarci
mi vengono
i brividi...

ma è p e rc
hé...?
giusto?
che e!
strano... c'è un error

reparto vendite reparto


reparto
estere esportazione
logistica

i dati nei un bel problema,


rispettivi soprattutto per
reparti cain! ha dovuto
erano in viaggiare per tutto
conflitto, il regno...
giusto?
...per
correggere
Sigh gli errori. già...
:
la
m e 0a u il prezzo
12
delle mele
non è giusto...

correggete
il prezzo,
per favore!

cavoli.

proprio
così! non si è ancora
ripreso...

che cos'è un database? 13


mio padre ha detto,
“in futuro dovremo
far vedere ai turisti la
raccolta della frutta!”

ma secondo
me non siamo
ancora pronti. no d
ella fr utta
r eg
, il
k od
a
u ti
en
la fa nv
allarghiamo gli

e
b
semplice, affari usando il
lui. nostro sistema
consolidato.
ah ah ah!

che rabbia!
ma... il mio
se dovessimo
lavoro non
ampliare gli affari
si ridurrà di
sarebbe impossibile
certo, così!
gestire i dati con il
sistema attuale.
sì calmi,
la
i dati si prego!
mischierebbero
tra loro...

anche se farete del


be', allora ogni volta vostro meglio, la
che cambia qualcosa gestione dei dati
dovete aggiornare sarà sempre un
e confermare i dati, incubo, non è così?
mi sembra una bella
fatica.

se aprite un nuovo
canale di vendita
dovrete creare
nuovi file per il
nuovo reparto.
un mucchio di
documenti

14 capitolo 1
un sistema in davvero?
cui i dati sono
condivisi da
tutti si chiama
database.

se lo usaste ì!
già, non s
dovreste
o
gestire così
c
tanti dati inutili.
è possiamo avere
un sistema molto
più efficiente di
quello attuale?

visto
che sei
certo! così in non puoi farlo
un'idea che gamba...
vale la pena tu?
considerare,
no?
...
ih
ih

non ho un corpo ...ti insegnerò


tangibile, non tutto. ma dovrai per me e
posso usare i impegnarti al per il mio
computer nel massimo! regno...
mi
mondo reale. spiace.

capisco.

lo farò!

ma per
ringraziarti di
avermi fatta
uscire dal libro... Oh, princi-
pessa!
che succede nel regno?
Il Regno di Kod gestisce i suoi dati con un sistema di file informatici. Ma sembra che
questo sistema abbia qualche problema. Quali, nello specifico? Osserviamo il sistema da
vicino.
Nel regno ci sono attualmente tre reparti: il Reparto Logistica, il Reparto
Vendite Estere e il Reparto Esportazioni. Il Reparto Logistica tiene traccia di tutta la
frutta prodotta nel Regno. Il Reparto Vendite Estere gestisce i contatti con i partner
commerciali del Regno, mentre il Reparto Esportazioni registra tutte le spedizioni di
frutta del Regno.

PrincipesSa
Ruruna

reparto reparto reparto


logistica vendite esportazioni
estere

i dati vengono duplicati


Il sistema attuale non soddisfa la Principessa Ruruna. Perché? Ogni reparto del Regno
gestisce i dati in maniera autonoma. Per esempio, il Reparto Logistica e il Reparto
Esportazioni generano i propri file per gestire le informazioni sulla frutta. Questo significa
che si crea un'inutile duplicazione dei dati tra i reparti. Ogni reparto deve inserire i dati,
conservarli e stampare moduli di conferma, uno spreco insomma. In aggiunta, i dati
posseduti da un reparto non sono mai condivisi con gli altri reparti.

PrincipesSa I dati sono duplicati.


Ruruna

reparto reparto
reparto
logistica vendite esportazioni
estere

16 capitolo 1
E non è tutto. Il sistema può generare problemi quando qualcuno deve modificare i
dati. Ipotizziamo per esempio che il prezzo delle mele cambi. Per gestire questa modifica
la Principessa Ruruna deve informare del cambiamento ogni reparto individualmente. Non
è scomodo?

principesSa
Ruruna
La Principessa deve
inviare un messaggio
a ogni reparto.

reparto
reparto reparto
vendite
logistica esportazioni
estere

i dati possono entrare in conflitto


Potrebbe sembrare semplice notificare a tutti i reparti che il prezzo delle mele è cambiato,
ma possono insorgere dei problemi. Ipotizziamo che la Principessa Ruruna comunichi ai
tre reparti che il prezzo delle mele è cambiato. Il Reparto Vendite Estere, però, potrebbe
dimenticarsi di modificare il prezzo, oppure il Reparto Esportazioni potrebbe portarlo a
300Au, invece che a 120Au. Questi errori provocano un conflitto tra i dati presenti nei
reparti: il dato contenuto nel sistema è diverso dal dato reale. Un bel problema!

cambiate il
prezZo delLe mele da
100au a 120au.
principesSa
Ruruna

I dati potrebbero
essere discordanti.

reparto logistica reparto vendite estere reparto esportazioni

Prodotto Prezzo/pz. Prodotto Prezzo/pz. Prodotto Prezzo/pz.


Melone 800Au Melone 800Au Melone 800Au
Fragola 150Au Fragola 150Au Fragola 150Au
Mela 120Au Mela 100Au Mela 300Au
Lemon 200Au Lemon 200Au Lemon 200Au

che cos'è un database? 17


i dati sono difficili da aggiornare
Il sistema attuale non solo crea conflitti tra i dati, ma rende anche difficile rispondere alle
esigenze del mercato. Per esempio, mettiamo che il Re voglia lanciare un nuovo Reparto
Turismo. Quando una guida accompagnerà i turisti per i frutteti e li intratterrà con i dati di
vendita del Regno, sicuramente vorrà avere accesso alle cifre più aggiornate disponibili.
Sfortunatamente il sistema attuale non consente a un reparto di accedere ai dati
degli altri reparti, visto che i file sono gestiti individualmente. Per gestire il nuovo business
turistico, la Principessa Ruruna dovrà trasferire tutti i dati rilevanti all'interno del Reparto
Turistico!

Cain

reparto reparto reparto


logistica turismo esportazioni

Bisogna creare
nuovi file.

file per il reparto logistica file per il reparto turismo

Prodotto Prezzo/pz. Prodotto Prezzo/pz.


Melone 800Au Melone 800Au
Fragola 150Au Fragola 150Au
Mela 120Au Mela 120Au
Limone 200Au Limone 200Au

Questo, a sua volta, aumenta il rischio di duplicazioni ogni volta che nasce un
nuovo reparto. Alla luce di questi punti deboli, il sistema attuale non è efficiente. Rende
complessa l'apertura di nuovi progetti e la reattività agli stimoli esterni.

18 capitolo 1
un database: ecco la soluzione!
In definitiva, perché questo sistema è così inefficiente? I problemi derivano tutti dalla
gestione separata e indipendente dei dati. Ma allora che dovrebbero fare Ruruna e Cain?
Dovrebbero creare un database! E questo significa unificare la gestione di tutti i dati del
Regno. Nel prossimo capitolo vedremo come fare.

principesSa
Ruruna

Database
I dati sono accessibili
a chiunque.

reparto reparto
reparto
vendite esportazione
logistica
estere

Uniformare la gestione dei dati ci assicura che ogni reparto disponga delle
informazioni corrette, perché ogni reparto lancerà un'interrogazione (query) per ogni
singolo dato. Un sistema davvero efficiente! Evita i conflitti ed elimina le duplicazioni dei
dati, facilitando al contempo l'introduzione e l'integrazione di nuovi reparti.

come si usa un database


Per impostare e utilizzare un database è necessario comprendere le sue caratteristiche
peculiari. Per prima cosa, un database viene usato da molte persone, e quindi occorre
trovare un modo per consentire facilmente di inserire ed estrarre i dati da esso. Un
metodo che sia facile e comodo per tutti.

principesSa
qual è il Ruruna
prezZo in au Database qual è stato
delLe mele? il volume di vendite
il 5 marzo?

reparto reparto
reparto
vendite esportazione
logistica
estere

Il nuovo sistema presenta anche qualche rischio: per esempio, gli utenti potrebbero
rubare o sovrascrivere informazioni importanti o confidenziali, come gli stipendi. Questi
dati devono essere quindi protetti con delle restrizioni di accesso. Oppure potrebbero
esserci informazioni (per esempio i dati di vendita) che devono essere accessibili solo al
Reparto Esportazione. Impostare i criteri di sicurezza e i permessi è fondamentale, quando
si progetta un database.

che cos'è un database? 19


principesSa
Ruruna
io non posSo
acCedere ai dati Database io posSo
di vendita. acCedere ai dati
di vendita.

reparto reparto
reparto
vendite esportazione
logistica
estere

Il nuovo sistema può presentare altri problemi. Il database potrebbe essere utilizzato
da molte persone contemporaneamente. Ipotizziamo che qualcuno al Reparto Vendite
Estere e qualcuno al Reparto Esportazioni decidano di cambiare nello stesso istante il
nome a un frutto (per esempio, il primo da Mela a ML e il secondo da Mela a MLA.) Quale
sarà il nome definitivo del prodotto? Se il database verrà usato da molte persone bisogna
prendere in considerazione questa eventualità.

principesSa
Ruruna

Database
ml?
mla?

reparto reparto
reparto
vendite esportazione
logistica
estere

Dovrete fare anche attenzione a non perdere nessun dato. Potrebbe anche capitare
che il database vada in crash, o che un errore del disco rigido provochi la corruzione di
qualche dato. Il database deve possedere meccanismi in grado di recuperare i dati in
queste situazioni piuttosto comuni.

Database
Bisogna prepararsi
a gestire i fallimenti.

20 capitolo 1
Inoltre, anche se il database conterrà un'enorme quantità di dati, dovremo comunque
poter eseguire ricerche molto veloci. Il nuovo sistema dovrà essere in grado di gestirle.
Iniziamo lo studio dei database insieme alla Principessa Ruruna e a Cain, e impareremo
a risolvere questi problemi. Andiamo al Capitolo 2!

riassumendo
• Una gestione basata sui file può generare conflitti e una duplicazione dei dati.
• Un database ti permette di condividere facilmente i dati e di evitare conflitti e
duplicazioni.

gestire i database via software


Il database che studieremo è gestito da un software chiamato database management
system (DBMS). Un DBMS possiede molte funzioni utili e permette, tra le altre cose,
di inserire dati all'interno di un database, di evitare i conflitti e di recuperare molto
velocemente le informazioni. Grazie al nostro DBMS il database può essere usato da
molti utenti contemporaneamente. Inoltre, il DBMS può proteggere la sicurezza del
database: per esempio, consentendo al database di funzionare correttamente anche in
caso di fallimento. Infine, il DBMS fornisce un'interfaccia semplice da usare tra il database
e i suoi utenti. Studieremo i database e le funzioni di un DBMS nel prossimo capitolo.

che cos'è un database? 21


2
che cos'è un database
relazionale?
la terminologia
prendi
questi
fiori...
mia cara
ruruna.
flu
mp

...

oh,
che c'è
che non
splendida va?
principessa.

esp
ress
i miei genitori sono sto io
rdit ne
no, c'è a
partiti e io sono
cain qui
molto occupata!
con me.

mmm
cain?
sono venuto qui
proprio perché
pensavo che ti
sentissi sola.

non vorrai
insinuare che il
principe RaaaMiiiNeeesss!!
tuo assistente raminess!
!
sia più affidabile s b a m!
di un principe!
!
s b a m!

iik!
ah ah ah!
beccato!

avevi
promesso di
uscire con
me, oggi.

no... questi
ecco... sono
e chi è,
quella? ehm... per te.

fiuu!
quanto è
tira, irritante,
... tira..
. quello.
principessa
ruruna,
tornerò...
e i miei
fiori?

Plop!

ma raminess è lo so
bene...
il principe del
paese vicino.

non dovrebbe
trattarlo con
sufficienza. buongiorno!
aaAH!!
quanto sei
superficiale, non è mi cogli di
ugh! da quanto per niente una buona sorpresa
tempo sei qui? tutte le
da quando giornata. volte.
hai aperto il
libro poco
fa.

salve. ma
lasciamo
perdere.
raminess se
n'è andato,
comunque.

cominciamo a
progettare un
database.

strizz
strizz
ferma un
minuto.

non puoi costruire


partire con il aspettatemi
un database
piede giusto è qui.
senza le giuste importante.
conoscenze.

Hop!
vero...

!!!
impegniamoci
oohh... al massimo mi
o...
butt

prima di tutto,
impariamo la
terminologia dei
database.

26 capitolo 2
avete detto n-no, niente...
cosa? qualcosa?
e ha
sguisc sguisc è entrata nel tira-
computer! to
fuori
qual-
cosa...
zzz

zzz

e
not
zzo i
pre rio ns
em
a co
e u nit
questo è uno nom tto au
do 8 00
pr o
dei file che ice
cod tto u
usate. o do one 150a
pr m el
u
ola 120a
g
fra
au
20 0
a
m el
au
10 0
n e
limo
au
n a 16 0
tag
uh-uh. cas

o
cac

una riga di dati un record equivale


all'interno del a un prodotto,
file si chiama giusto?
record. ca
mp
o

r
e
c
o proprio
r
d così.

allora codice
prodotto, nome
e ogni oggetto prodotto, prezzo
nel record si chiama unitario e note
campo. sono tutti campi,
esatto?

che cos'è un database relazionale? 27


ogni record contiene
campi dello stesso tipo.

codice nome prezzo note


prodotto prodotto unitario

Melone 800au con semi

fragola 150au

mela 120au
Record

limone 200au aspro

castagna 100au col riccio

caco 160au
capisco.
pesca 130au

Kiwi 200au prezioso

campo

codice
per esempio, ...mentre nome prodotto adesso
codice prodotto ha proviamo a
prodotto è al massimo dieci considerare
un numero a caratteri in dettaglio
tre cifre... il codice
prodotto.
codice
prodotto
nome prodotto
mel on e Hmmm...
Record...
f ra g campo...
mumble...
m el a
mumble...
l i m on e

c a s t a g na qui!
in ?
c a co Ca

28 capitolo 2
non
esistono due
e non ci sono record
prodotti
duplicati, quindi se sai
con lo
che il codice di un
stesso
prodotto è 101...
codice.

puoi identificarlo
come melone.
vero.

al
prezzo
sì, è giusto.
unitario?

ho
capito.

ma nel caso
cosa succede?
del prezzo
unitario...

oh, ho ...non puoi


visto un sapere se quel
numero frutto è un
uguale. limone o un kiwi.

anche se sai
che un frutto
costa 200au...

che cos'è un database relazionale? 29


quindi è possibile
identificare un dato ...si definisce
grazie al codice univoco.
prodotto, ma non
con il prezzo
unitario. il
co
di
c e
pr
o do
tt
o
è u n iv
oco.
equivoco?

esatto. a volte è quello no,


che dicono di univoco!
mio padre...
è un
kod
nel mondo dei a h , re h io ne.
h
ah a matt
acc
o
database, un campo ve r

come questo...

vuol dire che un


è unico ed i co e ora,
! consideriamo
esclusivo.
le note.
ha un
significato
o! ben preciso,
l u s iv le note?
esc sapete?

sono come le
caratteristiche
di una persona, consideriamole in alcuni casi dentro
giusto? dal punto di vista le note non c'è
di un database. scritto niente,
o
tip e... giusto?
est
note qu
Persona
Bionda
Ruruna
Attiva
e
Bruno not capisco
Cain
tranqui i
se m dove vuoi
c on
arrivare...

come,
tranqui?
a ro
am
io
n ricc
co
non vuole dire questo vuole dire
che contengono che dalle note
note uno spazio... non è possibile
identificare un
con semi prodotto.
...sono proprio
vuote. già.

amaro

con riccio

prezioso

non può
essere "null". nel mondo dei
database, quando
codice nome prezzo
prodotto prodotto unitario note non c'è un valore si
Melone
definisce null.
800au con semi
null

fragola 150au
mela 120au
Lemon 200au amaro un valore null è
limone 100au con riccio accettabile dentro a
caco 160au una nota, ma non per un
codice prodotto, che
pesca 130au
deve identificare un
Kiwi 200au dato.

e questo null? vuoto?


esaurisce la sì...
univoco?
terminologia.

avete capito mumble


mumble...
tutto? più o
meno...

che cos'è un database relazionale? 31


se continui a usare
l'attuale sistema di hai ragione.
file indipendenti...

è per questo che


...non potrai voglio creare un
risolvere tutta una database.
serie di problemi.

ing
! Bo
Bo dati in
g
e ora dimmi !
per esempio...
come si fa! dati dati
calma!

dati dati dati dati


Shazam!
...questo è
un modello
di database
gerarchico
in cui...

quando dici
database, devi
sapere che ne ...i dati sono
esistono molti organizzati secondo
tipi diversi. una struttura ad
albero.
come per
la frutta.

davvero?

32 capitolo 2
B... B... Dat
Boing! i
poi esiste il Dati Dat
modello reticolare, i Dati
in cui i dati sono Data Dat
Dati Dati i Dat
i
collegati l'un l'altro Dati
Dati
tramite relazioni che
Dati Dati modell
si intersecano tra Dati Dati g e r a rc
o
hico
loro.

non è B...
sono pronto B...
incredibile, Bo
a tutto! ing
cain? !
Sh
az
a m
!
ma allora
useremo uno
um
di questi?
ph
!

in effetti c'è un
ZZZT! altro tipo molto
no!
più semplice da
usare di questi
Z T! due.
B a n g!
ZZ
Bang
B a n g! paura,
eh? per
che ansia! niente.

si chiama...
ih ih

...modello relazionale.

relazionale?

che cos'è un database relazionale? 33


i database relazionali

intestazione intestazione
intestazione intestazione
il modello
Dati Dati Dati Dati relazionale si basa
su una tabella a due
Dati Dati Dati Dati dimensioni.

Dati Dati Dati


Dati

ah.
B o i n g!
!
m
a
az
Sh

è di nuovo
comparso qualcosa.

mi ricorda relazione.
qualcosa. nel modello
relazionale, la
tabella viene
? ne!
to anche chiamata
vis agio
r relazione.
o
ev
av
sembra che dati
come i prodotti questa mi
siano semplici da è nuova.
mettere in tabella...

ne
zio
o ta
ca m p int
es
ti ogni gruppo di
ne
Da
colonna io ti dati, o record, viene
az Da
es
t
ti chiamato riga...
nt ti
i
Da Da
ti
Da
ne
io

ti
az

Da
st

ti
te

Da

...mentre ogni
in

ti
Da

descrizione o campo
ne

ti
io

Da
az

viene chiamato
st

ti
te

Da

colonna.
in

ti
Da

ti
Da

un'altra
parola nuova!
riga
Rec
or d

34 capitolo 2
un ruolo
può capitare a
importante?
volte che a un
campo venga
affidato un
ruolo molto
importante.
sì, per
esempio...

...il codice
prodotto, nel
questi campi file che hai
speciali sono visto poco fa.
chiamati chiavi.

quel campo be', io le tabelle


svolge un ruolo chiave le conosco bene.
primaria
importante, serve a
identificare i dati.
i dati messi dentro a
una tabella sono più
comprensibili.

questo d.
codice viene dic
e pro è uno
co
definito chiave dei vantaggi
primaria. del modello
relazionale.

anche le
persone che
non sapevo che non conoscono
ci fossero tutti i database sanno
questi termini. maneggiare i
dati così.

che cos'è un database relazionale? 35


lo sapevo,
inoltre, il ehm... alla fine è
modello matematiche? difficile...
relazionale
è costruito
in modo da
.
permettere di m..
mm
fare operazioni
matematiche sui
dati.
per niente.

codice nome prezzo nome


note
prodotto prodotto unitario prodotto

Melone 800au con semi Melone

fragola 150au fragola

mela 120au mela

limone 200au amaro limone

castagna 100au con riccio castagna

caco 160au caco

pesca 130au pesca

Kiwi 200au prezioso Kiwi

torniamo per
esempio alla
Magia!
tabella di prima.

puoi
estrarre il quando
nome del estrai una
prodotto? colonna fai
un'operazione
chiamata
proiezione.

36 capitolo 2
quindi estrarre il
nome di un prodotto è
un'operazione?

sì, è semplice.

esistono molte
altre operazioni. Così
prodo tante!
sono otto, per la tt
cartes o
ia no
precisione!
Diff
ere n
e
u nion
za

Divis
ion e

pro
iezio
ne
n e
rs ezio
inte

nzione
selez congiu
ione

un altro vantaggio
del modello
relazionale è che
puoi elaborare i
dati...

...combinando
queste
operazioni.
capisco.

che cos'è un database relazionale? 37


p...
sto m
s tomp
p
sto m am!!
sb
allora creeremo
insieme un database
relazionale per il
regno di kod, giusto?

raminess!

ma che...?

dammi il
cinque!
esatto!

ah ah ah!
il principe
raminess è maledetto...!
andato via
poco fa... Ra m
i ness
! ma con
quante
donne...?

!
sbam!

oh! eh eh!

oh, scusate.

*ihihihihih

38 capitolo 2
i modelli di database

Quando usi il termine database, a quale tipo di database ti riferisci? Esistono svariate
possibilità nella gestione dei dati. L'associazione dei dati e le procedure usate da un
database si definiscono modello. I modelli più comunemente utilizzati sono tre.
Come ho raccontato a Ruruna e a Cain, il primo tipo è il modello di database
gerarchico. In questo modello un dato "figlio" contiene solo un pezzo del dato "genitore".
Il secondo tipo è il modello reticolare in cui, a differenza del modello gerarchico, un
dato "figlio" può collegarsi a più di un dato "genitore".

Modello gerarchico Modello reticolare

Per usare correttamente uno di questi due modelli devi gestire i dati tenendo sempre
a mente la loro allocazione fisica e il loro ordine. Quindi è complicato effettuare una
ricerca flessibile e veloce dei dati usando i modelli gerarchico o reticolare.
Il terzo tipo di database si basa sul modello relazionale. Un database relazionale
elabora i dati sfruttando un concetto semplice da comprendere, la tabella. Vediamo in
dettaglio di cosa si tratta.

Modello relazionale

operazioni di estrazione dei dati

Come si estraggono i dati in un database relazionale? Puoi operare sui dati ed estrarli
utilizzando operatori matematici formalmente definiti. Esistono otto operatori principali
a disposizione che si dividono in due categorie: gli operatori di insieme e gli operatori
relazionali.

gli operatori di insieme


Unione, differenza, intersezione e prodotto cartesiano sono i quattro operatori di insieme.
Questi operatori manipolano una o più righe per produrre un nuovo insieme di righe.
In breve, essi determinano quali righe in ingresso dovranno essere fornite in uscita.
Vediamo qualche esempio usando la Tabella Prodotti 1 e la Tabella Prodotti 2.

che cos'è un database relazionale? 39


tabella prodotti 1 tabella prodotti 2

Prodotto Prezzo Prodotto Prezzo


unitario unitario
Melone 800Au Melone 800Au
Fragola 150Au Fragola 150Au
Mela 120Au Castagna 100Au
Limone 200Au Caco 350Au

unione

L'operatore unione ti permette di estrarre tutti i prodotti contenuti nella Tabella Prodotti 1
e nella Tabella Prodotti 2. Questo è il risultato:

Prodotto Prezzo
unitario
Melone 800Au
Fragola 150Au
Mela 120Au
Limone 200Au
Castagna 100Au
Caco 350Au

L'operazione di unione estrae tutte le righe dalle due tabelle e le combina insieme.
La figura seguente mostra come sono organizzati i dati delle due tabelle in seguito
all'operazione di unione. Tutte le righe della Tabella Prodotti 1 e della Tabella Prodotti 2
sono state estratte.

tabelLa tabelLa
prodotTi 1 prodotTi 2

Mela Melone Castagna


Limone Fragola Caco

40 capitolo 2
differenza

L'operatore differenza estrae righe solo da una delle tabelle. Per esempio, un'operazione
di differenza può estrarre tutti i prodotti della prima tabella che non sono inclusi nella
seconda. Il risultato dipende da quale tabella si estraggono le righe e da quale tabella si
escludono.

Prodotto Prezzo Prodotto Prezzo


unitario unitario
Mela 120Au Castagna 100Au
Lemon 200Au Caco 350Au

tabelLa tabelLa tabelLa tabelLa


prodotTi 1 prodotTi 2 prodotTi 1 prodotTi 2

Mela Melone Castagna Mela Melone Castagna


Limone Fragola Caco Limone Fragola Caco

intersezione

È anche possibile estrarre i prodotti inclusi in entrambe le Tabelle Prodotti. Questa


operazione si chiama intersezione. Ecco il risultato dell'intersezione tra le Tabelle Prodotti
1 e 2.

Prodotto Prezzo
unitario
Melone 800Au
Fragola 150Au

tabelLa tabelLa
prodotTi 1 prodotTi 2

Mela Melone Castagna


Limone Fragola Caco

che cos'è un database relazionale? 41


prodotto cartesiano

Il prodotto cartesiano è un'operazione che combina tutte le righe di due tabelle.


Consideriamo la Tabella Prodotti e la Tabella Destinazioni Export qui sotto.
L'operazione di prodotto cartesiano combina tutte le righe delle due tabelle. In questo
esempio, le righe diventano 3 x 3 = 9. Osservate che i nomi delle colonne (campi) in
queste due tabelle non sono gli stessi (diversamente da quanto accadeva negli esempi
precedenti).
tabella prodotti tabella destinazioni export

Codice prod. Nome Prezzo Codice dest. Nome destinatario


prodotto unitario
101 Melone 800Au 12 Regno di Minanmi
3
102 Fragola 150Au 23 Impero Alfa
righe
103 Mela 120Au 25 Regno di Ritol

prodotto cartesiano

Codice prod. Nome Prezzo Codice dest. Nome destinatario


prodotto unitario
101 Melone 800Au 12 Regno di Minanmi
101 Melone 800Au 23 Impero Alfa
101 Melone 800Au 25 Regno di Ritol
102 Fragola 150Au 12 Regno di Minanmi
3x3=
102 Fragola 150Au 23 Impero Alfa
9 righe
102 Fragola 150Au 25 Regno di Ritol
103 Mela 120Au 12 Regno di Minanmi
103 Mela 120Au 23 Impero Alfa
103 Mela 120Au 25 Regno di Ritol

42 capitolo 2
gli operatori relazionali
Un database relazionale è progettato in modo da permettere l'estrazione dei dati tramite
gli operatori di insieme e gli operatori relazionali. Studiamo quindi gli altri quattro
operatori specifici dei database relazionali. Gli operatori relazionali sono proiezione,
selezione, congiunzione e divisione.

proiezione

L'operazione di proiezione estrae colonne da una tabella. Nell'esempio qui sotto,


l'operazione è stata usata per estrarre solo i nomi dei prodotti inclusi nella Tabella
Prodotti.

Nome prodotto
Melone
Fragola
Mela
Limone

La proiezione in pratica è un'estrazione "verticale", come si vede qui sotto.

selezione

L'operazione di selezione può estrarre alcune righe da una tabella.

Nome prodotto Prezzo


unitario
Melone 800Au
Fragola 150Au

La selezione è come la proiezione, ma estrae le righe invece delle colonne. La


selezione in pratica è un'estrazione "orizzontale."

che cos'è un database relazionale? 43


congiunzione

L'operatore congiunzione è davvero potente: infatti permette letteralmente di congiungere


le tabelle. Vediamo un esempio, a partire dalle due tabelle qui sotto.

tabella prodotti tabella vendite

Codice prod. Nome prodotto Prezzo unit. Data Codice prod. Quantità
101 Melone 800Au 11/1 102 1.100
102 Fragola 150Au 11/1 101 300
103 Mela 120Au 11/5 103 1.700
104 Limone 200Au 11/8 101 500

Le colonne Codice Prodotto in queste due tabelle contengono la stessa informazione.


Il primo novembre sono state vendute 1.100 fragole (codice prodotto 102). La
Tabella Vendite non contiene il nome del prodotto, ma contiene il codice prodotto. In altre
parole, la Tabella Vendite permette di capire quali prodotti sono stati venduti facendo
riferimento al codice prodotto, che è la chiave primaria nella Tabella Prodotti. Il codice
prodotto nella Tabella Vendite è una chiave esterna. Congiungere le due tabelle, in
modo che la chiave esterna riferisca alla chiave primaria, permette di ottenere la tabella
seguente.

Data Codice prod. Nome prodotto Prezzo unit. Quantità


11/1 102 Fragola 150Au 1.100
11/1 101 Melone 800Au 300
11/5 103 Mela 120Au 1.700
11/8 101 Melone 800Au 500

In questo modo si crea una nuova tabella dinamica di dati di vendita, che include la
data, il codice prodotto, il nome prodotto, il prezzo unitario e la quantità. La figura qui
sotto mostra una congiunzione (l'area grigia indica una colonna che appare in entrambe le
tabelle originali).

44 capitolo 2
divisione

Per ultima c'è la divisione. La divisione è un'operazione che estrae righe le cui colonne
corrispondono a quelle di una seconda tabella, ma restituisce esclusivamente le colonne che
non compaiono nella seconda tabella. Vediamone un esempio.

tabella vendite tabella destinazioni esportazione

Codice dest. Nome dest. Data Codice dest. Nome dest.


12 Regno di Minanmi 3/5 12 Regno di Minanmi
12 Regno di Minanmi 3/10 23 Impero Alfa
23 Impero Alfa 3/5
25 Regno di Ritol 3/21
30 Regno di Sazanna 3/25

Dividendo la Tabella Vendite per la Tabella Destinazioni Esportazione si ottiene la


seguente tabella, che ti consente di trovare le date in cui la frutta è stata esportata sia
verso l'Impero Alfa che verso il Regno di Minanmi.

Data
3/5

domande

E adesso rispondi a qualche domanda per verificare se hai capito come funzionano i
database relazionali. Troverai le risposte a pagina 48.
D1
Come si chiama la chiave che fa riferimento a una colonna di una tabella diversa in un
database relazionale?

D2
La tabella seguente propone un esempio relativo ai libri. Quale elemento puoi utilizzare
come chiave primaria? Il codice ISBN (International Standard Book Number) è un
numero univoco che identifica ogni libro pubblicato. Alcuni libri, invece, potrebbero avere
lo stesso titolo.

ISBN Nome libro Autore Data pubblicazione Prezzo

che cos'è un database relazionale? 45


D3
Come si chiama l'operatore utilizzato in questo caso per estrarre i dati?

Codice dest. Nome dest. Codice dest. Nome dest.


12 Regno di Minanmi 25 Regno di Ritol
23 Impero Alfa
25 Regno di Ritol
30 Regno di Sazanna

D4
Come si chiama l'operatore utilizzato in questo caso per estrarre i dati?

Codice dest. Nome dest. Codice dest. Nome dest.


12 Regno di Minanmi 15 Regno di Paronu
23 Impero Alfa 22 Regno di Tokanta
25 Regno di Ritol 31 Regno di Taharu
30 Regno di Sazanna 33 Regno di Mariyon

Codice dest. Nome dest.


12 Regno di Minanmi
15 Regno di Paronu
22 Regno di Tokanta
23 Impero Alfa
25 Regno di Ritol
30 Regno di Sazanna
31 Regno di Taharu
33 Regno di Mariyon

46 capitolo 2
D5
Come si chiama l'operatore utilizzato in questo caso per estrarre i dati?

Codice dest. Nome dest. Codice dest. Data


12 Regno di Minanmi 12 3/1
23 Impero Alfa 23 3/1
25 Regno di Ritol 12 3/3
30 Regno di Sazanna 30 3/5
12 3/6
25 3/10

Codice dest. Data Nome dest.


12 3/1 Regno di Minanmi
23 3/1 Impero Alfa
12 3/3 Regno di Minanmi
30 3/5 Regno di Sazanna
12 3/6 Regno di Minanmi
25 3/10 Regno di Ritol

il database relazionale vince!

In un database relazionale puoi usare fino a otto operatori diversi per estrarre i dati. I
risultati sono forniti sotto forma di tabella. Combinando le operazioni che hai imparato a
conoscere in questa sezione potrai ottenere qualsiasi tipo di dato. Per esempio, puoi usare il
nome e il prezzo di un prodotto per creare una tabella aggregata con i risultati di vendita. I
database relazionali sono molto diffusi perché sono semplici da capire e molto flessibili nella
gestione dei dati.

che cos'è un database relazionale? 47


riassumendo

• Una riga di dati si chiama record, mentre le colonne si chiamano campi.


• Una colonna che può essere usata per identificare i dati viene chiamata chiave
primaria.
• In un database relazionale puoi elaborare i dati usando il concetto di tabella.
• In un database relazionale puoi elaborare i dati utilizzando delle operazioni
matematiche.

risposte

D1 Chiave Esterna.
D2 ISBN.
D3 Selezione.
D4 Unione.
D5 Congiunzione.

48 capitolo 2
3
progettiamo un database!
il modello e-r

p s st

...giusto,
giusto.
t
Pss
c s c ma che cosa
rus fru
f gli è preso a
cain?

p s st
cain? dove non la
sei? smette di
mormorare
strane parole...

...database, o buongiorno, oh, cain...


robe così... ragazze!

principessa b-buon
shh! ruruna! giorno!

...

oh, ci sono. cain!

ho capito.
buongiorno,
tico.

oh, cain, devi stare più


salve, attento!
principessa
ruruna.

buongiorno,
ruruna! cosa?

soltanto noi e se continui mi scusi... ha


due possiamo a parlarle in ragione.
vedere tico. presenza di
altre persone
sembri strano.

vero.
sembri allora, di
matto!
cosa stavate
oh! parlando?

faccio fatica a capire ottimo


lavoro! è da stamattina
da dove si parte
che ci lavorate,
per progettare un
immagino.
database. quindi stavo
chiedendo aiuto a
tico.

e...?

progettiamo un database! 51
prima di tutto secondo tico ci vorrà un
bel pezzo...
abbiamo stabilito l'approccio corretto
che potremmo richiede di creare un
facilmente creare modello e analizzare la
gestione attuale delle
un database...
esportazioni sulla
base di questo
modello.
Ko
d

la prego, si
accomodi.

grazie.

...se solo potes-


simo capire qual è LA
situazione AttUALE del dobbiamo
regno di kod... studiare qualcosa
di nuovo.
ecco, più o meno è tutto.

allora, siete
pronti?
per l'analisi
useremo un
modello
chiamato...

...modello e-r!

entità e
e sta per entità, relazione...
mentre r sta per
relazione.

à
tit nemmeno
= En io.
E
R = R
ela zion
e
...non credo
e-r...? di capire...

52 capitolo 3
Plunk!!
il modello
e-r richiede di ora mi
considerare il spiego
mondo secondo i meglio...
concetti di entità
e relazione.

Plunk!!

entità si per esempio, nel mondo


riferisce a dell'esportazione della
un oggetto frutta, la frutta di per sé
esistente nel e le nazioni destinatarie
mondo reale. possono essere
considerate entità.

scr
ib
scr
ib
Sc
ree scrib
k!! scrib

e quando si codice prodotto


associano
le entità con frutta
nome prodotto
le relative
proprietà si
prezzo unitario
ottiene...

codice dest.

reek!! nazioni
destinatarie
Sc nome dest.

progettiamo un database! 53
così avete ma in cosa consiste
analizzato la la relazione?
frutta e le nazioni
destinatarie.

si riferisce al
modo in cui le
entità sono
collegate tra
loro. per esempio...

quindi frutta
possiamo
...la frutta e le nazioni
stabilire
sono collegate tra frutta che sono in
loro perché voi relazione
vendete frutta a delle grazie alla
nazioni destinatarie. vendita. vendite

nazioni
destinatarie
Squeeeeak!!

Regno di Kod Impero


Alfa
la frutta viene
esportata in molti
paesi e ognuna di Regno di
queste destinazioni Ritol

acquista diversi tipi


di frutta. Regno di
Minanmi
frutta dal nazione
regno di destinataria
kod
r eg o
no d im per
mina i a lfa
n mi
molte nazioni
destinatarie (n) sono r eg n
o di
associate con molti ritol

frutti diversi (m).


se
riflettete
bene...

54 capitolo 3
codice prodotto

Frutta
nome prodotto ...capirete perché
questa relazione
prezzo unitario viene chiamata molti-
vendite
a-molti.

codice dest.
nazioni nel modello e-r, ciò
r min
e

destinatarie che conta è il numero


g an
no m

nome dest.
di associazioni tra
d

imp
i

e
i

a lf ro
r eg
no a entità.
rit d
ol i

solo mele ...allora la le


relazione mele
frutta
di cain
le mele di sarebbe uno-
ma allora se cain
a-molti?
cain vendesse vendite
lia di
solo un tipo di fa mig as
th om
frutta a molte di
lia
m ig ge
famiglie... solo mele fa eor
g
famiglie
destinatarie
fa
di mig
ma lia
lh
o

solo Bingo!
mele
perché
io? esatto!

e quindi, è codice prodotto


proprio questa
la situazione Frutta
nome prodotto
attuale del
regno di kod. prezzo unitario
vendite

il modello e-r codice dest.


la riassume nazioni
esattamente, destinatarie nome dest.
vero?

è così che
sì! funzionano le
esportazioni del
regno di kod!
normalizzare una tabella

vero! la prima
e ora che avete
cosa da fare
definito la situazione
è davvero è analizzare
attuale del regno
difficile la situazione
di kod...
cominciare di partenza.
è molto
a creare un
importante.
database.

sìììì!!!

...possiamo
cominciare a
progettare un
vero database.

gasp

Shhh!
signor
cain?
Shhh!

principessa?

r egistr
azion e
di ven
dita
mmm... trovato. a l r eg
no di
mina n m
i
Data: 3
Melon /5
e
frago
mi !
la

f fo
t u r eg n o
di kod
Tota le
è un... un
esempio delle il documento
ricevute che mostra in modo
creiamo quando impeccabile
esportiamo lo stato delle
frutta verso esportazioni.
una nazione
straniera.
Frusc verissimo! quindi
ora prendiamo
questi dati...

metterli in
...e creiamo un tabella!
database.

Swish

non ancora. ...dobbia-


prima... mo...

eccola qui.

codice nome prezzo


N. registrazione Data codice dest. nome dest. quantità
prodotto prodotto unit.

101 Melone 800Au 1.100


regno di
1101 3/5 12 minanmi
102 Fragola 150Au 300

1102 3/7 23 impero alfa 103 mela 120Au 1.700

regno di
1103 3/8 25 ritol
104 limone 200Au 500

regno di
1104 3/10 12 minanmi
101 Melone 800Au 2.500

103 mela 120Au 2.000


regno di
1105 3/12 25 ritol
104 limone 200Au 700

tabella creata a partire dai rapporti di vendita

57
ma è splendido!
questo può in un database
diventare principessa! relazionale
il nostro dovete prima
database. rendere la
delusione tabella più
no semplice
no
possibile da
utilizzare.

mi dispiace, ma così non


è ancora utilizzabile. non ancora...

vorresti dire vedete, alcune


be', sì...
che questa righe singole
tabella non si sdoppiano
è semplice in due codici
da capire? non so.
prodotto.
à
tit
an
o
qu
ezz
pr u nit.
me o
no ott
od
e pr e
dic o n
co dott lo
o Me
pr la
. go
st a
de fr
me
no la
e di
me
dic . o e
co est gn mi on
d re ina n lim
m
fa
al
ro
pe di
im o
e gn ol
r rit
di
e
r ina
m
o
gn n mi
ah...
di
o
gn l
re rito

questo sarebbe più semplice


perché ci capita da capire se ogni
di inserire due riga della tabella
contenesse un solo è vero...
o più prodotti
valore.
nella stessa
registrazione di esatto.
vendita.

:
i ve
n dita Data
istr
azio
ne d 3/5 mmm.
r eg
ina n mi
o di m
eg n
al r

one
M el
e
r a gol
f
od
di k
no
r eg

58 capitolo 3
...solo rinunciando a
e possiamo
creare una tabella
riuscirci...
dai dati così come
sono...

Bang! Bang!

Shazam!!
...e spezzandoli in più
tabelle!
così!

ma diventa molto
ah, capisco! più complicato
che con una sola
tabella...

cosa?!

forse, ...ma gestire i dati in stavo cain,


solo
all'apparenza... modo corretto e pensan-
mi dici
che ti
compatibile è molto do... pren-
importante. de?
Mumble e tocca
Mumble a noi.

definire la
condizione
di partenza...

...usando il
modello
e-r...

uh-uh.

progettiamo un database! 59
è
ipotizziamo di se usaste la qui!
voler aumentare tabella così
il prezzo del com'è...
melone di 20au.
e
...dovreste
anche
trovare tutte
qui...
le righe che
contengono meloni
e correggere i
prezzi uno alla
volta.

solo qui!
tabella
ma con una prodotti
facile!
tabella che
contiene solo i
Melone
singoli prodotti...
fragola

mela
...vi basterà
e senza alcun rischio
correggere il limone
di creare conflitti,
prezzo una volta
anche se vi scordate
sola, un singolo
di correggere gli
record della
altri record! non è
tabella prodotti.
fenomenale?

se usi una
capisco,
sola tabella ...si chiama fare una ma allora
è facile che sotto questa
normalizzazione. cosa dovrei
ti dimentichi di luce non è
correggere fare?
vantaggiosa.
qualcosa.

normalizzazione,
è molto
normalizzazione... importante!
Hiss
parli ancora
da solo?
uh...

dividere la tabella
per evitare
innanzi-
possibili conflitti
tutto...
tra i dati...

60 capitolo 3
...proviamo a
modificarla in la presenza di dati
modo che ogni ripetuti fa capire
riga contenga un che le righe devono
solo valore. essere divise.

...in una tabella che


contiene la data, il
e quindi le dividerò... codice destinatario
e il nome del
destinatario... ...e in un'altra
tabella che contiene
tabella vendite (prima forma normale (1)
codice prodotto, nome
del prodotto, prezzo
unitario e quantità.
N. registrazione Data codice dest. nome dest.

regno di
1101 3/5 12 minanmi
ma il numero
1102 3/7 23 impero alfa
di registrazione
regno di
1103 3/8 25 ritol compare in
regno di entrambe le
1104 3/10 12 minanmi
tabelle, è
regno di
1105 3/12 25 ritol giusto?

tabella vendite (prima forma normale (2)

N. registrazione
codice nome prezzo quantità
prodotto prodotto unit. uh.
1101 101 Melone 800au 1.100

1101 102 fragola 150au 300

1102 103 mela 120au 1.700

1103 104 limone 200au 500 sì, così puoi


identificare
1104 101 Melone 800au 2.500 se esiste
un'associazione
1105 103 mela 120au 2.000
tra le due
1105 104 limone 200au 700 tabelle.

progettiamo un database! 61
la tabella che risulta la tabella che invece
da questa divisione ha record che
prende il nome contengono due o
di prima forma più valori, prima di
normale. venire divisa viene
chiamata forma non
normalizzata.
prima forma
normale,
prima forma
normale si
divide
smettila di in pratica la prima
borbottare!
forma normale si
ottiene dividendo
la forma non
normalizzata. prima forma
normale

vediamo... il fatto che queste


siano "prime forme
normali" lascia
intendere che esistano esatto!
...un anche "seconde" e
momento. "terze" forme normali,
giusto?

coraggio!

in un database ah, capisco...


relazionale non si
può usare una prima
forma normale così
com'è. resisti!
ma
quando
prima finisce?!
forma
normale

monte da
tabase
r elaziona
le
puff
pant

62 capitolo 3
codice nome prezzo
bene, ora N. registrazione
prodotto prodotto unit.
quantità

esaminiamo la 1101 101 Melone 800au 1.100


prima forma
normale (2). 1101 102 fragola 150au 300

tabella risultati di vendita


(prima forma normale (2)
eccola.

non puoi ancora aahh! e


è la tabella con gestire i dati con perché?
i dati di vendita. questa tabella.

in che senso?
se a un certo ho
punto ricevi capito!
dei mandarini...

...non puoi
aggiungerli alla
tabella finché
non sono stati
venduti.

visto che nessuna mele già vendute


vendita è stata
registrata, il numero nella tabella (2)
di registrazione e nu mero
regist
razione
i dati associati ai
la quantità sono quantità prodotti e alle
sconosciuti. vendite sono
codice
prodott
o
pre
zzo mescolati.
u n it.
nome
prodotto

ma ndarini no
n venduti

dat
ass i
Sn

enti
prezz
ap

o
un it.
!

codice
prodotto nome
prodotto
ben detto!

progettiamo un database! 63
...la
non si possono mmm. spezziamo...
gestire i
prodotti in modo
indipendente con
tabella
la tabella (2) (2)

...in due!
esatto! e quindi...
tiè!

queste sono le tabelle


che risultano dalla
divisione della prima forma
normale (2).

tabella prodotti
(seconda forma normale (1)

codice nome prezzo unit.


prodotto prodotto

101 Melone 800au


la tabella (1) contiene i
102 fragola 150au
dati relativi ai prodotti.
103 Mela 120au

104 Limone 200au

se nella colonna del codice


tabella prodotti prodotto è assegnato un valore
(seconda forma normale (2) possiamo trovare il nome
prodotto e il prezzo unitario
corrispondenti.

codice
N. registrazione
prodotto
quantità

1101 101 1.100 cavoli.

1101 102 300


quindi il codice
prodotto è la
1102 103 1.700 chiave primaria
e determina i
1103 104 500
valori delle altre
1104 101 2.500 colonne.
1105 103 2.000

1105 104 700

esatto.

64 capitolo 3
per quanto immaginiamo nella
riguarda i dati tabella (2) di usare
relativi alle come chiave primaria la
vendite nella combinazione di numero
tabella (2), di registrazione e
codice prodotto.

in questa
tabella, la
chiave primaria
determina i chiave primaria
valori nelle
codice
altre colonne. N. registrazione
prodotto

ma...

ci sono casi
e ci sono casi in cui
in cui vendiamo
vendiamo quantità
contemporaneamente
diverse dello stesso
due prodotti
prodotto.
diversi...

questo significa...
codice prodotto nome prezzo
prodotto unitario

...che si divide la chiave


tabella finché, una primaria

volta determinata la
chiave primaria, questa
codice
determina i valori delle N. registrazione
prodotto
quantità

altre colonne.
chiave
primaria

capito.
capito?

progettiamo un database! 65
la tabella e se il prezzo
ottenuta nella seconda del melone cambia,
dalla divisione forma normale (1) è sufficiente
secondo questa possiamo aggiungere modificare il
regola si i mandarini di cui valore in un
chiama... parlavamo prima. singolo record,
giusto?
che non sono stati
possiamo aggiungere ancora venduti!
anche l'uva e i kiwi,

seconda forma
normale.

...a proposito, hai uh? tabella vendite


diviso la prima (prima forma normale (1)
forma normale
(2)... N. registrazione Data codice dest. nome dest.

regno di
1101 3/5 12 minanmi

1102 3/7 23 impero alfa

1103 3/8 25 regno di ritol


regno di
1104 3/10 12 minanmi

...ma allora non 1105 3/12 25 regno di ritol


oh, porti
è più necessario gli se questo

dividere la tabella deter- valore è


occhiali, minata
determi-
nato,
adesso. deter-
della prima forma allora
questo minato
normale (1)? valore è

chiave
primaria
Flump

in questa tabella,
se un numero di registrazione
è determinato, tutti gli
altri valori (data, codice
vediamo!
destinatario e nome
destinatario) sono determinati.

ottima
osservazione! sììì!

66 capitolo 3
come si chiama
quindi una tabella seconda forma normale!
in cui i valori nelle
altre colonne sono
determinati quando lo allora questa tabella
è la chiave primaria? è una seconda forma
normale, giusto?

tabella vendite tabella vendite


(prima forma normale (1)) (seconda forma normale (3))

N. registrazione Data codice dest. nome dest. N. registrazione Data codice dest. nome dest.

regno di regno di
minanmi minanmi
giusto. puoi ...come la seconda
considerare la prima impero alfa
forma normale (3)!
impero alfa

forma normale (1)... regno di regno di


ritol ritol

forza e

abbiamo completato
coraggio! non ancora...
la prima e la
seconda forma
normale!
S

! !
h
ora il nostro o ci siamo
database
relazionale è
c quasi!
pronto?! k
se
e! se mp
z io n
emo c ri p r e p
no fo on i do i ù
la seconda Ah rm rm da
forma al a
normale è... e

m
o
n
r e te
la d
zi at
o ab
na a
le s e

tu puoi
volare, tico.
fermi tutti... non vale!

progettiamo un database! 67
consideriamo di nuovo la non puoi gestire le
seconda forma normale destinazioni delle pensa,
(3). tue esportazioni pensa,
con questa tabella. pensa...
ah!
tabella vendite
tabella vendite
eh? seconda forma normale (3)

N. registrazione DatA codice dest. nome dest.

regno di
1101 3/5 12 minanmi

3/7 23 impero alfa

3/8 25 regno di ritol

il regno di sazanna, a nome dest.


regno di
cui non sono state fatte minanmi
nella tabella (3)
esportazioni finora, non
N. re- i dati relativi alle
può essere aggiunto a codice
gistra- destinazioni e
questa tabella. zione DatA dest.
alle vendite sono
mischiati.

dati
nome
assenti regno di dest.
sazanna

codice
dest.
mmm...

...dividiamo di nuovo!
come facciamo
a gestire
in maniera
tabella vendite tabella destinazioni (terza
autonoma le forma normale (2)
(terza forma normale (1)
destinazioni?

N. registrazione DatA codice dest. codice dest. nome dest.

regno di
1101 3/5 12 12 minanmi

1102 3/7 23 23 impero alfa

1103 3/8 25 25 regno di ritol

1104 3/10 12
proprio
m!
1105 3/12 25
così...
za
S ha
ma in effetti, N. regi-
nella seconda sì. il numero di stra-
forma normale (3), i registrazione zione
nomi dei destinatari determina un
sono determinati a valore nel codice
partire dal numero di dei destinatari...
registrazione. codice de-
stinatario

...determinando
indirettamente
anche il
nome del nome
destinatario
destinatario.

per sistemare
questo dividi la tabella, così
problema, che nessun valore
sia indirettamente
determinato.
a
r min min
a
te r a
de de
te
r min
te
de

N. registrazione Data codice dest. codice dest. nome dest.

ora potrete
finalmente gestire
persino il
siamo arrivati regno di
esatto, una tabella che alla terza sazanna.

non permette a nessuna forma


chiave che non sia normale!
ch e
primaria di determinare fia
to n
e. . .
i valori delle altre
colonne...

terza
forma
...si chiama terza normale
forma normale!

progettiamo un database! 69
tabella
tabella vendite destinazioni

N. registrazione Data codice dest. codice dest. nome dest.

1101 3/5 12 12 regno di minanmi

1102 3/7 23 23 impero alfa

1103 3/8 25 25 regno di ritol

1104 3/10 12

1105 3/12 25
tabella
prodotti

codice nome prezzo


tabella risu ltati di prodotto prodotto unitario
ven dita
101 Melone 800au

codice Quantità
N. registrazione
prodotto
102 fragola 150au

1101 101 1.100 103 mela 120au

1101 102 300 104 limone 200au

1102 103 1.700

1103 104 500


queste sono le
1104 101 2.500 tabelle che si
ottengono dividendo
1105 103 2.000 una tabella fino alla
terza forma normale.
1105 104 700

un database relazionale
utilizza normalmente
tabelle divise fino alla
terza forma normale.
evvài!
GASP

ora il nostro
database è
completo!

Cain? Principessa?

Zump!
anche aggiungere
ora potete gestire i prod
otto nuovi dati non
prodotti, le destinazioni
creerà conflitti.
e le vendite passando da
una tabella all'altra...
e
zion
tina
des

ven
dite
...senza problemi.

che sollievo…

giàggià.

anche se abbiamo ta bella


diviso la tabella in queste tabelle risu ltati
di
vendita
originale in quattro hanno trovato posto
tabelle aggiuntive, tutti i dati originali.

ta bella
ni
destinazio

lla
ta be ite
ven d

a
tabella creata dai risultati di vendita ta bell i
ott
prod

nella prossima
pagina si vedono
esplicitate le
relazioni tra
i dati.

esatto! è un database
relazionale.

progettiamo un database! 71
tabella
tabella vendite si
riferisc
e destinazioni
a…

N. registrazione Data codice dest. codice dest. nome dest.

12 regno di

23 impero alfa
il codice destinatario
nella tabella di vendita regno di
riferisce al codice
destinatario nella allo stesso
tabella destinazioni. modo, il codice prodotto
nella tabella risultati di
vendita riferisce al codice
tabella risu ltati di prodotto nella tabella
ven dita
prodotti,
si rif …

codice
N. registrazione
prodotto Quantità
a
eris

tabella
prodotti
ce

si
rif
er
a … isce
codice nome prezzo
prodotto prodotto unit.

Melone

fragola

mentre il numero di
registrazione nella tabella
risultati di vendita riferisce
al numero registrazione
nella tabella vendite.

la colonna a monte sembrano tabelle


cui viene fatto database separate e indipendenti,
riferimento si relazionale ma sono collegate
chiama chiave strettamente grazie
esterna. alle chiavi esterne.

la chiave esterna
ci
si collega alla siamo...
chiave primaria quasi...!
delle altre
tabelle.

72 capitolo 3
St
non vedo l'ora

ir
di poter gestire

ac
più facilmente le

h!
esportazioni grazie
al nostro database.

stanco

principessa...
Mr cain...
sì.

oh, sei
tu.
qualcosa
non va?

voi due vi state


comportando in
modo davvero
strano. ascolta,
posso spiegarti
che vi tutto.
prende?

non avrà
detto
qualcosa di
strano alla
principessa,
signor cain!

ih ih
io?
certo
che no.
che cos'è il modello e-R?

Cain e la Principessa Ruruna hanno analizzato la situazione attuale del Regno di Kod
usando un modello E-R (entità-relazione). Quando proverai a creare un database, il primo
passo sarà determinare le condizioni dei dati che stai cercando di modellare.
Cerca quindi di definire un'entità nei tuoi dati, usando il modello E-R. L'entità è un
oggetto concreto o una cosa realmente esistente, come la frutta o le destinazioni verso cui
esporti.
In aggiunta, un modello E-R evidenzia le relazioni tra le entità. La Principessa Ruruna
e Cain hanno basato la loro analisi sulla relazione chiamata vendita tra la frutta e le sue
destinazioni. La frutta viene esportata verso varie destinazioni, mentre ognuna di queste
destinazioni importa tipi diversi di frutta. Per questa ragione l'analisi secondo il modello E-R
presume che esista una relazione chiamata molti-a-molti tra la frutta e le sue destinazioni.
M frutti hanno relazioni con N destinazioni. Il numero di associazioni tra le entità si chiama
cardinalità.

codice prodotTo

frutTa nome prodotTo

M prezZo unitario

vendita Quantità

N
codice destinatario
destinazioni
esportazione
nome destinatario

come si analizza il modello e-R

Prova a riflettere su come procederesti nei casi seguenti:

caso 1: associazioni uno-a-uno


Una destinazione gestisce una singola informazione di vendita. Questo tipo di relazione
viene chiamata associazione uno-a-uno.

destinazione
Principe
RaminesS
1

gestione

informazione
sulLa
destinazione 1

storico
esportazione
74 capitolo 3
caso 2: associazioni uno-a-molti
Molte persone sono al servizio di una principessa. I servitori non assistono nessun'altra
principessa e neppure il re.

PrincipesSa PrincipesSa
Ruruna
1

asSistenza
Cain servitore

servitore servitori

Questo tipo di relazione viene chiamata associazione uno-a-molti.

caso 3: associazioni molti-a-molti


La frutta viene esportata verso molti paesi. Le destinazioni importano più di un tipo di
frutta.

frutTa

vendita

N
regno impero regno
a lph a e g
ki n
gdom k i n do m o
of mi mpire f Ritol
minan

di minanmi alfa di ritol


destinazioni

Questo tipo di relazione viene chiamata associazione molti-a-molti.

progettiamo un database! 75
domande
Hai capito bene come funziona il modello E-R? Analizza e disegna il modello E-R per
ognuno dei seguenti casi. Troverai le risposte a pagina 82.

D1
Un membro del personale gestisce diversi clienti. Un cliente non sarà mai contattato
da più di un membro del personale.

Cain

lph a g
gd o
kregno k i n do m o
in m
of
minan
mi impero
a em i r e
p regno f Ritol

di minanmi alfa di ritol

D2
Una persona può prendere in prestito più di un libro. I libri possono essere presi in
prestito da più studenti in momenti diversi.

principesSa libro
Ruruna

libro

Cain libro

76 capitolo 3
D3
Ogni studente frequenta più di un corso. Ogni corso è frequentato da più studenti. Un
professore può tenere più corsi. Ogni corso è tenuto da un solo professore.

principesSa
Ruruna

Tico
profes-
sore

profes-
Cain sore

corso corso

D4
Ogni cliente può aprire più di un conto corrente. Ogni conto corrente è aperto da
un singolo cliente. Ogni banca gestisce diversi conti correnti. Ogni conto corrente è
gestito da una banca.

RaminesS

conto
banca
conto

re di
kod

banca
banca

Ricordate sempre che l'analisi basata sul modello E-R non produce necessariamente
un solo risultato "corretto". Possono esserci molti modi di organizzare logicamente dei dati
per riflettere le condizioni attuali di un contesto.

progettiamo un database! 77
normalizzare una tabella

Cain e la Principessa Ruruna hanno imparato a usare la normalizzazione, il processo che


consente di disporre in una tabella dei dati provenienti dal mondo reale, azione necessaria
per creare un database relazionale. La normalizzazione viene riassunta qui (i campi in grigio
rappresentano le chiavi primarie).

forma non normalizzata

N. Regi- Data Codice Nome Codice Nome Prezzo Quantità


strazione destinatario destinatario prodotto prodotto unitario

prima forma normale

N. Registrazione Data Codice destinatario Nome destinatario

N. Registrazione Codice prodotto Nome prodotto Prezzo unitario Quantità

seconda forma normale

N. Registrazione Data Codice destinatario Nome destinatario

N. Registrazione Codice prodotto Quantità

Codice prodotto Nome prodotto Prezzo unitario

terza forma normale

N. Registrazione Data Codice destinatario

Codice destinatario Nome destinatario

N. Registrazione Codice prodotto Quantità

Codice prodotto Nome prodotto Prezzo unitario

78 capitolo 3
La forma non normalizzata è una tabella che contiene elementi che compaiono più
di una volta. Abbiamo visto che non è possibile gestire bene i dati usando questo tipo di
tabella in un database relazionale, quindi è necessario suddividerla.
La prima forma normale si riferisce a una semplice tabella bidimensionale che risulta
dalla divisione della tabella originaria nella forma non normalizzata. Si tratta di una tabella
che contiene un elemento in ogni cella. La tabella viene divisa in modo che un elemento
non compaia più di una volta.
La seconda forma normale si riferisce a una tabella in cui una chiave che può
identificare i dati determina i valori nelle altre colonne. Stiamo parlando della chiave
primaria.
In un database relazionale, un valore è definito funzionalmente dipendente se quel
valore determina i valori di altre colonne. Nella seconda forma normale, la tabella è divisa
per far sì che le colonne siano funzionalmente dipendenti dalla chiave primaria.
Nella terza forma normale, la tabella è divisa per far sì che un valore non sia
determinato da una chiave che non sia primaria. In un database relazionale, un valore
è definito transitivamente dipendente se quel valore determina indirettamente i valori di
altre colonne, come parte di un'operazione funzionalmente dipendente. Nella terza forma
normale la tabella è divisa in modo da poter rimuovere i valori transitivamente dipendenti.

domande
È importante riuscire a progettare un database relazionale nelle situazioni più disparate,
quindi esaminiamo alcuni esempi di tabelle da normalizzare. Determina il livello di
normalizzazione in tutti i casi seguenti. Troverai le risposte a pagina 82.

D5
La seguente tabella gestisce il prestito di libri (come definito nella domanda D2). Fino
a quale livello è stata normalizzata?

Codice Data Codice Nome Indirizzo Dipartimento Anno


prestito studente studente studente iscrizione

ISBN Titolo Autore Data pubblicazione Pagine totali

Codice prestito ISBN Quantità

progettiamo un database! 79
D6
Anche la seguente tabella descrive la gestione di una biblioteca. A quale livello è
normalizzata?

Codice prestito Data Codice studente

Codice studente Nome studente Indirizzo studente Dipartimento Anno iscrizione

ISBN Titolo Autore Data pubblicazione Pagine totali

Codice prestito ISBN Quantità

D7
La tabella seguente mostra i risultati delle vendite effettuate mensilmente da ciascun
dipendente. Ogni reparto è formato da più dipendenti. Un dipendente può far parte di
un solo reparto. Normalizza questa tabella fino alla terza forma normale.

Codice Nome Mese Vendite Codice reparto Nome reparto


dipendente dipendente attribuite

reparto
reparto vendite reparto
logistica estere esportazione

dipendente dipendente dipendente dipendente dipendente

D8
La tabella seguente rappresenta un sistema per la ricezione degli ordini. Normalizzala
fino alla terza forma normale. Ipotizza che a ogni numero d'ordine corrisponda un
solo cliente. Puoi processare anche più di un prodotto con lo stesso numero d'ordine.
Infine, a un numero d'ordine può essere associato solo un venditore.

Numero Data Codice Nome Codice Nome Prezzo Codice Nome Quantità
d'ordine cliente cliente prodotto prodotto unitario venditore venditore

80 capitolo 3
D9
La tabella seguente rappresenta un sistema per la ricezione degli ordini. Normalizzala
fino alla terza forma normale. Ipotizza che i prodotti siano classificati per codice
prodotto.

Numero Data Codice Nome Codice Nome Prezzo Codice Nome Quantità
d'ordine cliente cliente prodotto prodotto unitario categoria categoria
prodotto prodotto

i passi per progettare un database

Hai imparato come si progetta un database! Tuttavia questo non basta, avrai bisogno di
progettare una struttura dettagliata dei file che formeranno il database e stabilire i metodi
per l'esportazione e l'importazione dei dati. In generale, è possibile dividere la progettazione
di un database in tre parti: lo schema concettuale, lo schema interno e lo schema esterno.
Lo schema concettuale si riferisce alla modellizzazione del mondo reale. Più
precisamente, è un modo per determinare la struttura logica di un database. Lo schema
concettuale viene progettato prendendo in considerazione la concezione del mondo basata
sul modello E-R e la normalizzazione di una tabella.
Lo schema interno si riferisce al database visto nell'ottica di un computer. Nello
specifico, è un modo per determinare la struttura fisica di un database. Lo schema interno
viene progettato dopo che si è creato un metodo di ricerca ad alta velocità dei dati contenuti
nel database.
Lo schema esterno si riferisce al database visto nell'ottica dei suoi utenti o delle
applicazioni che si interfacciano con lui. Lo schema esterno viene progettato dopo che sono
stati creati i dati necessari per i programmi applicativi.

schema interno schema concetTuale schema esterno

In questo capitolo, la Principessa Ruruna e Cain hanno progettato un database


orientato allo schema concettuale. Stanno ancora lavorando all'ottimizzazione del loro
database.
Ora che hai imparato le nozioni di base della progettazione di un database, nel
prossimo capitolo vedremo concretamente come utilizzarlo.

riassumendo

• Un modello E-R è usato per analizzare le entità e le relazioni.


• Le relazioni tra le entità possono essere di tipo uno-a-uno, uno-a-molti e molti-a-molti.
• I dati in una tabella devono essere normalizzati prima di poter essere usati per creare
un database relazionale.
• La progettazione di un database si può dividere in tre parti: lo schema concettuale, lo
schema interno e lo schema esterno.

progettiamo un database! 81
risposte

Q1 membro del Q2 Q3 Q4
personale
libro studenti cliente

1 m m 1

gestione prestito parteci- apertura


pazione

N N N N

clienti Studenti corsi conto


corRente

m m

insegna- gestione
tmento

1 1

profesSore banca

D5 Seconda forma normale

D6 Terza forma normale

D7

Codice dipendente Mese Vendite

Codice dipendente Nome dipendente Codice reparto

Codice reparto Nome reparto

82 capitolo 3
D8

Codice ordine Data Codice cliente Codice venditore

Codice cliente Nome cliente

Codice ordine Codice prodotto Quantità

Codice prodotto Nome prodotto Prezzo unitario

Codice venditore Nome venditore

D9

Codice ordine Data Codice cliente

Codice cliente Nome cliente

Codice ordine Codice prodotto Quantità

Codice prodotto Codice categoria prodotto Nome prodotto Prezzo unitario

Codice categoria prodotto Nome categoria prodotto

progettiamo un database! 83
progettare un database
In questo capitolo hai imparato come si progetta un database relazionale. Esistono
tuttavia altri metodi di progettazione. L'efficienza e la praticità d'uso di un database
dipendono dall'analisi e dal metodo di progettazione, quindi è importante creare un
database adatto alle proprie esigenze sin dalla fase di progettazione.
In questa fase ti viene chiesto di svolgere diversi altri compiti, oltre alla
progettazione delle tabelle. Per esempio, devi considerare il tipo di dato da usare nella
tabella. Dovrai anche specificare quali colonne contengono valori numerici, quali valute
o campi di testo. Dovrai anche ideare un metodo che ti consenta di eseguire ricerche
in modo veloce. A volte dovrai progettare il tuo database tenendo in considerazione
l'organizzazione fisica dei file. Dovrai inoltre controllare l'accesso ai dati dei vari utenti,
per ragioni di sicurezza. Ci sono molti fattori da tenere in considerazione quando si
progetta un database. Nei capitoli seguenti ne affronteremo alcuni.

84 capitolo 3
4
impariamo il linguaggio sql!
sql: coMe usARlo
passeggiare
in città mi
ricorda
sempre la mia
infanzia.

m
ah ah ah! o
lt
principessa!
ia
n

principessa
n
if

spesso saltava ruruna!


a.
..

la scuola per
sgattaiolare fuori
dal castello.
scapp

davvero? non può lasciare


il castello così,
senza chiedere!

puff
puff
puff

Pant
Pant
Pant
seguire la mi segui solo
sai che c'è, cain? se principessa è perché devi
devi solo sgridarmi uno dei compiti farlo?
puoi anche tornare del suo
indietro! assistente! pensavo mi
seguissi be'...
perché eri
uffA! mio amico.
gasp

Pant

insom-
m-ma... ma...
senso del dovere!

sei uno stupido! oh, no, non


intendevo
dire...!

Swish!

Principessa.... ahio!

l'ho trovata,
principessa
ruruna!
!
M
O
O

i-igor, il
comandante
B

delle guardie!

impariamo il linguaggio sql! 87


è colpa mia...
ruruna, si è no, c'è un
ho convinto io
allontanata malinteso! cain...
la principessa
troppo. ruruna a uscire
dal castello!
SW
iS
HH

gulp!

oh, davvero?

...

da quando ero
una bambina...

torniamo ...cain si
a casa, è sempre
principessa... preso cura
di me.

88 capitolo 4
ma cosa mi
qualcosa
oh, no, no... succede...
non va?

cosa?

ah ah ah
!!

...niente!

Princip
e
Ra mine ah ah ah
ss...
c h e fu
sto !!!

w ow
RaMiNess!!
iihhh
iihhh

oh, no,
come viene da
state, cain! entriamo in
questa dedichiamo un
incantevoli questo caffè.
parte. po' di tempo
signorine?
allo studio dei
database.

le
i nk
tw

cosa?

iiik
aaa !
hh!
ah
ah
ah
eccomi qua!
oh, un
nuovo
posto
dove
eccovi qui! studiare! flit

Fl
ap

si sta
bene,
fuori.

finalmente...
allora, a questo il prossimo passo
punto possiamo è capire come Hip, hip,
progettare un usare il database urrà!

database. che abbiamo


creato.

puoi dirlo
forte!

quando usi un
database devi
inserire o per farlo, squalo??
recuperare dati, useremo sql.
ma questo già lo
sapete. sembra
complicato...
ih ih

90 capitolo 4
lità allo stesso
per esempio, loca re
n ea modo, noi usere-
quando fate due bal
chiacchiere nella mo un linguaggio
località balneare chiamato
dall'altra parte oh, parli il
structured
del mare... balnearese. query language
(sql)...
Splish,
splash....
...dovete
...per
parlare in
dialogare con davvero?
balnearese.
il database.

eccezionale!!!

ehi, il database non


come...? parla davvero,
intendiamoci.

ma certo,
lo so!

tabella tabella destinazioni


vendite

N. registrazione data codice dest. codice dest. nome dest.

1101 3/5 12 12 regno di minanmi

1102 3/7 23 23 impero alfa

1103 3/8 25 25 regno di ritol

1104 3/10 12
tabella
1105 3/12 25 prodotti

codice nome prezzo


tabella risultati di prodotto prodotto unit.
vendita
101 Melone 800Au

N. registrazione
codice
Quantità
102 fragola 150Au
prodotto
103 mela 120Au
1101 101 1.100
104 limone 200Au
1101 102 300

1102 103 1.700

1103 104 500


l'altro giorno avete
1104 101 2.500
disegnato queste
1105 103 2.000 tabelle, ricordate?
1105 104 700

impariamo il linguaggio sql! 91


ma ora avete bisogno
di sql per inserire sql permette di
queste tabelle e i dati
che contengono nel creare tabelle
database.
inserire ed estrarre dati

gestire gli utenti

ma... si
usando sql potrete direbbe un
dialogare con sacco di
il database, in lavoro.
relazione a questi
tre compiti...

SQ
L pe
• c r me
sembra proprio re
ar
e t tt
che si possa fare
• in
se
ab
ell ed
• g
rir
e e e i
di tutto! es
tir
d e
st
e g ra
li rr
ute e d
nti ati
non c'è
problema.

be'... è vero...
e voglio ho già inserito le
abbiamo
cominciare prima tabelle e i dati che
imparato un
possibile a usare abbiamo redatto.
sacco di cose!
il mio database.
Bip

questo
è lo
spirito
giusto!

vediamo come
recuperarli.
esatto.

92 capitolo 4
la ricerca dei dati

dobbiamo basta chiedere


recuperare al database di per
solo i nomi estrarre la favore...
dei prodotti colonna con i nomi
per creare dei prodotti...
una lista dei
nomi prodotto
usando sql.
...dalla tabella
prodotti.

signor
come si fa? database...

...ti preghiamo di
estrarre la colonna
coi nomi dei prodotti...

ma non dovete
pregare! basta
usare sql...

bisogna
scrivere
così: SELECT nome_prodotto
FROM prodotti;

quest'istruzione sql
in sql, ogni consiste di due gruppi
richiesta che viene di parole: select
fatta si chiama nome_prodotto e
istruzione (o from prodotti.
comando).

impariamo il linguaggio sql! 93


tabella
questi gruppi di parole prodotti

sono chiamati frasi.


codice prodotto nome prodotto prezzo unit.

From 101 Melone 800Au

102 fragola 150Au


in sql devi 103 mela 120Au
specificare il nome della
104 limone 200Au
colonna che vuoi estrarre
con la frase from.
Select

nome
ed ecco i dati che prodotto
otteniamo.
siamo riusciti a Melone
recuperare tutti i
nomi dalla tabella fragola
prodotti.
mela

ecco
fatto! limone

se dovessimo
vari tipi... chiedere una lista
stiamo dialogando
mmm. dei prodotti che
con il database
usando sql. hanno un prezzo
unitario maggiore
o uguale a
200au?
allora,
proprio così, per maggiore
esistono molti esempio, o uguale a
200au
tipi di frase per
recuperare i
dati necessari.

94 capitolo 4
in questo caso in questi casi devi
non ti interessano sì, esatto. specificare le tue
i dati di tutti i condizioni usando
prodotti. la frase where.
per esempio:
vuoi solo
quelli che
hanno un
prezzo unitario
uguale o
superiore a
200au.

WHERE prezzo_unitario>=200 non è un po'


scomodo dover nessun
specificare il nome problema! per
della colonna tutte selezionare
capisco, le volte? tutte le
si scrive così. ma... colonne,
è una
scocciatura!

mmm...

grazie a questa
istruzione
ecco qui
basta usare il recupererai dalla
carattere “*”! Ecco tabella tutti i
come si fa. prodotti...
B a ng
!!
prodotti che costano 200au
o più
SELECT *
codice nome prezzo
prodotto prodotto unit.
FROM prodotti
101 Melone 800au
WHERE prezzo_unitario>=200
104 Limone 200au

...che hanno un
quindi, prezzo unitario
uguale o superiore
a 200au.
quindi allo
dobbiamo imparare
stesso modo
a scrivere le
puoi estrarre
condizioni.
i prodotti che
costano meno di
200au.

WHERE prezzo_unitario<200

esatto, basta
fare così! infatti...

devi scrivere così.


...allora come quando usi i caratteri
faccio per esempio nelle condizioni devi
a estrarre mela? sempre metterli tra
due apici (').

SELECT * codice nome prezzo


prodotto prodotto unit.
FROM prodotti
103 mela 120au
WHERE nome_prodotto='mela';

in questo modo
recuperiamo le
mele!

esattamente.

96 capitolo 4
e se non sai di che si fa in
preciso come quel caso?
si chiama un
prodotto?

usi la
parola like in
combinazione con
un simbolo.

indichi la parte così estraiamo


sconosciuta usando il i nomi prodotto
simbolo %, così... che finiscono per
a.
fragola mela

SELECT * codice nome prezzo


prodotto prodotto unit.
FROM prodotti 102 fragola 150au

WHERE nome_prodotto LIKE '%a'; 103 mela 120au

davvero comodo!
mele e fragole
in un baleno!

visto?

impariamo il linguaggio sql! 97


l'estrazione dei dati

per estrarre i si possono


potete anche prodotti ordinati per recuperare le
ordinare i prezzo crescente, informazioni sui
risultati grazie basta aggiungere prodotti in questo
all'istruzione l'istruzione order by modo.
order by. prezzo unitario.

ottimo!

SELECT * codice nome prezzo


FROM prodotti prodotto prodotto unit.
WHERE nome_prodotto LIKE '%a';
103 mela 120au
ORDER BY prezzo_unitario;
102 fragola 150au

voglio veramente? mi fa
piacere!
sapere di
più su sql,
tico!

che ne dici di
questo?

se insieme a select usi


avg(nome colonna) è incredibile. Zuu
puoi ottenere la pp!
media dei valori di !
tutte le righe.
prezzo unitario medio

317,5
SELECT AVG(prezzo_unitario)

FROM prodotti;

ecco il prezzo
unitario medio dei
prodotti.

98 capitolo 4
sono molte le
non avevo idea cose che non
che il prezzo so, anche se in sql c'è anche
medio fosse succedono nel una funzione che
questo... mio paese. aggrega i risultati.

oide m oir ati n u ozzerp

5 ,71 3
esatto. non è
comodo?

quindi puoi
ma certo, per esempio...
ottenere altri dati
oltre al valore
medio?
...il numero di oggetti,
la somma, la media, il
valore massimo e il
valore minimo possono
essere estratti
utilizzando una funzione
di aggregazione.

funzioni di aggregazione in sql

Funzione Descrizione
COUNT(*) Restituisce il numero di righe
COUNT(nome_colonna) Restituisce il numero di volte in cui la colonna contiene un valore
COUNT(DISTINCT nome_colonna) Restituisce il numero di valori distinti nella colonna
SUM(nome_colonna) Restituisce la somma dei valori di tutte le righe nella colonna
AVG(nome_colonna) Restituisce la media dei valori di tutte le righe nella colonna
MAX(nome_colonna) Restituisce il valore massimo nella colonna
MIN(nome_colonna) Restituisce il valore minimo nella colonna

così... wow!

impariamo il linguaggio sql! 99


posso sapere e se volessi
quanti tipi scoprire qual è
usa count! usa max!
di frutta il prodotto più
vendiamo? caro?

Sping Sping
sping... sping...

puoi anche
sql permette di capisco, le
raggrupparli per
aggregare i dati, funzioni di
poterli analizzare
dando accesso aggregazione
o manipolare
a un sacco di sono utili.
ulteriormente.
informazioni.

ma...

...per quanto ...basta creare un


riguarda i resoconto delle
risultati di vendite usando
vendita? sql.

okay, allora...

100 capitolo 4
unire le tabelle

per creare un resoconto otti ven


prod dite
delle vendite bisogna giusto, prima della
recuperare i dati unendo risu lt
normalizzazione
ati
la tabella prodotti alle ven dit di
a
avevamo una sola
altre, cioè la tabella tabella.
destinazioni, la tabella destina-
vendite e la tabella zioni

risultati di vendita.

Uh-oh!

per unire le la chiave primaria


tabelle, sql dev'essere uguale alla
chiave esterna che come si fa a
richiede un specificarlo?
prerequisito... riferisce alla chiave
primaria.

a-
stin
de ioni
z
i di
vendite risu ltat
prodotti
vendita

se la stessa colonna
unisci le tabelle
appare in più di una
elencandole tabella, lo specifichi
separate da una come nome_tabella.
virgola. nome_colonna.

SELECT vendite.numero_registrazione, data, vendite.codice_destinatario,


nome_destinatario, risultati_vendita.codice_prodotto,
nome_prodotto, prezzo_unitario

FROM vendite, risultati_vendita, prodotti, destinazioni

WHERE vendite.numero_registrazione = risultati_vendita.numero_registrazione unendo le


AND quattro tabelle
risultati_vendita.codice_prodotto = prodotti.codice_prodotto poi potremo
AND restringere il
destinazioni.codice_destinatario = vendite.codice_destinatario
risultato usando
where.

impariamo il linguaggio sql! 101


in questo modo potete
recuperare i risultati di
vendita dalle tabelle anche
quando sono divise.

codice codice nome prezzo


N. registrazione Data nome dest. Quantità
dest. prodotto prodotto unit.
regno di
1101 3/5 12 minanmi
101 Melone 800au 1.100

regno di
1101 3/5 12 minanmi
102 fragola 150au 300

1102 3/7 23 impero alfa 103 mela 120au 1.700

regno di
1103 3/8 25 ritol
104 limone 200au 500

regno di
1104 3/10 12 minanmi
101 Melone 800au 2.500

regno di
1105 3/12 25 ritol
103 mela 120au 2.000

regno di
1105 3/12 25 ritol
104 limone 200au 700

possiamo recuperare
è la stessa tabella i dati relativi alle vendite
dalla quale siamo anche gestendo i prodotti,
partiti, l'abbiamo le destinazioni e le vendite in
ricreata! modo autonomo e
indipendente.

splendido!

Wow!
creare una tabella

come ci sei
quindi avevi già
se ricordo bene, inserito i dati riuscita?
tico, questa l'hai all'interno, o
creata usando sbaglio?
sql, giusto?

con l'istruzione
create table puoi
creare una tabella.
esatto.

codice nome prezzo


prodotto prodotto unit.
CREATE TABLE prodotti
(
codice_prodotto int NOT NULL,
nome_prodotto varchar(255),
prezzo_unitario int,
PRIMARY KEY(codice_prodotto)
);

devi specificare anche


qual è la chiave primaria,
in questo caso è il così...
codice prodotto.*

abbiamo anche definito i


tipi di dato contenuti in
ciascuna colonna. potete
per impedire di
vedere che il codice inserire valori
prodotto e il prezzo non corretti.
sono numeri interi (int).
varchar indica un campo di
testo, limitato a massimo
255 caratteri (255).

* vedi pagina 115 per una spiegazione dettagliata delle istruzioni per creare le tabelle.

impariamo il linguaggio sql! 103


ora possiamo per farlo, useremo
inserire i dati nella l'istruzione insert.
tabella, giusto?

codice nome prezzo


prodotto prodotto unitario

proprio
così.

puoi anche
cancellare (con
INSERT INTO prodotti (codice_prodotto,nome_prodotto, l'istruzione delete) e
prezzo_unitario) aggiornare (istruzione
VALUES (101, 'melone', 800); update) i dati.

codice nome prezzo


prodotto prodotto unitario

101 Melone 800au

e usando sql
puoi modificare il
prezzo unitario.
melone è stato
inserito nella
tabella prodotti
così.

104 capitolo 4
l'istruzione select
ora potete è la parte più
gestire le vostre importante di sql,
esportazioni con quindi studiatela
un database. con attenzione.

ne avete di
strada da
fare...

lo
farò.

usando sql
santo cielo,
al suo pieno
guarda
potenziale
com'è tardi!
saremo in
grado di
gestire...

...altrimenti igor,
torniamo al il comandante
castello prima delle guardie,
che faccia si arrabbierà di quel vecchio
buio... nuovo. prepotente...

sì, in cain!!
effetti...

Clang,
forza, clang...
muoviamoci.

okay,
andiamo.
panoramica su sql

In questo capitolo la Principessa Ruruna e Cain hanno imparato a usare SQL (Structured
Query Language), un linguaggio usato per operare sui database relazionali. I comandi SQL
si possono suddividere in tre gruppi:

Data Definition Language (DDL) per creare una tabella

Data Manipulation Language (DML) per inserire ed estrarre i dati

Data Control Language (DCL) per gestire l'accesso da parte degli utenti
SQL possiede le istruzioni per creare la struttura di un database e un'istruzione
specifica per creare tabelle all'interno di un database. Puoi anche usare questo linguaggio
per modificare o cancellare una tabella. Il linguaggio deputato a queste funzioni si chiama
Data Definition Language (DDL).
SQL include anche istruzioni per inserire, modificare e cancellare i dati, nonché un
comando che consente la ricerca dei dati. Il linguaggio deputato a queste funzioni si chiama
Data Manipulation Language (DML).
Per finire, SQL offre la possibilità di controllare un database in modo da scongiurare
conflitti tra i dati anche quando più persone lo stanno utilizzando contemporaneamente. Il
linguaggio deputato a queste funzioni si chiama Data Control Language (DCL).

la ricerca dei dati con l'istruzione select

La Principessa Ruruna e Cain hanno cominciato a impratichirsi con SQL usando una
funzione elementare di ricerca dati. Per effettuare una ricerca con SQL bisogna inserire una
cosiddetta istruzione (o combinazione di frasi). Per ricercare un prodotto specifico con un
prezzo unitario di 200Au, per esempio, bisogna usare la seguente istruzione SQL.

SELECT *
Un'istruzione SQL è una
FROM prodotti
combinazione di frasi.
WHERE prezzo_unitario=200

L'istruzione SELECT è la più elementare delle istruzioni SQL. Specifica quale colonna,
da quale tabella (FROM) e sulla base di quali condizioni (WHERE). Puoi combinare queste
frasi per interrogare un database in modo molto intuitivo (anche un utente non molto
avvezzo all'uso dei database può utilizzare quest'istruzione per recuperare dati).

106 capitolo 4
stabilire le condizioni

Come ha detto Cain, "dobbiamo imparare a scrivere le condizioni". Scopriamo alcuni modi
per farlo in SQL.

Gli operatori di confronto


Un modo per esprimere le condizioni è usare operatori di confronto come >= e =. Per
esempio, la condizione "A è maggiore o uguale a B" si può esprimere usando >=, mentre la
condizione "A è uguale a B" si può esprimere usando =. Troverai altri esempi di operatori di
confronto nella seguente tabella.

operatori di confronto

Operatore di Descrizione Esempio Spiegazione dell'esempio


confronto
A=B A è uguale a B prezzo_unitario=200 Il prezzo unitario è uguale a 200Au.
A>B A è maggiore di B prezzo_unitario>200 Il prezzo unitario è maggiore di 200Au.
A >= B A è maggiore o uguale a B prezzo_unitario>=200 Il prezzo unitario è maggiore o uguale
a 200Au.
A<B A è minore di B prezzo_unitario<200 Il prezzo unitario è minore di 200Au.
A <= B A è minore o uguale a B prezzo_unitario<=200 Il prezzo unitario è minore o uguale a
200Au.
A <> B A è diverso da B prezzo_unitario<>200 Il prezzo unitario è diverso da 200Au.

operatori logici
In certi casi è necessario esprimere condizioni più complesse del semplice confronto. Puoi
usare gli operatori logici (AND, OR e NOT) per creare condizioni combinate più elaborate,
come evidenziato nella seguente tabella.

operatori logici

Operatore logico Descrizione Esempio Spiegazione dell'esempio


AND AeB Codice prodotto >= 200 Il codice prodotto è maggiore o uguale a
AND prezzo unitario = 100 200 e il prezzo unitario è 100Au.
OR AoB Codice prodotto >= 200 Il codice prodotto è maggiore o uguale a
OR prezzo unitario = 100 200 o il prezzo unitario è 100Au.
NOT Non A NOT prezzo unitario = 100 Il prezzo unitario non è 100Au.

impariamo il linguaggio sql! 107


i pattern
Quando non sai esattamente cosa vuoi cercare, puoi anche usare sequenze particolari di
caratteri jolly, dette pattern. Quando esegui la ricerca con i pattern avrai a che fare con
caratteri come % oppure _ associati all'istruzione LIKE. Questo ti permetterà di cercare una
stringa di caratteri che corrisponda al pattern specificato. Per esempio, puoi cercare un
valore che corrisponde a una stringa, specificata anche solo parzialmente, usando %, che
indica una stringa di caratteri di una lunghezza qualsiasi, e _, che specifica invece un solo
carattere.
Qui sotto trovi un esempio dell'uso di questi caratteri jolly. L'istruzione ricerca una
stringa di caratteri che definisce un nome prodotto che finisce per e.

SELECT * Codice prodotto Nome prodotto Prezzo unit.


FROM prodotti La regola è definita grazie 101 Melone 800Au
WHERE nome_prodotto LIKE '%e'; a un carattere jolly. 104 Limone 200Au

I caratteri jolly disponibili in SQL sono spiegati qui sotto.

caratteri jolly

Carattere Descrizione Esempio di Stringa valida


jolly pattern
% Corrisponde a una stringa di %e Limone Melone
lunghezza qualsiasi m% Mela Melone
_ Corrisponde a un carattere _o io
o_ on

le ricerche
Esistono molti altri metodi per ricercare dati. Per esempio, puoi specificare un intervallo
di valori con BETWEEN X AND Y. Se specifichi l'intervallo come mostrato nell'esempio
seguente, puoi estrarre i prodotti con prezzo unitario maggiore o uguale a 150Au e minore
di 200Au.

SELECT *
FROM prodotti
WHERE prezzo_unitario
BETWEEN 150 AND 200; Specifica un intervallo di ricerca.

Puoi anche specificare che stai cercando i prodotti il cui prezzo unitario è zero, grazie
all'operatore NULL.

SELECT *
FROM prodotti
WHERE prezzo_unitario is NULL; Cerca un valore vuoto.

108 capitolo 4
domande
Adesso prova a creare delle istruzioni SQL usando diversi tipi di condizioni. Partiamo dalla
Tabella Destinazioni riportata qui sotto (l'unità di misura per la popolazione è 10.000
abitanti). Rispondi alle domande usando istruzioni SQL. Troverai le risposte a pagina 119.

tabella destinazioni

Codice destinatario Nome destinatario Popolazione


12 Regno di Minanmi 100
23 Impero Alfa 120
25 Regno di Ritol 150
30 Regno di Sazanna 80

D1
Estrai la tabella qui sotto per trovare gli stati con un numero di abitanti maggiore o
uguale a 1 milione.

Codice destinatario Nome destinatario Popolazione


12 Regno di Minanmi 100
23 Impero Alfa 120
25 Regno di Ritol 150

D2
Estrai la tabella qui sotto per trovare gli stati con un numero di abitanti minore di 1
milione.

Codice destinatario Nome destinatario Popolazione


30 Regno di Sazanna 80

D3
Trova gli stati in cui il codice destinatario è minore di 20 e il numero di abitanti
maggiore o uguale a 1 milione.

D4
Trova gli stati in cui il codice destinatario è maggiore o uguale a 30 e il numero di
abitanti maggiore di 1 milione.

D5
Quanti sono gli abitanti del Regno di Ritol?

D6
Trova gli stati i cui nomi contengono la lettera n.

impariamo il linguaggio sql! 109


le funzioni di aggregazione

La Principessa Ruruna e Cain hanno scoperto diverse funzioni di aggregazione. Tali


funzioni sono anche chiamate funzioni di colonna, e possono essere usate per aggregare
informazioni come il valore massimo, il valore minimo, il numero di oggetti e la somma.
Utilizzando WHERE in associazione a una funzione aggregata potrai ottenere un valore
aggregato soltanto per le righe desiderate. Nell'esempio qui sotto puoi scoprire quanti sono
i prodotti il cui prezzo è maggiore o uguale a 200Au.

SELECT COUNT(*)
COUNT(*)
FROM prodotti
WHERE prezzo_unitario>=200; 2

aggregare i dati con l'operatore di raggruppamento


Raggruppando i dati potrai facilmente ottenere valori aggregati. Se per esempio vuoi
estrarre il numero di prodotti e il loro prezzo unitario medio a seconda del distretto, potrai
utilizzare la funzione di raggruppamento.
Per raggruppare i dati è possibile combinare la funzione di aggregazione con la frase
GROUP BY. Partiamo dalla tabella qui sotto.

tabella prodotti

Codice prodotto Nome prodotto Prezzo unit. Distretto


101 Melone 800Au Mare del Sud
102 Fragola 150Au Centrale
103 Mela 120Au Mare del Nord
104 Limone 200Au Mare del Sud
201 Castagna 100Au Mare del Nord
202 Caco 160Au Centrale
301 Pesca 130Au Mare del Sud
302 Kiwi 200Au Mare del Sud

Per ottenere il prezzo unitario medio per ognuno dei distretti della Tabella Prodotti,
specifica la colonna Distretti e usa la funzione AVG comandata dalla frase GROUP BY. In
questo modo i dati saranno raggruppati per distretto e otterrai il valore medio relativo a
ogni singolo distretto.

Distretti AVG(prezzo_unitario)
SELECT distretto,AVG(prezzo_unitario)
Mare del Sud 332,5
FROM prodotti Permette di
GROUP BY distretto; Mare del Nord 110
raggruppare.
Centrale 155

110 capitolo 4
E se volessi ulteriormente restringere questi risultati sulla base di una proprietà
particolare? Immagina di voler trovare i prodotti il cui prezzo unitario medio regionale è
maggiore o uguale a 200Au. In questo caso non dovrai specificare una condizione nella
frase WHERE, ma usare al suo posto la frase HAVING. Questo ti permetterà di estrarre solo
i distretti in cui la media rispetta il tuo requisito.

SELECT distretto,AVG(prezzo_unitario)
FROM prodotti Distretto AVG(prezzo_unitario)
GROUP BY distretto; Filtra i risultati già Mare del Sud 332,5
HAVING AVG(prezzo_unitario)>=200; raggruppati.

domande
Rispondi alle seguenti domande usando questa Tabella Destinazioni Esportazione (l'unità di
misura per la popolazione è 10.000 abitanti). Troverai le risposte a pagina 120.

tabella destinazioni esportazione

Codice destinatario Nome destinatario Popolazione Distretto


12 Regno di Minanmi 100 Mare del Sud
15 Regno di Paronu 200 Centrale
22 Regno di Tokanta 160 Mare del Nord
23 Impero Alfa 120 Mare del Nord
25 Regno di Ritol 150 Mare del Sud
30 Regno di Sazanna 80 Mare del Sud
31 Regno di Taharu 240 Mare del Nord
33 Regno di Mariyon 300 Centrale

D7
Quanti abitanti ha lo stato meno popoloso?

D8
Quanti abitanti ha lo stato più popoloso?

D9
Qual è il totale degli abitanti di tutti gli stati presenti nella Tabella Destinazioni
Esportazione?

D10
Qual è la popolazione totale degli stati il cui codice destinatario è maggiore di 20?

D11
Quanti stati presentano una popolazione maggiore o uguale a 1 milione?

D12
Quanti stati ci sono nel distretto del Mare del Nord?

impariamo il linguaggio sql! 111


D13
Qual è lo stato più popoloso del distretto del Mare del Nord?

D14
Qual è la popolazione totale di tutti gli stati escluso il Regno di Ritol?

D15
Trova i distretti in cui la popolazione media è maggiore o uguale a 2 milioni.

D16
Trova i distretti che contengono almeno tre stati.

la ricerca dei dati

In aggiunta a quelli che abbiamo già visto, esistono in SQL altri metodi più sofisticati per
interrogare un database.

usare una subquery


Per esempio, è possibile inserire un'interrogazione (query) all'interno di un'altra
interrogazione, ottenendo così una subquery. Diamo un'occhiata alle tabelle seguenti.

tabella prodotti tabella risultati di vendita

Codice Nome Prezzo N. Codice Quantità


prodotto prodotto unit. Registrazione prodotto
101 Melone 800Au 1101 101 1.100
102 Fragola 150Au 1101 102 300
103 Mela 120Au 1102 103 1.700
104 Limone 200Au 1103 104 500
1104 101 2.500
1105 103 2.000
1105 104 700

Puoi usare queste due tabelle per recuperare i nomi dei prodotti le cui vendite
superano o sono uguali a 1.000 unità. La seguente istruzione SQL eseguirà la ricerca.

SELECT * FROM prodotti


WHERE codice_prodotto IN
(SELECT codice_prodotto
FROM risultati_vendita Quest’istruzione contiene una subquery.
WHERE quantita>=1000);

112 capitolo 4
In quest'istruzione SQL viene prima eseguita l'espressione SELECT tra parentesi.
Il codice prodotto nella Tabella Risultati di Vendita viene cercato per primo, e da questa
ricerca vengono estratti i codici 101 e 103 (sono gli unici in cui il venduto supera le 1.000
unità).
Questi codici prodotto vengono poi usati come parte della condizione dell'istruzione
SELECT fuori dalle parentesi. IN indica che la condizione è soddisfatta quando un record
corrisponde a uno dei valori inclusi tra parentesi. Quindi i prodotti corrispondenti ai codici
prodotto 101 e 103 saranno restituiti come risultato della query intera.
In altre parole, quando c'è una subquery il risultato dell'istruzione SELECT tra
parentesi verrà trasmesso all'altra istruzione SELECT per continuare la ricerca. Il risultato di
questa ricerca è esposto nella tabella seguente.

Codice prodotto Nome prodotto Prezzo unit.


101 Melone 800Au
103 Mela 120Au

usare una subquery correlata


Consideriamo adesso una subquery contenuta all'interno di un'altra query. Questa potrebbe
far riferimento a dati ottenuti da un'altra query, è il caso delle subquery correlate. Nella
query seguente, la tabella risultati_vendita nella query esterna viene temporaneamente
ribattezzata U per permettere alla subquery di riferirsi a lei in modo non ambiguo. La
sintassi U.codice_prodotto indica a quale colonna codice_prodotto ci stiamo riferendo,
visto che esistono due sorgenti per quella colonna all'interno della subquery.
Visto che la subquery si riferisce a dati provenienti dall'altra query, la subquery non
è indipendente dalla query esterna, come negli esempi precedenti. Questa dipendenza è
chiamata correlazione.
u SELECT *
FROM risultati_vendita U Questa query restituisce le
# registrazione Codice prodotto Quantità registrazioni in cui il
WHERE quantita> 1104 101 2.500 volume di vendita è
v
superiore alla media per
1105 103 2.000 quel prodotto.
w (SELECT AVG(quantita) 1105 104 700
FROM risultati_vendita
WHERE codice_prodotto=U.codice_prodotto;

Vediamo come viene elaborata questa subquery. In una subquery correlata viene
prima eseguita la query esterna.

u SELECT *
FROM risultati_vendita U

Il risultato è mandato alla query interna per essere valutato riga per riga. Analizziamo
ora come viene elaborata la prima riga, ovvero il codice prodotto 101.

impariamo il linguaggio sql! 113


w (SELECT AVG(quantita)
FROM risultati_vendita
WHERE codice_prodotto=101)

Il codice prodotto nella prima riga è 101 (melone). Il venduto medio per i meloni è pari
a 1.800 unità e questo risultato è ora inviato come condizione alla query esterna.

v WHERE quantita>(1.800)

Questo processo viene iterato per tutte le righe della Tabella Risultati di Vendita: i passi
v e w vengono dunque eseguiti per tutti i codici prodotto. In altri termini, questa query
estrae le registrazioni relative a frutti che sono stati venduti in misura maggiore alla media
di vendita per quel frutto particolare.
Di conseguenza solo la quinta, la sesta e la settima colonna di u sono estratte.

domande
Adesso rispondi alle seguenti domande, basate sulla Tabella Prodotti e sulla Tabella
Risultati di Vendita. Troverai le risposte a pagina 122.

D17
Trova i risultati di vendita dei frutti il cui prezzo unitario è maggiore o uguale a
300Au ed estrai la tabella qui sotto.

Registrazione Codice prodotto Quantità


1101 101 1.100
1104 101 2.500

D18
Ottieni i volumi medi di vendita suddivisi per prodotto, e trova i prodotti che
presentano volumi di vendita inferiori alla media.

unire le tabelle

Dopo aver condotto una ricerca grazie a SQL, la Principessa Ruruna e Cain hanno generato
un resoconto delle vendite combinando le tabelle. Unire le tabelle combinando colonne con
lo stesso nome è un'operazione chiamata equi-join. In un'equi-join la condizione dev'essere
l'uguaglianza delle righe. Riunire in un'unica colonna più colonne dallo stesso nome è invece
definita natural join.

114 capitolo 4
Il metodo con cui vengono selezionate solo righe aventi un valore in comune (come nel
caso di una equi join) si chiama inner join.
Invece, il metodo che mantiene tutte le righe di una tabella e specifica un valore vuoto
per le righe non incluse in un'altra tabella si chiama outer join. Se metti una tabella creata
grazie a un outer join a destra o a sinistra di un'istruzione SQL, otterrai una left outer join o
una right outer join, a seconda di quali righe vengono mantenute.

Tabella sinistra Tabella destra

Left Right
outer join outer join

creare una tabella

Alla fine la Principessa Ruruna e Cain hanno imparato a usare l'istruzione che consente
di creare una tabella, CREATE TABLE. La sintassi di un'istruzione CREATE TABLE spesso
dipende dal tipo di database in uso. Vediamo un esempio:

CREATE TABLE prodotti Quest’istruzione crea una tabella.


(
codice_prodotto int NOT NULL,
nome_prodotto varchar(255),
prezzo_unitario int,
PRIMARY KEY(codice_prodotto)
);

Quando crei una tabella devi sempre specificare i nomi delle colonne. Puoi anche
specificare una chiave primaria e una chiave esterna per ogni colonna. In questo esempio
il codice prodotto viene specificato come chiave primaria e il valore del codice prodotto non
può essere null. Quando crei una tabella spesso hai bisogno di includere una delle seguenti
condizioni.

impariamo il linguaggio sql! 115


vincoli sui dati di una tabella

Vincolo Descrizione
PRIMARY KEY Stabilisce una chiave primaria
UNIQUE Deve essere univoco
NOT NULL Non accetta un valore NULL
CHECK Verifica che il valore stia in un intervallo
DEFAULT Inserisce un valore di default predefinito
FOREIGN KEY REFERENCES Stabilisce una chiave esterna

Queste condizioni sono chiamate vincoli. Stabilire dei vincoli quando si crea una tabella
consente di evitare conflitti sui dati e aiuta nella corretta gestione del database.

inserire, aggiornare o cancellare le righe


Puoi usare le istruzioni INSERT, UPDATE e DELETE per inserire, aggiornare o cancellare
dati da una tabella creata usando l'istruzione CREATE TABLE. Vediamo come inserire,
aggiornare e cancellare i dati usando SQL.

INSERT INTO prodotti Quest’istruzione aggiunge 'ciliegia'.


(codice_prodotto,nome_prodotto,prezzo_unitario)
VALUES (200, 'ciliegia',200);

UPDATE prodotti Quest’istruzione modifica


SET nome_prodotti='cantalupo' 'melone' in 'cantalupo'.
WHERE nome_prodotto='melone';

DELETE FROM prodotti Quest’istruzione cancella 'mela'.


WHERE nome_prodotto='mela';

Codice prodotto Nome prodotto Prezzo unit.


101 Cantalupo 800G Modificato in cantalupo.
102 Fragola 150G
103 Mela 120G Mela cancellata.
104 Limone 200G
200 Ciliegia 200G Ciliegia aggiunta.

Quando inserisci, aggiorni o cancelli una riga, non puoi violare i vincoli espressi dalla
istruzione CREATE TABLE. Se un prodotto con codice prodotto 200 esiste già, non riuscirai
ad aggiungere ciliegia, visto che non è possibile avere duplicati fra le chiavi primarie.
Quando inserisci, aggiorni o cancelli i dati in un database devi sempre tenere conto dei
vincoli.

116 capitolo 4
creare una vista
Basandoti sulla tabella che hai creato con l'istruzione CREATE TABLE, puoi anche creare
una tabella virtuale che esiste soltanto quando viene visualizzata da un utente. Queste
tabelle si chiamano viste, e la tabella da cui una vista deriva si chiama tabella di base.

Vista Tabella di base

Usa l'istruzione SQL qui sotto per creare una vista.

CREATE VIEW prodotti_costosi Quest’istruzione crea una vista.


(codice_prodotto,nome_prodotto,prezzo_unitario)
AS SELECT *
FROM prodotti
WHERE prezzo_unitario>=200;

La Tabella Prodotti Costosi è una vista basata sulla Tabella Prodotti, che rappresenta
la tabella di base. È stata creata estraendo dalla Tabella Prodotti i record in cui il prezzo
unitario è uguale o superiore a 200Au.

tabella prodotti costosi

Codice prodotto Nome prodotto Prezzo unit.


101 Melone 800Au
104 Limone 200Au
202 Caco 200Au

Una volta creata la vista dei Prodotti Costosi puoi ricercare al suo interno i dati con le
stesse modalità con cui accederesti a una tabella base.

SELECT * Puoi usare una vista


FROM prodotti_costosi con le stesse modalità
WHERE prezzo_unitario>=500; di una tabella base.

Può essere comodo creare una vista quando vuoi rendere pubblica solo una parte dei
dati contenuti in una tabella.

impariamo il linguaggio sql! 117


Esistono anche istruzioni specifiche per cancellare una tabella base o una vista. Le
mostriamo in due esempi.

DROP VIEW prodotti_costosi;

DROP TABLE prodotti;

domande
Crea le istruzioni SQL relative alle seguenti domande (l'unità di misura per la popolazione è
10.000 abitanti). Troverai le risposte a pagina 123.

D19
La Tabella Destinazioni qui sotto è stata creata usando l'istruzione CREATE TABLE.
Aggiungi i dati qui sotto.

tabella destinazioni

Codice destinatario Nome destinatario Popolazione Distretto


12 Regno di Minanmi 100 Mare del Sud
15 Regno di Paronu 200 Centrale
22 Regno di Tokanta 160 Mare del Nord
23 Impero Alfa 120 Mare del Nord

D20
Partendo dalla Tabella Destinazioni della Domanda 19, crea una vista chiamata
Nazioni del Mare del Nord che contiene le nazioni appartenenti al distretto del Mare
del Nord.

tabella destinazioni

Codice destinatario Nome destinatario Popolazione


22 Regno di Tokanta 160
23 Impero Alfa 120

D21
Modifica la popolazione del Regno di Tokanta nella Tabella Destinazioni portandola a
1,5 milioni.

D22
Cancella nella Tabella Destinazioni tutti i dati relativi al Regno di Paronu.

118 capitolo 4
riassumendo

• Puoi usare le funzioni di SQL per definire, gestire e controllare i dati.


• Per eseguire una ricerca utilizza l'istruzione SELECT.
• Per specificare una condizione utilizza la frase WHERE.
• Per inserire, aggiornare e cancellare i dati utilizza le istruzioni INSERT, UPDATE e
DELETE.
• Per creare una tabella utilizza l'istruzione CREATE TABLE.

risposte
D1
SELECT *
FROM destinazioni
WHERE popolazione>=100;

D2
SELECT *
FROM destinazioni
WHERE popolazione<100;

D3
SELECT *
FROM destinazioni
WHERE codice_destinatario<20
AND popolazione>=100;

Codice destinatario Nome destinatario Popolazione


12 Regno di Minanmi 100

D4
SELECT *
FROM destinazioni
WHERE codice_destinatario>=30
AND popolazione>100;

Nessuno dei paesi soddisfa questi criteri e la query restituisce l’insieme vuoto.

Codice destinatario Nome destinatario Popolazione

impariamo il linguaggio sql! 119


D5
SELECT popolazione
FROM destinazioni
WHERE nome_destinatario='Regno di Ritol';

Popolazione
150

D6
SELECT *
FROM destinazioni
WHERE nome_destinatario LIKE '%n%';

Codice destinatario Nome destinatario Popolazione


12 Regno di Minanmi 100
30 Regno di Sazanna 80

D7
SELECT MIN(popolazione)
FROM destinazioni;

MIN(popolazione)
80

D8
SELECT MAX(popolazione)
FROM destinazioni;

MAX(popolazione)
300

D9
SELECT SUM(popolazione)
FROM destinazioni;

SUM(popolazione)
1.350

120 capitolo 4
D10
SELECT SUM(popolazione)
FROM destinazioni
WHERE codice_destinatario>20;

SUM(popolazione)
1.050

D11
SELECT COUNT(*)
FROM destinazioni
WHERE popolazione>=100;

COUNT(*)
7

D12
SELECT COUNT(*)
FROM destinazioni
WHERE distretto='Mare del Nord';

COUNT(*)
3

D13
SELECT MAX(popolazione)
FROM destinazioni
WHERE distretto='Mare del Nord';

MAX(popolazione)
240

impariamo il linguaggio sql! 121


D14
SELECT SUM(popolazione)
FROM destinazioni
WHERE NOT(nome_destinatario='Regno di Ritol');

SUM(popolazione)
1.200

D15
SELECT distretto, AVG(popolazione)
FROM destinazioni
GROUP BY distretto
HAVING AVG(popolazione)>=200;

Distretto AVG(popolazione)
Centrale 250

D16
SELECT distretto, COUNT(*)
FROM destinazioni
GROUP BY distretto
HAVING COUNT(*)>=3;

Distretto COUNT(*)
Mare del Nord 3
Mare del Sud 3

D17

SELECT *
FROM risultati_vendita
WHERE codice_prodotto IN
(SELECT codice_prodotto
FROM prodotti
WHERE prezzo_unitario>=300);

122 capitolo 4
D18
SELECT *
FROM risultati_vendita U
WHERE quantita<
(SELECT AVG(quantita)
FROM risultati_vendita
WHERE codice_prodotto=U.codice_prodotto);

N. registrazione Codice prodotto Quantità


1101 101 1.100
1102 103 1.700
1103 104 500

D19
INSERT INTO destinazioni(codice_destinatario,
nome_destinatario,popolazione,distretto)
VALUES(12,'Regno di Minanmi',100,'mare del sud');
INSERT INTO destinazioni(codice_destinatario,
nome_destinatario,popolazione,distretto)
VALUES(15,'Regno di Paronu',200,'centrale');
INSERT INTO destinazioni(codice_destinatario,
nome_destinatario,popolazione,distretto)
VALUES(22,'Regno di Tokanta',160,'mare del nord');
INSERT INTO destinazioni(codice_destinatario,
nome_destinatario,popolazione,distretto)
VALUES(23,'Impero Alfa',120,'mare del nord');

D20
CREATE VIEW nazioni_mare_nord(codice_destinatario,
nome_destinatario_popolazione)
AS SELECT codice_destinatario,nome_destinatario,popolazione
FROM nome_destinatario
WHERE distretto='mare del nord';

D21
UPDATE destinazioni
SET popolazione=150
WHERE nome_destinazione='Regno di Tokanta';

D22
DELETE FROM destinazioni
WHERE nome_destinatario='Regno di Paronu';

impariamo il linguaggio sql! 123


standardizzazione di sql
SQL risponde a uno standard dell'Organizzazione Internazionale per la
Standardizzazione (ISO). In Giappone SQL è standardizzato da JIS (Japanese Industrial
Standards).
Altri standard di SQL sono SQL92, approvato nel 1992, e SQL99, approvato
nel 1999. I database relazionali sono progettati in modo che le query siano sempre
conformi a questi standard.
Alcuni database relazionali, al contempo, presentano specifiche proprietarie. Fate
riferimento al manuale operativo del vostro database per maggiori dettagli.

124 capitolo 4
5
facciamo funzionare un
database!
Che cos'è una transazione?

Click, click,
click...
Biip

Biip

Click,
click,
clack,
click...

Click, clack,
click...

guarda,
questi sono due
nuovi ordini.

ma insomma,
sì, signora, li sai fare solo
alla fine siamo
inserisco subito entrate a
riusciti a imparare
nel database. effetto?!
come si usa un Tico!
database, eh?
scusa.

che
cavolo!

aagh!
*

*Hop!

126 capitolo 5
...anche se per esempio, mi
però devo dobbiamo chiedo come faccia a
ringraziarti... imparare funzionare un database
ancora quando ci sono così
molto. tanti utenti collegati
contemporaneamente.

e in effetti,
anche la
questione
della sicurezza
mi preoccupa.

be', per
comprendere
si direbbe che siate meglio il
problema...
preoccupati per il
database. a-hem!

...ho fatto
qualche oh,
più o ricerca. davvero?
meno.

il titolo della mia


presentazione è:

F la s
h!
come fa un database a
consentire l'accesso
di tanti utenti ho preparato
contemporaneamente? anche delle
illustrazioni per
aiutarvi meglio a
capire!

oh, ma è
splendido!

il teatro
oh! del
database

mi piacciono
gli spettacoli!
andiamo a
cominciare. un giorno,
andy e becky database
accedono a un
Clap, database nello
clap, stesso istante.
clap accesso

evviva!

nel database andy legge 30 mele


nella tabella prodotti
quante mele ci sono.
ne vedo
30
Uh-uh.

e poi aggiunge 10 a questo


valore, aggiornando il ne aggiungo 10.

campo nel database.

poi
saranno
40.

voglio
30 mele solo
intanto anche becky legge aiutare!
ne
il valore 30 delle mele e vedo
ne aggiunge 10. 30 ma è
giusto?

ne aggiungo 10. ne aggiungo 10.


ma dopo questa
operazione, il database poi sa-
mostra che la quantità poi
ranno
40.
attuale di mele è 40. saranno
40.

40 mele.

128 capitolo 5
non ma allora dove
dovrebbero esatto.
sono finite le
essere 50? altre 10 mele?
andy ne ha
forza,
aggiunte 10, ragiona!
e 10 anche
becky.

vediamo...

le ha impossibile!
mangiate perché non ci
cain! sono mai state!

io?! j'accuse!

aggiun-
gi 10.
infatti, becky
non può operare sul Database
database in questa in questo modo
sequenza, mentre andy le sue 10 mele
sta lavorando. non sarebbero
scomparse.

quindi la domanda è:
per consentire a come fa un database
becky e andy di a controllare le
utilizzare insieme operazioni degli
il database, utenti?

dev'esserci un ve lo spiego subito!


quanto
meccanismo che è fico!
scongiuri le
incongruenze e le
duplicazioni come
queste. giusto.

oggi cain
è in gran
forma.
una sequenza indivisibile
innanzitutto, di operazioni sui dati viene
un database è chiamata transazione.
progettato
per elaborare
le operazioni
raggruppandole.

giàggià.

transazione?

nel
nostro esempio,
abbiamo visto
una transazione
che comprende leggi leggi
un'operazione di il il
dato. dato.
lettura, di addizione

transazione
e di scrittura.
transazione

ag- ag-
giungi giungi
10. 10.

scrivi scrivi
il risul- il risul-
tato. tato.

quindi le
operazioni di mentre le operazioni
andy formano una di becky ne formano
transazione, un'altra.

130 capitolo 5
che cos'è un blocco?

in un database a questo scopo


le operazioni ...quando gli esiste un metodo
dei diversi utenti accedono detto lock, che
utenti sono simultaneamente. significa blocco.
controllate in
modo da evitare
problemi...

capisco.

"lock" come il
"lucchetto" della
chiave?

esattamente.

provo a
spiegarmi
puoi bloccare i Da usando l'esempio
Dato to
dati per evitare precedente.
che vengano
hai
elaborati disegnato
erroneamente. un sacco
di schemi!

non lo
sapevo.
Flip

Flip

facciamo funzionare un database! 131


quando becky prova a
prima di eseguire una eseguire le sue, deve prima
serie di operazioni, andy attendere che andy abbia
blocca i dati. finito.

30 mele
30 mele

sto
aspettando
in coda!
sto aspettando che
andy finisca.
aggiungo 10.

40 mele 40 mele

aggiungo 10.

50 mele
becky potrà eseguire
le sue operazioni solo
dopo che andy avrà
completato le sue.
50 mele

alla fine nel database


troveremo il risultato
corretto, cioè 50 mele. ragazzi! cain, sono
colpita.

proprio
così.

132 capitolo 5
Database

quindi le operazioni l'istruzione


in un database commit serve
sono concluse a chiudere le
quando ognuna leggi transazioni.
delle transazioni
è elaborata
scrivi
correttamente.

anche se i blocchi quindi a seconda


hanno la loro della situazione si
importanza, non possono usare tipi
bisognerebbe mai diversi di blocco.
abusarne perché
rischiano di offuscare
il vero senso di un
database: condividere
dei dati con molte
persone.
come si fa?

per esempio, puoi


quando
usare un blocco
è operativo un ...ma non pos-
condiviso per
blocco condiviso, sono modifi-
un'operazione di
gli altri utenti carlo sovra-
lettura, quando
possono leggere scrivendolo.
questa è l'unica
il dato...
operazione
necessaria.
blocco
condiviso

blocco
condiviso

posso
posso scrivere?
leggere?

facciamo funzionare un database! 133


quando un utente quando è
deve eseguire operativo un
un'operazione di blocco esclusivo,
scrittura, allora gli altri utenti
applica un blocco non possono però.
esclusivo. né leggere né
scrivere il dato.

cco
blo ivo
bl lu s
es occ
cl e sc
us o
ivo

posso posso
leggere? scrivere?

ah, capisco,
ci sono tipi
diversi di quando un blocco
blocchi. viene usato per controllare
due o più transazioni, si
parla di controllo di
concorrenza.
in effetti
ha senso.

...al maggior numero


in un database, tra
possibile di utenti
il controllo di parentesi...
di usare il database
concorrenza cain!
nello stesso istante,
permette... evitando che si creino
conflitti.

sì, tico?

134 capitolo 5
è davvero
devi avere ti do questa affidabile!
studiato un impressione? non credi, bene,
sacco! ruruna? continua!

no, volentieri.
direi
veramente no. di sì...

in certi casi, il controllo di A n dy


riprendia- Becky
mo da dove concorrenza effettuato con
mi ero in- un blocco potrebbe causare
terrotto. dei problemi.

per esempio...

...supponiamo e che becky abbia


che andy abbia disposto a sua
disposto un blocco volta un blocco
esclusivo sulle esclusivo sulle
mele. fragole.

dati sulle mele dati sulle fragole

a-ha.
...mentre becky cosa
poi andy prova prova a disporre
a disporre un succederà a
un blocco questo punto?
blocco esclusivo esclusivo sulle
sulle fragole... mele.

blocc
o
ccat ato
blo

dati sulle mele dati sulle fragole

be'...

visto che devono ...nessuno


entrambi aspettare dei due può non po
sson o fare
che il blocco eseguire alcuna n iente.
dell'altro sia operazione. ho
rilasciato... detto bene? mele
fr
a g
o
le

fammi
pensare...
esatto!

questa
per esempio, puoi
situazione
prende il nome cercare delle
di deadlock, e transazioni che quando cancelli
non può essere sono rimaste una transazione,
risolta finché in coda per un hai eseguito un
uno dei blocchi determinato rollback.
non viene periodo...
rilasciato.
CA
NC
EL

...e cancellarle!
la

rollback?
r
e

136 capitolo 5
stai dicendo sì! per esempio, se una
che si possono transazione per "scontare i
cancellare in una frutti che hanno un prezzo
volta tutte le minore o uguale a 150au" è
operazioni in una fallita...
transazione?

...le operazioni per le mele


e le fragole devono essere
cancellate nel complesso,
no?

capisco.

operazione
quindi il database
si comporta se succede
come se nessuna qualcosa durante
operazione una transazione
fosse stata che ne impedisce la
eseguita? chiusura,

allora viene

operazione
eseguito un
rollback,
sì, più o invece del
meno. normale
commit.

benissimo! ora,
esatto. una mia cara tico,
transazione il prossimo
finisce sempre argomento è...
con un'operazione
di commit o di
rollback.

in altre parole, non


esistono mezze misure.

facciamo funzionare un database! 137


sicurezza e database

uh-ehi!
capisco. anche quando
è condiviso tra un
grande numero di
utenti, un database può
evitare problemi se
è stato progettato
correttamente.

raminess! ma mi dispiace, ma...


spunti dal ...non sono
nulla?! "mia cara
tico."

mmm

perché sono
rapido come un
???
fulmine.

... sono io quello


che ci fai tu, qui?! che dovrebbe
arrabbiarsi.

non ti
arrabbiare, guarda qui.
su!
la nostra
tabella
codice prodotto nome prodotto prezzo unitario
prodotti.
101 Melone 10.000Au

102 fragola 12.500Au

103 Mela 8.000Au

104 Limone 6.000Au

201 castagna 9.000Au

202 caco 12.400Au

301 pesca 5.000Au

302 Kiwi 6.000Au

cos'ha che i prezzi,


non va? i prezzi!

i prezzi? c
co o m
e
m e sta
le cifre nella lo i l
ne
colonna !
prezzo unitario
sono tutte
sbagliate!

oh, no!!!

cosa è
successo?
a causa delle
vostre fatture così
imprecise nella mia
nazione, che importa da
voi, è scoppiato
il caos.

...perché non accetti la


i database mia proposta, principessa
sono pieni di ruruna? vieni con me,
trabocchetti. diventa la mia sposa.

non interessata

a compensazione
parziale di questo
disturbo...

principe
qualche raminess...
malintenzionato deve
aver sovrascritto
i dati senza
autorizzazione.

ma è
terribile!

ti comporti
come se ...siamo
io non
esistessi. profondamente
dispiaciuti.

140 capitolo 5
promettiamo di ...
migliorare la
sicurezza del
nostro database,
per impedire che una
cosa del genere si
ripeta di nuovo.

dici che
la prego di sistemerete tutto,
perdonarci! ma... non sono così
convinto... puoi
essere un po' più
preciso?

il problema è
per prima cosa
generato dal
dovremo instaurare
fatto che tutti
dei controlli
nel regno di kod
d'accesso, per
hanno libero
limitare il numero
accesso al
di utenti.
nostro database.

il che
tradotto...?

una buona soluzione poi configureremo


potrebbe essere le impostazioni
consentire l'accesso per limitare
solo tramite nome utente certe operazioni
e password, ogni utente solo agli utenti
dovrà dimostrare di autorizzati a
essere affidabile per farle.
t),
poter entrare. lec
(se i
c he i dat
r e
ice ar di
e r ell ,
g uir anc rche rli o
se c ce a
d i e are e e ri dific
o ific guir mo
ss
me , mod i ese on d
i e...
er ch
- p rire o d i ma n i c er
che idea e ss er
ins rme i dat uir
e
- p rire arli eg
intelligente! e i es
d
ins cell o
n ss
ca rme
p e
-

facciamo funzionare un database! 141


- gli operatori del reparto logistica possono eseguire ricerche, inserire,
aggiornare e cancellare dati relativi ai prodotti.
- i venditori esteri possono eseguire ricerche e inserire dati relativi ai
prodotti, ma non possono modificarli o cancellarli.
- gli addetti all'esportazione possono eseguire ricerche sui prodotti, ma
non inserire, modificare o cancellare i dati.

Database

reparto reparto vendite reparto


logistica estere esportazione

CERCARE YES CERCARE YES CERCARE YES


INSERIRE YES INSERIRE YES INSERIRE NO
MODIFICARE YES MODIFICARE NO MODIFICARE NO
CANCELLARE YES CANCELLARE NO CANCELLARE NO

non limiteremo oh, sicuramente...


soltanto il numero ma parlando
di utenti, stabiliremo d'altro, come ti
anche per ogni utente stavo dicendo
le operazioni che è prima...
autorizzato a
eseguire.

...mi sembra
un'occasione
imperdibile per oh, ma
accettare di aspetta!
sposarmi e...
in questo modo
eviteremo qualsiasi
tipo di problema, e i sc
Sg u
il database resterà
condiviso.

142 capitolo 5
l'indicizzazione
quando sempre più capisco dove
persone useranno vuole arrivare...
il database e il
mi ignora
di nuovo...
volume dei dati
crescerà...
mmm...

...potrebbero
sorgere altri più aumenta il
problemi. volume di dati
gestiti...

ci si può fidare di in un caso simile...


...più lente
un database?
diventano le
operazioni di
ricerca.

no,
no,
no

sì, proprio punzecchia!

così!

l'indice non è
...l'indicizzazione sembra quella cosa
la soluzione più adatta. che si trova
in fondo a un
libro?

principessa... non fa
niente, davvero. perché
non parliamo del
nostro matrimonio,
invece?

indicizzazione? è vero.

facciamo funzionare un database! 143


una ricerca casuale
immaginiamo di voler sarebbe davvero
cercare il significato complicata, quindi per
della parola transazione semplificarci la vita
consultando questo libro consultiamo l'indice.
sui database.

ne
azio
alla voce tra n
s

transazione sono
riportate le pagine in n saz
ion
e
tra
cui viene usata quella
parola.

indice

pagina di
riferimento

e l'indice in
usando un indice un database
siamo in grado funziona allo
di trovare stesso modo.
agevolmente per esempio...
la pagina che
cercavamo!

?
proprio così.

144 capitolo 5
se crei indici per i
codici prodotto... ti dice dove si trovano
101 M quei dati nel disco.
elo ne

...potrai sapere Dati


istantaneamente dove
si trovano i dati
relativi a un prodotto
a cui è stato
assegnato il codice
prodotto 101.

dover trovare un
l'indicizzazione aiuta dato scandagliando
a velocizzare le tutte le righe è
ricerche. una vera perdita di
vuole che
le ripeta da
tempo.
capo tutta la
spiegazione?

no, no...

be', faccio un po'


fatica a seguirti,
ma...

uh-huh.

ehi, con
usando gli indici chi stai
e riducendo gli
possiamo ridurre parlando?
accessi alla
gli accessi alla
memoria, le
memoria. attenzione,
ricerche saranno principessa!
c'è qualcuno
più veloci! qui?
!

che
succede?

uh-oh.

facciamo funzionare un database! 145


ah ah
parlavo tra tico ah
me e me! torniamo a noi, se
ho capito bene in un
database normalmente
è l'amministratore ad
aggiungere gli indici.
oops,
raminess non
può vederla.

c’è ancora
molto...?

psst
ma allora gli
psst
indici vanno bene
o
d'altro canto, creare sbaglio? o no?
troppi indici potrebbe
risultare poco
efficiente.

in pratica è così. provate


a pensare a un libro che ah, quindi
contiene tantissimi indici. andrebbe
sarebbe un po' come così...
mettere il carro davanti
ai buoi, non è vero? ah
ah!

e poi, tutte le volte


che aggiorni un dato
devi aggiornare anche
gli indici... rischia di
diventare uno spreco
di tempo.

me l'ha
detto
tico!

146 capitolo 5
inutile che proviate
capisco, questo a sorprendermi!
database è più i database hanno
furbo di quanto anche altri
pensassi. problemi!

da dove è
spuntata
quella
rosa?
gulp!
il database... per dirne uno...

...che succede se il nessun


computer che ospita problema.
il database si spegne
perché salta la
corrente?

proprio
così.
Dati

terrore
Dati

vuol dire che il


una procedura di database in caso
ripristino è sempre ripristino?
di problemi può
attiva. guarire alla
perfezione.

Dati

capisco...

facciamo funzionare un database! 147


ripristino in caso di malfunzionamento

dentro a un database Log


esistono record
chiamati log che Database
Log
memorizzano le
operazioni sui dati,
non è così?
Log Log

è così che vengono


log
registrate le modifiche
al contenuto di un
esatto. database.

log, mmm...
i più importanti sono quelli
che registrano lo stato
dei dati prima e dopo un
aggiornamento.

mmm...

Qualcosa ehi, anche


non va, lui sembra
tico? interessarsi
ai database,
adesso.

... stai parlando


del principe
raminess?
dici davvero?

148 capitolo 5
in presenza di un
esistono vari metodi di
problema, per prima cosa
recupero, a seconda se
occorre riavviare il
la transazione fosse
sistema.
conclusa o meno.

poi, grazie ai log, bla


puoi recuperare il bla...
tuo database.

Non mi
sembra poi
trans- così sveglio... Eh,
peccato. già.
che?

se il problema si è
lascia ora te lo verificato dopo la chiusura
stare,
non mostro... della transazione, questo significa
importa... che le operazioni di quella
transazione si sono completate
ri
b correttamente.
sc r i b
sc quindi puoi recuperare
i dati replicando le
operazioni sul database.

dato a
roll
forward

in questo
tipo di ripristino, il
database fa riferimento dato a
al valore dopo dopo
l'aggiornamento. l'aggiornamento

questo metodo di ripristino si


chiama roll forward.

facciamo funzionare un database! 149


che succede
invece se la dato a
quando si esegue
transazione non un rollback,
era conclusa ci si riporta ai
quando si è valori precedenti
verificato il all'aggiornamento,
problema? per cancellare la
transazione. rollback

in altre parole, dato a


si ripristina lo stato iniziale
stato precedente
all'inizio della
transazione.
niente paura! in quel
caso entra in gioco il
rollback.

termini come
il sistema ripristina i
transazione o
dati e verifica che non
ripristino non
ci siano incongruenze.
mi sono molto
familiari.

uh-huh. mmm

ma direi che vedi, un database


le misure di può e deve
sicurezza del resistere anche
vostro database in presenza di
sono all'altezza. problemi!

sigh

finalmente
l'hai capito!

150 capitolo 5
be', visto come
stanno le cose, per
questa volta lascerò
correre.

santo
cielo...

...prima
ero serio,
quando
gulp!
ma... parlavo di
matrimonio!

ruruna...? perché perché io...


no?

...amo un'altra
persona!
raminess, mi
dispiace.

non posso
accettare la tua
proposta.

sguardo
appassionato
mi chiedo
chi... oh!

non si era
capito...?!

Strizz!
resterò per
sempre con cain, e grazie
al potere del nostro
database...

stai
dicendo...

...faremo fiorire e
prosperare il regno
di kod!

ma è come puoi
preferire
impossibile! un plebeo
perché devi
chiedergli
non... non puoi come cain? scusa,
cain?
farmi questo...

mi
dispiace. ecco, be',
no, certo,
mi scusi
non
dovrei...
scusa.

resta per
sempre
con me, sono una
cain. splendida
coppia.
sì, sì,
vostra
altezza!

peerché?
perchééé?

152 capitolo 5
le proprietà delle transazioni

La ricerca di Cain ha dimostrato che gli utenti di un database possono cercare, inserire,
modificare e cancellare i dati. Un insieme di operazioni eseguite con successo da un singolo
utente si chiama transazione.

Database

legGi
transazione

scrivi

Quando più utenti operano all'interno di un database è importante verificare che


le transazioni concomitanti possano essere elaborate senza che si verifichino conflitti. È
importante anche proteggere i dati da incongruenze, nel caso il sistema si blocchi nel corso
di una transazione. A questo scopo, troverai nella tabella seguente una lista delle proprietà
richieste in una transazione. Insieme formano l'acronimo ACID, semplice da memorizzare.

proprietà richieste in una transazione

Proprietà Iniziale di Descrizione


A Atomicità Una transazione deve necessariamente chiudersi o essere
annullata.
C Coerenza Una transazione non può mai causare una perdita di coerenza
del database.
I Isolamento Anche quando più transazioni sono elaborate
contemporaneamente, il loro risultato è identico a quello che
avrebbero se elaborate in sequenza.
D Durabilità I valori risultanti da una transazione eseguita correttamente
non possono essere persi per malfunzionamenti.

Esaminiamo in dettaglio ognuna di queste proprietà.

atomicità
La prima proprietà necessaria in una transazione è l'atomicità, e implica che una
transazione deve sempre terminare con un commit o con un rollback, per scongiurare la
presenza di incongruenze nel database. Quindi, ognuna delle azioni di una transazione
dev'essere completata correttamente, altrimenti tutte le azioni vengono cancellate.
L'istruzione commit segna la fine corretta di una transazione, mentre l'istruzione
rollback cancella tutte le operazioni della transazione.

facciamo funzionare un database! 153


Database Database

ComMit RolLback

In certi casi il commit o il rollback vengono eseguiti automaticamente. Puoi persino


specificare quale dei due dovrebbe essere eseguito. Per esempio, in presenza di errori puoi
specificare l'esecuzione di un rollback.
Le istruzioni SQL COMMIT e ROLLBACK servono a eseguire queste operazioni.

COMMIT; Usa quest’istruzione


per confermare una transazione.

ROLLBACK; Usa quest’istruzione per


eseguire un ripristino.

domande

Rispondi a queste domande per verificare se hai compreso bene il concetto di atomicità.
Troverai le risposte a pagina 167.

D1
Scrivi un'istruzione SQL che può essere utilizzata per chiudere una transazione.

D2
Scrivi un'istruzione SQL che può essere utilizzata per cancellare una transazione.

coerenza
Una transazione non deve generare errori. Se il database era coerente prima
dell'esecuzione di una transazione, allora dovrà esserlo anche una volta che questa è stata
eseguita.
Cain ha fatto l'esempio di Andy e di Becky che cercano entrambi di aggiungere 10 mele
a un totale di partenza di 30 mele. Il database non restituisce il risultato corretto (50 mele),
ma ne mostra solo 40. Questo tipo di errori si chiama perdita di aggiornamento.

154 capitolo 5
30 mele 30 mele

30 mele

+10 mele +10 mele

40 mele

40 mele

40 mele?

Quando due transazioni sono elaborate nello stesso momento può succedere che
entrambe vogliano accedere allo stesso record della stessa tabella. Questo può causare
conflitti nei dati.
Le tabelle e le righe che durante una transazione sono soggette a operazioni sono
chiamate risorse. In un database le transazioni devono essere in grado di accedere alla
stessa risorsa contemporaneamente senza creare incoerenze.

isolamento
Quando due o più transazioni vengono eseguite contestualmente e portano allo stesso
risultato che avrebbero se eseguite singolarmente, si dice che la loro sequenza di operazioni
è serializzabile. L'isolamento è una proprietà che richiede la serializzabilità, per proteggere il
database dagli errori.
Per ottenere questa serializzabilità, devi poter controllare le transazioni che vengono
effettuate nello stesso istante. Il metodo più comunemente usato a questo scopo è basato
sui blocchi. Un blocco condiviso si usa quando i dati vengono solo letti, altrimenti si usa un
blocco esclusivo.

facciamo funzionare un database! 155


blocCo condiviso blocCo esclusivo

posSo posSo posSo posSo


legGere? scrivere? legGere? scrivere?

Quando è in funzione un blocco condiviso, un altro utente può inserire blocchi condivisi
ad altre transazioni, ma non blocchi esclusivi. Quando è in funzione un blocco esclusivo,
nessun altro tipo di blocco può essere inserito. La tabella seguente riassume le relazioni
possibili tra blocchi di tipo condiviso ed esclusivo.

relazioni di co-esistenza tra blocchi

Blocco condiviso Blocco esclusivo


Blocco condiviso SI NO
Blocco esclusivo NO NO

domande

Hai capito come funzionano i blocchi? Rispondi a queste domande, troverai le risposte a
pagina 167.

D3
Se Andy ha applicato un blocco condiviso, Becky può applicare un blocco condiviso?

D4
Se Andy ha applicato un blocco esclusivo, Becky può applicare un blocco condiviso?

D5
Se Andy ha applicato un blocco condiviso, Becky può applicare un blocco esclusivo?

D6
Se Andy ha applicato un blocco esclusivo, Becky può applicare un blocco esclusivo?

il blocco a due fasi

Per poter assicurare la serializzabilità di una sequenza di comandi, dobbiamo seguire delle
regole ferree quando impostiamo o rilasciamo dei blocchi. Una di queste regole si chiama
blocco a due fasi: per ogni transazione devono essere considerate due fasi: una in cui si
applicano i blocchi e una in cui questi blocchi vengono rilasciati.
Per esempio, immaginiamo che due risorse A e B siano entrambe sottoposte a
un blocco. La transazione  osserva la regola del blocco a due fasi, a differenza della
transazione . La serializzazione può essere ottenuta solamente quando tutte le
transazioni seguono la regola del blocco a due fasi.

156 capitolo 5
u LOCK A v LOCK A
La fase di attivazione
LOCK B dei blocchi. READ A
READ A WRITE A
READ B UNLOCK A Qui i blocchi in "A"
WRITE A LOCK B sono stati rilasciati
WRITE B READ B prima dell'operazione
UNLOCK A La fase di rilascio WRITE B di scrittura in "B".
UNLOCK B dei blocchi. UNLOCK B

granularità dei blocchi

Esistono molti tipi di risorse che possono essere bloccate, per esempio puoi bloccare intere
tabelle o intere righe di dati. L'estensione delle risorse bloccate viene anche chiamata
granularità. Si definisce grezza quando implica il blocco di molte risorse allo stesso tempo, e
fine quando invece comporta il blocco di poche risorse.

I blocchi di singole
I blocchi di tabelle sono righe o insiemi di righe
definiti a granularità sono definiti a
grezza. granularità fine.

Quando la granularità è grezza (o alta) il numero di blocchi necessari per la transazione


si riduce, rendendo più semplice la gestione della granularità. Al contempo si riducono
anche il numero di operazioni della CPU su cui il database insiste. D'altro canto, visto che
un numero maggiore di risorse viene bloccato, generalmente i tempi di attesa per rilasciare
blocchi usati anche da altre transazioni è più lungo. Quindi, quando la granularità è alta, il
numero di transazioni che si possono gestire contemporaneamente crolla.
Al contrario, quando la granularità è fine (o bassa) in una transazione viene eseguito
un gran numero di blocchi, e questo richiede un maggior numero di operazioni per gestirli.
Quindi le operazioni della CPU aumentano di conseguenza. Comunque, visto che i blocchi
interessano meno risorse il rilascio dei blocchi richiederà in genere un tempo minore,
rendendo possibile la gestione di un numero più alto di transazioni.

domande

Rispondi a queste domande, troverai le soluzioni a pagina 168.

D7
La risorsa destinataria di un blocco è stata modificata da una tabella a una riga. Cosa
succederà al numero di transazioni che sarà possibile operare contemporaneamente?

D8
La risorsa destinataria di un blocco è stata modificata da una riga a una tabella. Cosa
succederà al numero di transazioni che sarà possibile operare contemporaneamente?

facciamo funzionare un database! 157


altri controlli di concorrenza

Puoi utilizzare i blocchi per eseguire con efficacia due o più transazioni allo stesso tempo.
L'abuso dei blocchi, però, può portare a disagi nella gestione, visto il rischio di generare dei
deadlock, o situazioni di stallo. In presenza di un numero limitato di transazioni o di un alto
numero di operazioni di lettura ci son sistemi più semplici di controllo della concorrenza. In
questi casi specifici si possono usare i seguenti metodi:
Controllo sull’orario di accesso
Un'etichetta che contiene l'orario di accesso, chiamato in questo caso timestamp,
viene assegnata ai dati coinvolti durante una transazione. Se un'altra transazione
con un orario di accesso successivo ha già aggiornato i dati, l'operazione non verrà
permessa. Quando un'operazione di lettura o di scrittura non viene permessa, la
transazione si chiude con un rollback.

Controllo ottimistico
Questo metodo consente le operazioni di lettura. Quando viene tentata una scrittura,
viene controllata la presenza di altre transazioni occorse sul dato. Se un'altra
transazione ha già aggiornato il dato, la transazione si chiude con un rollback.

livelli di isolamento

Nell'uso comune puoi impostare il livello di transazioni che possono essere elaborate nello
stesso tempo. Questa impostazione si chiama livello di isolamento.
In SQL l'istruzione SET TRANSACTION può essere usata per specificare i livelli di
isolamento delle transazioni seguenti:
• READ UNCOMMITTED
• READ COMMITTED
• REPEATABLE READ
• SERIALIZABLE

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

A seconda del livello di isolamento impostato si possono ottenere i seguenti livelli di


protezione.

Lettura sporca Lettura non ripetibile Lettura fantasma


READ UNCOMMITTED Possibile Possibile Possibile
READ COMMITTED Non può verificarsi Possibile Possibile
REPEATABLE READ Non può verificarsi Non può verificarsi Possibile
SERIALIZABLE Non può verificarsi Non può verificarsi Non può verificarsi

• Una lettura sporca si verifica quando la transazione 2 legge una riga prima che la
transazione 1 sia chiusa con un commit.
• Una lettura non ripetibile si verifica quando una transazione legge lo stesso dato due
volte ottenendo un valore diverso.
• Una lettura fantasma si verifica quando una transazione cerca le righe che
corrispondono a una determinata condizione, ma trova le righe sbagliate per colpa delle
modifiche apportate da un'altra transazione.
158 capitolo 5
durabilità
Un database può gestire dati importanti, quindi è fondamentale poter garantire la sua
sicurezza e la persistenza dei dati in caso di problemi. La sicurezza è importante anche
quando si tratta di impedire a utenti non autorizzati di modificare i dati (generando
problemi di coerenza).
In un database puoi stabilire i diritti di accesso di tutti gli utenti. Aumentandone il
livello di sicurezza, Cain ha scongiurato possibili pericoli al database del Regno.
In un database relazionale, l'istruzione GRANT permette di assegnare i permessi di
lettura e scrittura agli utenti. Puoi usare quest'istruzione per regolare l'accesso degli utenti
alle tabelle che hai creato. Assegnare i permessi è un'operazione molto importante nella
gestione di un database.

GRANT SELECT, UPDATE ON prodotti TO reparto_vendite_estere; Quest’istruzione assegna il


permesso di elaborare i dati.

Con SQL puoi assegnare i seguenti privilegi (permessi).

Privilegi su database

Istruzione Risultato
SELECT Permette agli utenti di cercare le righe in una tabella
INSERT Permette agli utenti di aggiungere righe a una tabella
UPDATE Permette agli utenti di aggiornare le righe di una tabella
DELETE Permette agli utenti di cancellare righe in una tabella
ALL Assegna tutti i privilegi

Se aggiungi l'opzione WITH GRANT OPTION, stai consentendo all'utente di assegnare


privilegi ad altri utenti. Grazie all'istruzione seguente, l'Ufficio Vendite Estere può permettere
ad altri utenti di eseguire ricerche e aggiornare il database.

GRANT SELECT, UPDATE ON prodotti TO reparto_vendite_estere L'assegnatario può assegnare


WITH GRANT OPTION; privilegi ad altri utenti.

Puoi anche revocare i privilegi di un utente, usando l'istruzione REVOKE.

REVOKE SELECT, UPDATE ON prodotti FROM Quest’istruzione revoca


reparto_vendite_estere; i privilegi dati all'utente.

Alcuni applicativi permettono di raggruppare i privilegi e assegnarli a più utenti


contemporaneamente. Questa possibilità rende più semplice gestire i privilegi.

facciamo funzionare un database! 159


Puoi raggruppare i privilegi
Database e assegnarli a più utenti.

reparto reparto
reparto esportazione
vendite
logistica
estere

Grazie alle viste, come descritte a pagina 117, hai accesso a una gestione ancora più
controllata e sicura. Per prima cosa, estrai parte di una tabella base per generare una vista.
Assegnare un privilegio per questa vista sottintende che il privilegio è assegnato anche nella
porzione selezionata di dati che contiene.
Vista Tabella base

Gli utenti possono Gli utenti non possono modificare


modificare i dati nella vista. dati nel resto della tabella.

domande

Prova a rispondere a queste domande sulla durabilità. Troverai le risposte a pagina 168.

D9
Scrivi un'istruzione SQL che consenta al Reparto Esportazione di cercare dati nella
Tabella Prodotti.

D10
Crea un'istruzione SQL per revocare al Reparto Vendite Estere il privilegio di
cancellare dati dalla Tabella Prodotti.

D11
L'amministratore della Tabella Prodotti ha assegnato i seguenti privilegi. Completa la
tabella seguente con SÌ o NO per indicare l'assenza o la presenza di un privilegio in
ognuno dei reparti indicati.
GRANT ALL prodotti TO reparto_vendite_estere;
GRANT INSERT, DELETE ON prodotti TO reparto_logistica;
GRANT UPDATE, DELETE ON prodotti TO reparto_esportazioni;

Select Insert Update Delete


Reparto Vendite Estere
Reparto Logistica
Reparto Esportazione

160 capitolo 5
in caso di disastro

Un database deve prevedere un meccanismo di protezione dei dati, nel caso si verifichi un
problema (fallimento). Per assicurare la durabilità delle transazioni è necessario impedire
che un fallimento possa generare dati non corretti o incompleti. Per proteggersi da queste
eventualità il database ha a disposizione diverse operazioni, che includono la creazione di
backup e di registri delle transazioni.

le tipologie di fallimento
Un fallimento può avvenire in diverse circostanze, tra le più comuni ci sono le seguenti:
• Fallimento di transazione (Transaction failure)
• Fallimento di sistema (System failure)
• Fallimento fisico (Media failure)
Una transaction failure avviene quando una transazione non può essere completata
per via di un errore nella transazione stessa. In questi casi viene eseguito un ripristino
(rollback).
Una system failure avviene quando il sistema si spegne, per esempio a causa di
un'interruzione dell'alimentazione. Quando succedono fallimenti di questo tipo, l'operazione
di recupero prende il via subito dopo il reboot del sistema. In genere le transazioni che non
erano state ancora chiuse al momento del fallimento vengono perdute (rollback), mentre
quelle che erano già state completate al momento del fallimento vengono confermate (roll
forward).
Una media failure avviene quando il disco che contiene i database è danneggiato. Nel
caso di un tale fallimento, il ripristino è eseguito utilizzando i backup. Per le transazioni
finalizzate dopo che i file di backup erano stati creati sarà eseguito un roll forward.

i checkpoint
Al fine di migliorare l'efficienza di un'operazione di scrittura in un database, spesso si
usa un buffer (un segmento della memoria predisposto a memorizzare dati temporanei).
Nel momento in cui il contenuto del buffer è sincronizzato a quello del database viene
fissato un checkpoint. Quando il database scrive un checkpoint non deve effettuare nessun
ripristino per tutte le transazioni finalizzate prima del checkpoint stesso. Le transazioni che
non si erano chiuse prima del checkpoint dovranno invece essere recuperate.
Ora, supponiamo che mentre sono in esecuzione le transazioni mostrate qui sotto,
avvenga un fallimento di sistema. Quali transazioni dovrebbero essere gestite con un
rollback? Quali con un roll forward?
Checkpoint Momento del fallimento Tempo

Start
T1

Start Commit
T2

Start Commit
T3

facciamo funzionare un database! 161


domande
Queste domande fanno riferimento alla tabella nella pagina precedente. Troverai le risposte
a pagina 168.

D12
Come dev'essere processata la transazione T1?

D13
Come dev'essere processata la transazione T2?

D14
Come dev'essere processata la transazione T3?

In caso di fallimento, i meccanismi di ripristino descritti in precedenza proteggeranno


il database dal rischio di incongruenze nei dati. L'integrità di un database è un prerequisito
fondamentale per gli utenti.

gli indici
Un database gestisce grandi quantità di dati, quindi la ricerca di uno specifico dato può
risultare molto laboriosa. Ma gli indici consentono di accelerare le ricerche!
Codice prodotto Nome prodotto Prezzo unit. Distretto
101 Melone 800Au Mare del Sud
102 Fragola 150Au Centrale
103 Mela 120Au Mare del Nord Ricercare un dato
104 Limone 200Au Mare del Sud una riga alla volta
richiede molto
201 Castagna 100Au Mare del Nord tempo!
202 Caco 160Au Centrale
301 Pesca 130Au Mare del Sud
302 Kiwi 200Au Mare del Sud

Un indice è uno strumento che consente di accedere velocemente alla posizione del
dato ricercato. Quando si esegue una ricerca in database molto grandi, l'uso degli indici
consente di trovare in fretta il dato desiderato.

Codice prodotto Nome prodotto Prezzo unit. Distretto


101 Melone 800Au Mare del Sud
102 Fragola 150Au Centrale
103 Mela 120Au Mare del Nord La posizione del
dato ricercato è
104 Limone 200Au Mare del Sud
raggiungibile
201 Castagna 100Au Mare del Nord velocemente usando
202 Caco 160Au Centrale il suo indice.

301 Pesca 130Au Mare del Sud


302 Kiwi 200Au Mare del Sud Index

162 capitolo 5
Esistono vari metodi di indicizzazione, tra cui i B-alberi e le tabelle hash. Un B-albero
si compone di nodi padre e di nodi figlio, i quali possono a loro volta avere dei nodi figlio. I
nodi sono disposti in ordine, ogni nodo padre contiene informazioni sul valore minimo e sul
valore massimo contenuto da tutti i suoi figli. Questo permette al database di raggiungere
in fretta la posizione desiderata, saltando intere sezioni dell'albero che sicuramente non
contengono il valore desiderato.

200 In un B-albero, la
posizione desiderata si
raggiunge in fretta.

120 150 310 340

L'indice hash invece consente di trovare la posizione del dato ricercato applicando una
funzione hash al valore chiave del dato. L'hash è unico, come le impronte digitali. Questo
metodo permette di eseguire ricerche molto specifiche, come per esempio la ricerca del
codice prodotto 101. Non è però progettato per funzionare efficacemente nei casi in cui la
ricerca usi condizioni comparative come codice prodotto maggiore di 101 o condizioni poco
definite come prodotti che finiscono per 'e'.

101 In un indice hash la


posizione desiderata
si raggiunge in fretta.
101

Funzione
hash

In certi casi usare un indice potrebbe non semplificare una ricerca: un indice non
permette di guadagnare tempo, a meno che la ricerca non sia circoscritta a una piccola
porzione dei dati. Esistono anche casi in cui gli indici devono essere ricreati ogni volta
che viene modificato un dato, e questo provoca un rallentamento nel processare un
aggiornamento.

facciamo funzionare un database! 163


domande
Verifica la tua comprensione degli indici. Troverai le risposte a pagina 168.

D15
Quale indice sarebbe più efficace se la tua condizione fosse 'uguale a...', un B-albero
o un indice hash?

D16
Quale indice sarebbe più efficace se la tua condizione fosse 'diverso da...', un B-albero
o un indice hash?

ottimizzare una query


Quando esegui una query, il database analizza l'istruzione SQL e considera se è opportuno
usare un indice per elaborarla più speditamente. Esaminiamo la procedura con cui viene
elaborata una query.
Il database può decidere qual è l'ordine ottimale per elaborare una query. Molte query
possono essere processate variando l'ordine delle istruzioni senza che questo influisca sul
risultato, ma con benefici sulla velocità di ricerca. Per esempio, immaginiamo una query
che serve a estrarre le date delle vendite e i nomi dei prodotti caratterizzati da un prezzo
unitario superiore a 200Au. Questa query può essere riassunta nei passi seguenti:

SELECT data, nome_prodotto


FROM prodotti, vendite
WHERE prezzo_unitario>=200
AND prodotti.codice_prodotto = vendite.codice_prodotto;

1. Unisci la Tabella Prodotti e la Tabella Vendite.


2. Seleziona i prodotti il cui prezzo unitario è maggiore o uguale a 200Au.
3. Estrai le colonne data e nome prodotto.
Lo schema qui sotto a sinistra mostra la query elaborata nell'ordine da 1 a 3. Lo
schema a destra, invece, mostra la query elaborata nell'ordine da 3 a 1. Il risultato di
entrambe le query è lo stesso.

tabelLa tabelLa tabelLa


vendite prodotTi prodotTi

tabelLa
unione vendite
proiezione

selezione
proiezione selezione

proiezione unione

164 capitolo 5
A prescindere dal risultato, procedere da 1 a 3 richiede in generale un tempo di
elaborazione più lungo, perché quando viene realizzata la prima unione si genera una
tabella intermedia che contiene moltissime righe. Invece, procedere da 3 a 1 richiede meno
tempo, perché la selezione e la proiezione provvedono a escludere dati non desiderati sin
dal principio. Quindi una medesima query può richiedere tempi di elaborazione diversi, a
seconda dell'ordine in cui l'unione, la selezione e la proiezione vengono eseguite.
In genere, il database dovrebbe seguire queste regole per stabilire l'ordine di
esecuzione ottimale:
• Eseguire prima la selezione, per ridurre il numero di righe.
• Eseguire prima la proiezione, per ridurre il numero di colonne non rilevanti al risultato.
• Posticipare l'unione.
Esistono diverse tecniche per eseguire proiezione, selezione e unione. Per la selezione
si possono avere ricerche per concordanza totale (full-match) o ricerche basate su indici.
Per l'unione sono disponibili i metodi seguenti.

i cicli annidati
Il metodo dei cicli annidati confronta una riga in una tabella a diverse righe in un'altra
tabella (vedi la figura qui sotto). Per esempio, uno dei valori in una riga della Tabella T1
viene usato per trovare righe equivalenti nella Tabella T2. Se i valori sono identici, allora
vengono unite le righe.

tabelLa t2
tabelLa t1
101
101
101
102
102 Tutte le righe
103 sono
102 confrontate a
104 ognuna delle
righe di T1.

facciamo funzionare un database! 165


sort merge (ordina e unisci)
Il metodo sort merge ordina e unisce righe in tabelle separate (vedi la figura sotto). Prima,
una porzione o tutte le Tabelle T1 e T2 vengono ordinate. Poi sono confrontate a partire
dalla prima riga, e tutte le volte che viene trovato un valore identico le righe vengono
unite. Visto che le tabelle sono state pre-ordinate il meccanismo deve lavorare in una
sola direzione, con evidente risparmio di tempo. Bisogna ovviamente considerare il tempo
necessario all'inizio per ordinare le righe.
tabelLa t1 tabelLa t2

101 101

102 101
Prima ordina e
103 102 poi confronta.

104 102

Hash
Un hash divide una delle tabelle utilizzando una funzione hash, e poi le collega con una riga
in un'altra tabella con lo stesso valore di hash. Questo metodo seleziona efficacemente le
righe che devono essere unite.

tabelLa t1 tabelLa t2

Funzione Funzione
hash hash

166 capitolo 5
l'ottimizzatore
Quando viene eseguita una query, ci sono diverse tecniche per ottimizzare la sua
performance. In un database, la funzione deputata all'ottimizzazione delle query si chiama
ottimizzatore. Gli ottimizzatori sono di due tipi.

ottimizzazione basata sulle regole

Prima di eseguire le operazioni vengono stabilite alcune regole. Per esempio, alcune
operazioni possono essere combinate o rimescolate, così come spesso in un'espressione
algebrica gli operatori possono cambiare di posto senza modificare il risultato.
L'ottimizzatore cerca il modo più efficiente di elaborare la query senza modificarne il
risultato.

Ottimizzazione basata sui costi

Questo metodo cerca di stimare quanto costa in termini di tempo eseguire la query, sulla
base di dati statistici raccolti dal database. La gestione basata sui costi può risultare più
flessibile di quella basata sulle regole, ma richiede un aggiornamento periodico dei dati
statistici da parte del database. La gestione e l'analisi di questi dati statistici richiede molto
tempo.

riassumendo

• Puoi stabilire i privilegi per gli utenti del tuo database.


• I blocchi proteggono la coerenza dei dati quando il database ha molti utenti.
• L'indicizzazione permette di velocizzare le ricerche.
• Un database possiede meccanismi di ripristino in caso di fallimento.

risposte

D1

COMMIT;

D2

ROLLBACK;

D3 Sì.

D4 No.

D5 No.

facciamo funzionare un database! 167


D6 No.
D7 Aumenta.
D8 Diminuisce.
D9

GRANT SELECT ON prodotti TO reparto_esportazioni;

D10

REVOKE DELETE ON prodotti FROM reparto_vendite_estere;

D11

Select Insert Update Delete


Reparto Vendite Estere SÌ SÌ SÌ SÌ
Reparto Logistica NO SÌ NO SÌ
Reparto Esportazione NO NO SÌ SÌ

D12
Con un rollback, visto che la transazione non si era chiusa con un commit nel
momento del fallimento.

D13
Con un roll forward, visto che la transazione si era chiusa con un commit prima del
fallimento.

D14
Non è necessario alcun ripristino visto che è stata chiusa con un commit prima del
checkpoint.

D15
Hash.

D16
B-albero.

168 capitolo 5
6
i database sono ovunque!
*
delizioso!
questo frutto
*gnam slurp! viene dal regno!

padre!

no, no!

sì? che
succede?
anche tu vuoi
una banana,
ruruna?

padre, da
scusa, la
quando sei
frutta di
tornato non
kod non ha
hai fatto
paragoni!
altro che
ingozzarti di
frutta.

ma devo ammettere i database


che ruruna ha tenuto sono
ben salde le redini, in un'invenzione
nostra assenza. davvero
utile!
guarda come sta
prosperando il
regno di kod!
ma di sicuro non
t-tico... tico?
è di questo che
avete visto
volevi parlarmi,
tico?
giusto?

sì, proprio così!

ma a chi ti ha aiutato tantissimo


sì. oh... tico è riferisci? me e cain in vostra
una ragazza non l'ho mai assenza.
alta più o meno vista prima
così, e vola... d'ora.

...è uscita dal


libro che mi
hai inviato,
padre.

pensavo che mio


e tu l'hai io no.
padre sapesse di vista?
lei, visto che è
uscita dal libro
che mi ha mandato
lui.

lo sospettavo,
tico è invisibile
a tutti tranne
che a me e a principessa
cain. ruruna.
tico è scomparsa! dove diamine si
sarà nascosta?

e non sembra
essere neppure
nel libro.

proverò a
cercarla di
nuovo in tutto il
castello.

scusate!

oh, mi scusi,
maestà.

vostra altezza,
quei due
sembrano...

...andare davvero
d'accordo, o
sbaglio? è sparita!

eh eh!
non si trova da
nessuna parte! avrei
voluto...

tico, dove te ne
sei andata così,
all'improvviso?

...almeno
dirle addio.
anch'io.

ma insomma,
!!!
chi state
cercando?

cosa? eccomi
qui!
Tico!

oh!

ih ih ih!

i database sono ovunque! 173


ruruna, non ti
non è carino arrabbiare! ero così in
scusa.
burlarti pena per te!
così di noi!

dove sei
stata?

sono stata
molto occupata,
sapete?

ho volato per grazie al


tutto il regno database siamo
di kod, volevo tutti molto più
vedere quanto si efficienti,
è sviluppato l'uso ora.
del database.

oh,
capisco.

dall'altra parte del


mare ci sono nazioni in
cui i database vengono
usati per motivi molto
diversi.

davvero?

174 capitolo 6
i database in uso

immaginate
per esempio, in certi

PRELiEVO
un conto
stati i database sono corrente che
usati dalle banche può essere
per gestire i conti condiviso tra
correnti! più persone...

ento
trasferim
puoi prelevare
del denaro
dal tuo
conto oppure
banche con trasferirlo
database! nel conto di
qualcun altro.

sembra
davvero delle volte
comodo da anche i sistemi di
usare! prenotazione dei
puoi
treni sono basati su
effettuare database.
un pagamento
usando il
database!

tutti a
bordo! biglietto.

ricordate la lezione
grazie a un
sulle operazioni
database potresti
regolate dai
prenotare da
blocchi?
qualsiasi stazione.

proprio
così.

i database sono ovunque! 175


sono prenotazioni
sì. fondamentali
per consentire a
proprio
ti riferisci ai un gran numero
a quelli.
blocchi per di persone di
controllare effettuare una
le transazioni, prenotazione...
database
giusto?
...da luoghi
diversi e nello
stesso tempo
i miei amici senza correre
andy e
becky... il rischio
di doppie
prenotazioni.

ovviamente
sono anche esatto! i database
implementate data- bancari non possono
misure di base assolutamente farne a
sicurezza e meno.
protezioni
in caso di
guasti.
sarebbe un
misure in disastro se
caso di qualcuno
fallimento potesse
prelevare
i miei soldi
impunemente.

se mi
vuotassero
il conto
i database ci aiutano corrente sarei e non solo, i database
a terra.
in un sacco di modi. sono davvero ovunque.

puoi dirlo
forte!

176 capitolo 6
i database e il web

mi riferisco
per esempio? ai database
collegati al
Web.

Al Web?

wow, voglio
questo
libro.
o
at
m pr
in tutto il mondo co

sul Web si possono ora lo


che
acquistare un sacco di compro.
bello, è
cose. arrivato!

quindi... non devi


sembra davvero per esempio, più farti un elenco
pratico! puoi comprare dei titoli prima di
qualsiasi libro... andare in libreria!

questo sistema mi
piace tantissimo!

...acquistandolo la lista
su una pagina del re

web.

fantastico! qual
è il
pros-
simo?

i database sono ovunque! 177


quando hai
in mente Tico search
un tipo di
libro da
cercare...
categorie

parola chiave

...basta inserire
una parola chiave Tico
nel browser. search?

quale tipo
di libri ti
interessa? allora
scrivi parola chiave
"frutti"
nel campo
parola Frutti
vediamo un
chiave.
po'... quelli che
parlano di frutti.

sul server
la parola chiave viene viene eseguita
gestita come una un'istruzione sql,
richiesta http. immagino.
categorie

parola chiave

un computer che
riceve ed elabora una
richiesta come questa
si chiama server.

178 capitolo 6
server database
Server

SELECT nome_prodotto
FROM prodotti
WHERE nome_prodotti Data-
LIKE '%fruit%'; base

Router condizione
di ricerca

frutti
Internet

Router dati prodotto


cavoli!

poi, questa istruzione


sql viene inviata al
database per la query.

e il database restituisce mm-mmm.


come risultato i dati sui
prodotti.

server
database.

i database sono ovunque! 179


server

il server a questo si chiama risposta


punto crea una pagina http.
web con i risultati
della ricerca e la
invia all'utente.

server database
pagina server
web dati

data-
base
recupero

Router

risultati
della ehi, funziona!
Internet
ricerca

Router
già!

180 capitolo 6
quando compri
così possiamo
un prodotto, il
vedere su una
processo non
pagina web la
varia di molto.
lista dei libri
che parlano di
frutta.
wow, questo
lo comprerei
subito!

in quel caso,
un'istruzione sql
quindi... anche qui
viene lanciata per
sql.
ridurre il numero
di oggetti a
catalogo...
e
questo
cos'è?
...nella tabella
dell'inventario. principes-
a questo punto sa ruruna,
l'oggetto che hai guardi un
ordinato finisce istante.
nella tabella
spedizioni.

e
secondo
questo mi chiedo
lei questo quando
cos'è?! l'abbia
cos'è? pubblicato!

fruit
love consigliato: fruit love
autore: re di kod

re di kod

a volte salta
fuori anche
oh?!
qualcosa di
curioso, no?

i database sono ovunque! 181


immagino che un
sacco di clienti ac-
cedano alle librerie
online contempora-
neamente.

libreria
online
anche
con i blocchi e le
funzioni di sicurezza ...dev'esserci un
più sofisticate... sacco di lavoro per i
processori.

in quei casi il sì, il carico è distribuito tra


carico di lavoro molti server, per esempio
è suddiviso tra ci sarà un server per il web
più server. e uno per l'infrastruttura
(application server).

web
vuoi dire che server appli-
cation
ne utilizzano più ser-
di uno? ver

esatto! mentre un
application server
un web server è un compone le istruzioni
server che crea la web
sql, oltre a tanti altri
pagina web, giusto? server compiti.

appli-
pagina cation
web server

182 capitolo 6
database distribuiti

il carico può dal nome si


essere distribuito direbbe un
tra diversi server, database gestito
allora? da più server.

sì, e quando questo hai


succede parliamo di capito
database distribuiti. bene.

Data
ba se
Se
rv
er

Serv
considera però er
er
che ognuno di Se
rv

questi server può


fungere da database
singolarmente.

è molto comodo
avere dei server
che possono
comportarsi come un
unico database.

in pratica ognuno di
loro può gestire le
richieste sulla base
della sua capacità.

i database sono ovunque! 183


molti server
vuol dire anche
protezione
extra contro i
fallimenti!

Ti-co!
Ti-co!

in pratica anche se
qualche server è
colpito, il sistema
comunque rimane in
piedi.

p uò iniziare il
co nte g g i o

ma ricordate sempre
che ci vogliono anche
fallimento
precauzioni extra per
gestire il vostro
database in questo
wow!
modo.

per esempio?
poi, per esempio,
tutti i server devono
essere ripristinati
correttamente in caso di
problemi alla rete.
quando una transazione
viene chiusa con un
commit, dovrete
assicurarvi che vengano
aggiornati i dati in tutto il
database distribuito.

184 capitolo 6
le procedure archiviate e i trigger

esatto!
una rete è ecco perché
necessaria se si vengono utili
vogliono utilizzare le procedure
più server. archiviate...

...di solito vengono


create per alleggerire
il carico della rete.

archiviate...? archiviate non vuole


dire in questo caso
memorizzate?
eh?

giusto!

per ridurre il carico sulla


rete le operazioni effettuate
più frequentemente possono
essere memorizzate in un
database.

.
le operazioni o..
nd
n sa
effettuate più be', visto che pe
sto
di frequente... stiamo parlando di
mi chiedo quali libri, l'operazione
possano essere... di prelievo dal
magazzino nella
tabella inventario e
l'inserimento nella
tabella spedizioni...

...quelle non
sono forse
operazioni
tipiche?

i database sono ovunque! 185


...si possono memoriz-
zare le operazioni che
in pratica...
probabilmente saranno
svolte più di frequente...

...direttamente nel
database!

anche il nostro
grazie alla stored lavoro si riduce.
procedure non
dovremo lanciare capisco.
un'istruzione sql...

...tutte le volte
che vogliamo
prelevare un
libro dallo
stock e
lanciare la in questo
spedizione. modo il carico oh, sì, hai
di rete si riduce. ragione!

oltre a queste,
esistono anche
procedure che si
attivano automati-
camente.

automatica-
mente?

186 capitolo 6
quando si trigger,
aggiorna un dato, in questo caso come...
per esempio, una parliamo di
procedura può trigger.
essere eseguita ...il
automaticamente. grilletto!

sarebbe davvero
funziona come il pratico se tutte
grilletto di una le volte che
pistola! arriva un ordine
e il database si
aggiorna...

perché sono
vestito anch'io
così?

...partisse in
automatico
una procedura
che riduce
l'inventario
e prepara la
spedizione.

iih-
haa! il semplice acquisto
di un libro genera
un sacco di lavoro
dietro le quinte,
vero?
premi il grilletto e
parte un proiettile.
aggiorna un dato e viene
eseguita una procedura.

i database sono ovunque! 187


esatto. quanto a noi,
vero. dovremo
imparare tutte
queste cose,
anche se, nella passo dopo
maggior parte dei passo.
k
casi, il database ac
cl
non si vede...

...quando acquisti
un libro in rete.

che ne dici,
cain?

sono
d'accordo, bene!
principessa.

tico ci ha
non dimenticate mai
insegnato come si
che i database sono
usano i database,
il modo migliore di
ora possiamo
organizzare i dati in
continuare in
modo efficiente.
autonomia.

faremo del
nostro
mi piace! sono meglio!
pronta, usando i
database...

...costruirò
un regno
meraviglioso
dove tutti sì-ì-ì-ì!
potranno godere
di una vita
confortevole.
avete fatto
grandi ...poco
avete cominciato solo progressi... ma cosa stai
da poco a comprendere sicuro. dicendo, tico?
i meccanismi che ruotano ma avete
ancora
intorno ai database.
molto da
imparare! resterai
ancora con
ma sono noi, vero?
sicura che ve
la caverete
benissimo anche
da soli.

mi dispiace, ma...
oh, no...

...non posso.

devo
aiutare
il mio nk
tante Klu
lavoro qui è
persone.
terminato.

ci sono ancora molte


sì!
persone che vogliono
imparare a usare i
database!

perché io
sono...

allora andrai da
qualcun altro che ha
aperto un libro sui
database?

i database sono ovunque! 189


lA fatina
oggi ero venuta

dei solo a dirvi addio.

!
Database

ghi ghi

ma nonostan-
te le intenzioni, mi
sono trattenuta
di più.

è stato bello
tico, aspetta!
conoscervi, anche
se è durato poco!

devo...

Tico!!

mia cara
tico... tico!

190 capitolo 6
grazie!

se n'è andata.

ora dobbiamo
mi addolora utilizzare le
vederla conoscenze che
così triste, tico ci ha dato...
principessa.

oh, sì, hai


ragione.

...per creare un
vero sistema.
il tempo passa... principessa, va
tutto bene con
quel suo libro sui
database?

che disegni carini...


certo! farlo a
vuoi dare
un'occhiata? fumetti è
sì!
stata davvero
un'ottima
idea.
ora lo sto
semplificando
per fare in modo
e cain è un
che tutti possano
capire. disegnatore
eccellente.

...questa sarà la splendida!


copertina.
guarda...

192 capitolo 6
a proposito di
è davvero cain, il re sta
bella. aspettando che
vi decidiate per
l'organizzazione
delle nozze.

...oh, sì.

mio padre sta


aspettando noi?

va bene, vado c'era una


subito da lui. volta...

...un piccolo regno,


chiamato regno di
kod.

bene.

un giorno, da un
antico libro sui
database...

e nel
a s d
da tab di ko
i no
r eg
...sbucò
fuori una
piccola
fatina...

fine
i database nel web

I database vengono usati per molti scopi, per esempio nei sistemi di prenotazione
ferroviaria e nei circuiti bancari. Sono indispensabili nella vita di tutti i giorni e nelle
operazioni economiche. Come ho mostrato a Ruruna e a Cain, i database su server sono
molto diffusi. In un sistema basato su internet, il protocollo di comunicazione che si usa
è l'HTTP (HyperText Transfer Protocol). Il server attende una richiesta da un utente, e
quando la riceve (si chiama richiesta HTTP) risponde via software tramite una pagina web
generata appositamente (risposta HTTP).
Una pagina web consiste di vari testi in formato HTML. Altri file specificati da URL
(Uniform Resource Locator) possono comparire all'interno di una pagina web per fornire
informazioni aggiuntive (per esempio immagini).
Web client Web server

richiesta htTp

risposta htTp
pagina
web

Quando un database è usato in associazione a una pagina web, allo schema


precedente si aggiunge un server database. Il sistema può essere configurato in tre livelli,
e prende il nome di architettura client-server a tre strati (three-tier). Un sistema di questo
tipo comprende tre livelli (di presentazione, di applicazione e di gestione dei dati).

liv. ApPl. liv. gest. Dati

Database
Server

Router

internet

Router

liv. presentazione

Client

194 capitolo 6
Il livello di presentazione riceve una richiesta dall'utente, ad esempio una condizione di
ricerca, che dev'essere condivisa con il database. Questo livello serve anche a elaborare i
risultati ricevuti dal database perché siano visualizzati sullo schermo dell'utente. Un browser
web (come Chrome o Firefox) funziona come strumento di presentazione e interfaccia per
l'utente.
Il livello di applicazione si occupa di elaborare i dati, ed è qui che vengono composte
le istruzioni SQL. I processi così gestiti possono essere scritti utilizzando linguaggi di
programmazione diversi. A seconda dei contenuti e della quantità di processi, potrebbe
essere necessario utilizzare più server (ad esempio un application server e un web server)
per gestire tutti i processi.
Il livello di gestione dei dati elabora i dati su un database server. I risultati della ricerca
sono restituiti dal database in risposta a una query SQL.

Invia query al Gestisce il


database ed database.
elabora i dati. liv. ApPl. liv. gest. Dati

Database
Server

Server

Router

internet

Router
Riceve la richiesta
dell'utente e
visualizza i risultati.

liv. Presentazione

Client

L'architettura client-server a tre strati è un sistema semplice e flessibile. Per esempio,


quando si implementano nuove aggiunte o modifiche, permette di separare la porzione che
ci interessa modificare come parte del livello di applicazione. Nel livello di presentazione, poi,
permette di usare un browser web eliminando la necessità di installare software specifici.

i database sono ovunque! 195


Permette di
aggiungere e
modificare funzioni
liv. ApPl. liv. gest. Dati
in modo semplice.
Database
Server

Server

Router

Internet

Router
Un browser web
è sufficiente per
l'operatività.

liv. Presentazione

Client

Usare le procedure archiviate


In un sistema basato sul web, l'incremento del traffico in rete può generare dei problemi.
Per fortuna puoi memorizzare all'interno del database server delle procedure per
alleggerire lo scambio dei dati.
Memorizzare procedure nel database server consente di ridurre il carico sulla rete
perché elimina il bisogno di trasferire di frequente query SQL. Tra l'altro, le procedure
semplificano lo sviluppo delle applicazioni, visto che processi standard possono essere
incapsulati in applicazioni pronte all'uso. In realtà, le procedure non sono che un aspetto del
mondo molto più vasto dei programmi memorizzati. Le altre tipologie di programma sono le
funzioni e i trigger.

tipologie dei programmi memorizzati

Tipologia Definizione
Procedura Programma che non restituisce valori dalla procedura in corso
Funzione Programma che restituisce valori dalla procedura in corso
Trigger Programma lanciato automaticamente prima o dopo le operazioni del
database

domande
Riesci a rispondere a queste domande? Troverai le risposte a pagina 205.

D1
In un'architettura client/server a tre strati, in quale dei tre livelli opera il database?

196 capitolo 6
D2
In un'architettura client/server a tre strati, quale dei tre livelli interagisce con l'utente
e mostra i risultati?

che cos'è un database distribuito?

In un sistema pensato per il web, l'operatività è distribuita tra un database server, un web
server e un browser web, ognuno dei quali risponde a esigenze specifiche. Questo genere
di sistema distribuito consente maggiore flessibilità e diminuisce le esigenze in termini di
capacità di calcolo dei singoli server.
Ma anche un database server può essere distribuito su più server separati. I database
server distribuiti possono trovarsi in luoghi diversi o sulla stessa rete. C'è però da
sottolineare che un database distribuito può essere gestito come se fosse un singolo. Se
il database distribuito appare come se fosse caricato su un solo server, l'utente non deve
preoccuparsi dell'ubicazione dei dati o del loro trasferimento.
Un database, come vedremo, può essere distribuito orizzontalmente o verticalmente.

La distribuzione orizzontale
La distribuzione orizzontale utilizza diversi database server paritari. Ognuno di loro può
elaborare dati provenienti dagli altri e, parimenti, ognuno di loro si rende disponibile agli
altri. Questa struttura viene usata per sistemi di database che operano separatamente in
ogni reparto.
Un database distribuito orizzontalmente è un sistema progettato per essere
particolarmente robusto, visto che un fallimento su uno dei server non inficia l'operatività
del database.
Server A Server B

Anche in caso di
fallimento su uno dei
server del reparto A...

Router

Router

...gli altri server


possono continuare
a operare.
Server C Server D

i database sono ovunque! 197


la distribuzione verticale
La distribuzione verticale assegna ai server compiti diversi. Uno dei server funzionerà
come server principale (main server) e avrà dunque un ruolo chiave, mentre gli altri server
riceveranno compiti più specifici. Una distribuzione di tipo verticale semplifica la gestione
del server principale, anche se lo "condanna" a gestire carichi maggiori. Un esempio di
distribuzione verticale potrebbe essere il server principale di una grande azienda, a cui sono
collegati i server relativi a ogni singolo reparto.

Server A
server
Questo server principale
pilota l'intero
sistema di
server.

Router

Router

Server B Server C

partizionamento dei dati

In un database distribuito i dati vengono memorizzati su server diversi. È molto importante


stabilire correttamente come suddividere i dati. I dati possono essere divisi nei seguenti
modi.

il partizionamento orizzontale
Un partizionamento orizzontale divide i dati separandoli per righe. Le righe che risultano da
questa divisione vengono poi distribuite su più server. Questa forma di partizionamento è
spesso usata quando i dati possono essere suddivisi in modo da poter raggruppare sullo
stesso server dati collegati tra loro (e, per questo, oggetto spesso di accessi simultanei).
regione a regione b
reparto vendite reparto vendite
Nome Prezzo
Distretto Venditore
prodotto unitario

198 capitolo 6
il partizionamento verticale
Un partizionamento verticale divide i dati per colonne. Le colonne che risultano da queste
divisione vengono poi distribuite su vari server. Per esempio, un partizionamento verticale
è consigliato per gestire e unire database indipendenti che provengono da reparti diversi,
come il Reparto Logistica, il Reparto Vendite e il Reparto Esportazione.

reparto Nome Prezzo Reparto


Distretto Venditore
logistica prodotto unitario vendite estere

prevenire le incoerenze con un commit a due fasi

I database ospitati da server diversi in un database distribuito possono essere configurati


per comportarsi come un database singolo agli occhi degli utenti. Sono però necessari
diversi passaggi per superare il fatto che i dati sono effettivamente memorizzati all'interno
di server separati.
Per prima cosa, ogni volta che viene eseguita un'operazione su un dato, tutti i dati su
tutti i server devono essere aggiornati di conseguenza.
In un database distribuito, il "commit" standard potrebbe condurre ad asincronie negli
aggiornamenti, come mostrato qui sotto. È una violazione del principio di atomicità delle
transazioni, visto che questa transazione è destinata a non concludersi né con un commit
né con un rollback, e questo renderebbe incoerente l'intero sistema database.
User

Server A Server B

agGiornamento

agGiornamento

COmMIT

COmMIT

Quindi, un commit a due fasi viene adottato nei database distribuiti. Il commit a due
fasi crea un'operazione di commit sia dalla prima che dalla seconda operazione di commit.

i database sono ovunque! 199


Un commit a due fasi prevede la presenza di un coordinatore e di vari partecipanti.
All'inizio del commit a due fasi, il coordinatore chiede ai partecipanti se un commit è
possibile. In questo caso, i partecipanti rispondono OK. Questa fase preliminare è nota con
il nome di preparazione (prepare). Nella seconda fase, il coordinatore invia le istruzioni per il
commit, e tutti i partecipanti lo eseguono di conseguenza.
coOrdinatore

partecipante partecipante

agGiornamento

agGiornamento

Secure
Secure

OK
OK

COmMIT

COmMIT

Se uno dei nodi non può assicurare l'operazione nel commit a due fasi, tutti i
partecipanti ricevono l'istruzione di eseguire un rollback. Così i database su tutti i server
restano consistenti fra di loro.
CoOrdinatore

partecipante partecipante

agGiornamento

agGiornamento

Secure
Secure

OK
OK

RolLback

RolLback

200 capitolo 6
domande
Prova a rispondere a queste domande sui commit a due fasi. Troverai le risposte a pagina
205.

D3
In uno schema che prevede commit a due fasi, quali istruzioni invia il coordinatore
durante la prima fase?

D4
In uno schema che prevede commit a due fasi, quali istruzioni invia il coordinatore
durante la seconda fase?

la replicazione di un database

Alcuni database distribuiti prevedono duplicati, o repliche, che servono a ridurre il carico
sulla rete. Questa pratica prende il nome di replicazione. Il database primario viene definito
master, mentre la copia è definita replica. Esistono molti tipi diversi di replicazione.

La modalità di sola lettura


Una replica di sola lettura viene creata e copiata dal master e resa disponibile. Per
modificare i dati l'utente deve essere connesso al server principale.

server principale

Replica Replica

i database sono ovunque! 201


La replicazione con accesso a tutti i server
In questo metodo, il master è condiviso da tutti i server. Gli aggiornamenti eseguiti su un
server si riflettono anche sugli altri.

Le operazioni eseguite
su questo server si Le operazioni eseguite
riflettono anche sugli su questo server si
altri. riflettono anche sugli
server altri.
principale

Server A Server B

Le operazioni eseguite
su questo server si
riflettono anche sugli
altri.

ulteriori applicazioni dei database

Quest'ultima sezione introduce tecnologie applicate che si basano sempre sui database.

XML
L'XML (eXtensible Markup Language) sta diventando sempre più popolare come metodo
di conservazione dei dati. L'XML rappresenta i dati personalizzandoli con dei tag. Visto che
questi tag forniscono a loro volta informazioni sui dati a cui sono riferiti, questo linguaggio è
molto adatto alla conservazione e alla ricerca dei dati.
L'XML è utile perché la sua grammatica rigidamente strutturata semplifica i processi
di programmazione. Inolte, l'XML viaggia su file di testo (facilmente editabili) e può
comunicare con altri sistemi. Per queste ragioni, l'XML è talvolta usato come metodo per la
rappresentazione dei dati in alternativa al database.

202 capitolo 6
<?xml version="1.0"?>
<prodotti>
<frutto>
<codice prodotto>101</codice prodotto>
<nome prodotto>Melone</nome prodotto>
<prezzo unitario>800</prezzo unitario>
</frutto>
<frutto>
<codice prodotto>102</codice prodotto>
<nome prodotto>Fragola</nome prodotto>
<prezzo unitario>150</prezzo unitario>
</frutto>
<frutto>
<codice prodotto>103</codice prodotto>
<nome prodotto>Mela</nome prodotto>
<prezzo unitario>120</prezzo unitario>
</frutto>
</products>

i database orientati agli oggetti


Un database relazionale memorizza i dati in una tabella. Tuttavia, un database relazionale
potrebbe rivelarsi poco adatto a gestire determinati tipi di dato. Ecco dove entrano in gioco i
database orientati agli oggetti (OODB, Object-Oriented DataBase).
Questa metodologia utilizza oggetti, ovvero insiemi di dati e di istruzioni su come quei
dati dovrebbero essere utilizzati. Puoi per esempio nascondere i dati e rendere visibili solo
le operazioni sui dati, e quindi gestire l'oggetto come un componente indipendente. Questa
tecnica viene anche chiamata incapsulamento.
In un database orientato agli oggetti, ogni oggetto è rappresentato da un identificatore.
A volte, un oggetto può essere anche chiamato istanza.
In un OODB puoi anche gestire oggetti composti, vale a dire oggetti che ne contengono
altri al loro interno. Questo, per esempio, significa che puoi memorizzare un'immagine
combinata a un testo come se fossero un unico oggetto. Il database orientato agli oggetti
consente quindi una gestione più flessibile di dati compositi.

Ruruna Kod

database orientato regno di kod


agli ogGetTi principesSa
profilo

i database sono ovunque! 203


In un database orientato agli oggetti, diversi concetti possono semplificare lo sviluppo.
Il modello di gestione degli oggetti è chiamato classe. Per esempio, immagina di avere
progettato una classe Mela. Gli oggetti (o istanze) in quella classe potrebbero essere Mela A,
Mela B e così via. La classe Mela consente la creazione di questi oggetti.

mela
mela

mela

mela
In uno schema orientato agli oggetti, una classe può anche essere inserita in una
gerarchia. Puoi creare una classe "figlia" che conterrà gli stessi dati e le stesse funzioni
della classe "madre". Questa relazione prende il nome di ereditarietà. Puoi anche assegnare
funzioni specifiche alla classe figlia.
Per esempio, la classe Mela e la classe Arancia possono ereditare i dati e le funzioni
della classe Frutta e possedere al contempo dati e funzioni specifiche. In uno schema
orientato agli oggetti le relazioni gerarchiche servono a garantire maggiore efficienza.

frutTa
arancia

Banana
mela

204 capitolo 6
riassumendo

• L'architettura client/server a tre strati è un metodo di configurazione per sistemi basati


sul web.
• Un database funge da livello di gestione dei dati.
• Un sistema database distribuito gestisce database allocati su risorse separate.
• Il commit a due fasi è un metodo usato nei database distribuiti.

risposte
D1 Il livello di gestione dei dati.

D2 Il livello di presentazione.

D3 Preparazione (prepare).

D4 Commit o rollback.

conclusioni

Ti è piaciuto studiare i database? Dovrai imparare ancora molte cose prima di essere in
grado di gestire tutti gli aspetti di un database, ma i principi fondamentali rimarranno
sempre gli stessi. Se capirai bene le regole di base, riuscirai a identificare i dati significativi
nel mondo reale, che è il primo passo per progettare e utilizzare un database. Poi,
lavorando sulle conoscenze acquisite, potrai completare la tua competenza con tantissime
tecniche avanzate. Buona fortuna!

i database sono ovunque! 205


le istruzioni sql più usate
query di base

SELECT nome_colonna, ...


FROM nome_tabella;

query condizionale

SELECT nome_colonna, ...


FROM nome_tabella
WHERE condizione;

Pattern Matching

SELECT nome_colonna, ...


FROM nome_tabella
WHERE nome_colonna LIKE 'pattern';

ricerca ordinata

SELECT nome_colonna, ...


FROM nome_tabella
WHERE condizione
ORDER BY nome_colonna;

aggregazione e raggruppamento

SELECT nome_colonna, ...


FROM nome_tabella
WHERE condizione
GROUP BY nome_colonna_per_raggruppamento
HAVING condizioni_per_righe_raggruppate

unione di tabelle

SELECT nome_tabella1.nome_colonna, ...


FROM nome_tabella1, nome_tabella2, ...
WHERE nome_tabella1.nome_colonna = nome_tabella2.nome_colonna
creazione di una tabella

CREATE TABLE nome_tabella(


nome_colonna1 tipo_di_dato,
nome_colonna2 tipo_di_dato,
...
);

creazione di una vista

CREATE VIEW nome_vista


AS SELECT istruzione

cancellazione di una tabella

DROP TABLE nome_tabella;

cancellazione di una vista

DROP VIEW nome_vista;

inserire una riga

INSERT INTO nome_tabella(nome_colonna1, ...)


VALUES (valore1, ...)

modificare una riga

UPDATE nome_tabella
SET nome_colonna = valore1, ...
WHERE condizione;

cancellare una riga

DELETE FROM nome_tabella


WHERE condizione;

208
indice
A controlli di concorrenza, - corruzione, 20, 154
accesso, 19, 106, 126–129, 141– - blocco, 131–137, 155–157, 167 - duplicati, 11, 16, 18, 19, 21, 29
142, 159–160, 167 - livelli di isolamento, 158 - elaborazione, 35–37, 47–48,
aggregazione, funzione di, - ottimistico, 158 130, 159, 167, 182,
98–100, 110–111 - sull’orario di accesso, 158 195–198
ALL (istruzione), 159 controllo, - estrazione, 36–37, 39–47
application server, 182, 195 - accesso utenti, 19, 106, 126– - gestione, 10, 19
architettura client-server a 129, 141–142, 159–160, - inserimento, 21, 90–92,
tre strati (three-tier), 167 103–104, 106, 116
194–196, 197, 205 - ottimistico, 158 - organizzazione, 32–39
atomicità, 153–154 - sull’orario di accesso, 158 - perdita, 20, 154
AVG, media (funzione), corruzione di dati, (v. dati, - protezione, 19, 127, 138–142,
98, 99, 110 corruzione di) 159–160, 161–164, 167,
COUNT (funzione), 99–100, 110 176, 182, 184
B CREATE TABLE (istruzione), - recupero, 20, 36–47, 90–92,
B-albero, indicizzazione, 163 103, 115–119 95–99, 101–102, 106,
backup, copie, 161 CREATE VIEW (istruzione), 117 147–152, 161–164,
base, tabelle, 167, 180, 202
(v. tabelle, base) D - ricerca, 93–97, 106, 108,
blocco, database, 6, 10, 15, 187 112–115, 163.
- a due fasi, 156–157 - efficienza, (v. anche SQL)
- condiviso, 133, 155–156 3–4, 15, 19, 146, 174 - sicurezza, 19, 127, 138–142,
- controllo, 131–137, 155–157, - fallimento, 161, 184, 197 159–160, 161–164,
167, 175–176, 182 - incoerente, 153, 154, 159, 167, 176, 182, 184
- esclusivo, 134–136, 155–156 199–201 dati condivisi, problemi con,
- granularità, 157 - inserimento su sistemi 12, 20, 21, 129, 175
buffer, 161 esistenti, 14 DBMS (DataBase Management
- master, 201–202 System), 21
C - modello, 33, 39 DCL (Data Control Language),
campo, 27–28, 30, 34, 35, 48 - modello gerarchico, 106
caratteri, 32, 33, 39, 204 DDL (Data Definition
- jolly, 97, 108 - note, 30–31 Language), 106
- stringa di, 84, 108 - replicazione, 201–202 deadlock, 136, 158
cardinalità, 74 - terminologia, 24–31 DELETE (istruzione),
checkpoint, 161–162 - tipi, 32–39 104, 116, 118, 119, 159
chiave, - uso, 19–21, 175–182 differenza (operazione),
- esterna, 44, 48, 72, 101 database distribuiti, 183–184, 37, 39, 41
- primaria, 35, 44, 48, 65, 67, 72, 197–199, 205 disastro, in caso di,
78–79, 101, 103, 115 - commit a due fasi, 20, 147–150, 161–164,
cicli annidati, metodo, 165 199–201, 205 167
coerenza, 153, 154–155, 184 - distribuzione orizzontale, distribuzione
colonne, 34, 84 197 - orizzontale, 197
COMMIT (istruzione), - distribuzione verticale, 198 - verticale, 198
133, 137, 150, 154, 205 - partizionamento dei dati, divisione, operazione, 37, 43, 45
commit a due fasi, 198–199 divisione tabelle (v.
199–201, 205 - replicazione, 201–202 normalizzazione)
conflitto di dati, (v. dati, database, progettazione, DML (Data Manipulation
conflitto di) 19, 26, 74, 81, 84 Language), 106
confronto, operatori di, - E-R (Entità-Relazione), DROP TABLE/DROP VIEW
(v. operatori di modello, 50–55, 74– (istruzione), 118
confronto) 77, 81 durabilità, 153, 159–160
congiunzione (operazione), - normalizzazione,
37, 43, 44, 48, 165 60–72, 78–81 E
congiunzione di tabelle, dati, elaborazione dati,
(v. tabelle, - conflitto, 13, 17–18, 21, 60, (v. dati, elaborazione)
congiunzione/ unione) 71, 116, 153, 158 entità, 52–54, 74
E-R (Entità-Relazione), modello, istanza, 203 - proiezione, 36, 37, 43, 165
50–55, 74–77, 81 - scrittura, (v. scrittura,
estrazione dati, L operazioni)
(v. dati, estrazione) lettura, - selezione,
- fantasma, 158 37, 39, 43, 47, 48, 165
F - non ripetibile, 158 - unione, 37, 39, 40, 48
fallimento fisico (media failure), - sporca, 158 ORDER BY (istruzione), 98
161 lettura, operazione, ordinare. (v. aggregazione,
fallimento, tipologie, 161 130, 133, 134, 159 funzione di)
forma, 62–70, 81–82 LIKE (istruzione), 97, 108 orizzontale,
- non normalizzata, 62, 78–79 livello, 194–196, 205 - distribuzione, (v. distribuzione
forma normale, - applicativo, 194–196 orizzontale)
- prima, 62–64, 66, 78–79 - di presentazione, 205 - partizionamento, (v,
- seconda, 62, 64, 66–69, 78–79, log, 148–149 partizionamento
82 orizzontale)
- terza, 62, 68, 69–70, 78–79, M ottimizzatore, 167
81, 82 master database, ottimizzazione
funzioni archiviate, 196 (v. database, master) - basata sui costi, 167
MAX (maximum value) - basata sulle regole, 167
G (funzione), 99–100, 110 - di una query, (v. query,
gestione dati meccanismi di ripristino, (v. ottimizzazione)
- scoordinata, 10 ripristino, meccanismi) outer join, 115
- unificata, 19 media failure,
gestione separata, 11, 19, 72 (v. fallimento fisico) P
GRANT (istruzione), 159, 168 memoria, (v. procedure partizionamento, 198–199
granularità, 157 archiviate) - orizzontale, 198
- dei blocchi, 157 MIN (minimum value), - verticale, 199
- fine, 157 (funzione), 99, 110 password, 141
GROUP BY (frase), 110 modelli di organizzazione dati, pattern, 108
(v. dati, organizzazione) permessi, 19, 106, 126–129,
H modello relazionale, 33–34, 35, 141–142, 159–160, 167
hash (funzione), 167 39, 47, 48 prima forma normale,
hash, indicizzazione, 163 molti-a-molti, relazione, 62–64, 66, 78–79
HAVING (frase), 111 55, 74, 75, 81 problemi nella gestione dei dati,
HTML (HyperText Markup - dati condivisi,
Language), 194 N 12, 20, 21, 129, 175
HTTP (HyperText Transfer nome utente, (v. utente, nome) - dati corrotti/persi,
Protocol), 178, 180, normalizzate, tabelle, 72, 91 20, 154
194 normalizzazione, 60–72, 78–81 - dati duplicati,
note, 30–31 11, 16, 18, 19, 21, 29
i null, 30-31, 108 - dati incoerenti,
incapsulamento, 203 153, 154, 159, 199–201
indice/indicizzazione, O - dati in conflitto, 13, 17–18, 21,
143–147, 162–164, 167 oggetti composti, 203 60, 71, 116, 153, 158
inner join, 115 OODB (Object-Oriented - difficoltà nella variazione dei
inserimento dati, (v. dati, DataBases), 203–205 dati, 13, 14, 17, 18
inserimento) operatore, 107 - fallimento, 161
INSERT (istruzione), - di confronto, 107 procedure archiviate,
104, 116, 119, 159 - di insieme, 39–42 185–188, 196
Internet database. - logico, 107 prodotto cartesiano,
(v. Web, database sul) - relazionale, 43–47 operazione, 37, 39, 42
intersezione, operazione, operazione, programmazione, linguaggi,
37, 39, 41 - congiunzione, 178, 180, 194, 202
ISBN (International Standard 37, 43, 44, 48, 165 proiezione, operazione,
Book Number), 45 - differenza, 37, 39, 41 36, 37, 43, 165
ISO (International Organization - divisione, 37, 43, 45 protezione dati,
for Standardization), - estrazione dati, 39–47 (v. dati, protezione)
124 - intersezione, 37, 39, 41
isolamento, 153, 155–158 - prodotto cartesiano, Q
- livelli di, 158 37, 39, 42 query. (v. SQL; SQL, istruzioni)

210 indice
query, ottimizzazione, 164–167 - aggregazione, funzione di, - congiunzione/unione,
98–100, 110–111 44, 101–102, 114–115
R - caratteri jolly 97, 108 - creazione, 57–59, 91–92, 103–
raggruppamento, 110, 159 - condizioni, 105, 106, 115–119
READ COMMITTED, 95–96, 101, 107–109 - forme, 62–70, 81–82
transazione, 158 - congiunzione di tabelle, - multiple, 59
READ UNCOMMITTED, 44, 101–102, 114–115 - normalizzate 72, 91
transazione, 158 - creazione tabelle, 91–92, 103– - normalizzazione,
recupero dati, (v. dati, recupero) 105, 106, 115–119 60–72, 78–81
registro, 27–28, 34, 48, 148–149 - creazione vista, 117, 160 - vincoli 116
relazione, 54, 74 - frasi, 94–97, 106, 110–111, 119 - vista, 117, 160
- E-R (Entità-Relazione), - gestione dati, tag, 202
50–55, 74–77, 81 90–92, 100, 106, 116 terza forma normale, 62, 68,
- gerarchica, 32, 33, 39, 204 - GROUP BY (frase), 110 69–70, 78–79, 81, 82
- molti-a-molti, 55, 74, 75, 81 - HAVING (frase), 111 transazione, 126–130
- uno-a-molti, 55, 75, 81 - metodi di ricerca, 93–97, 106, - fallimento, 161
- uno-a-uno, 74, 81 108, 112–115, 163 - operazioni di lettura/scrittura,
REPEATABLE READ, - operatori di confronto, 107 130, 133, 134, 159
transazione, 158 - operatori logici, 107 - proprietà 153–160
replica, 201–202 - ottimizzazione di una query, - recupero dati, 149–150
- in sola lettura, 201 164–167 trigger, 187, 196
REVOKE (istruzione), - pattern, 108
159, 160, 168 - standardizzazione, 124 U
riga, 34, 84, 116 - subquery, 112–114 unione (operazione),
right outer join, 115 - Web database, 37, 39, 40, 48
ripristino, meccanismi, 20, 178–179, 195–196 univoco, 30
147–150, 161–164, 167 - WHERE (frase), uno-a-molti, relazione,
risorse, 155 94–97, 106, 110, 119 55, 75, 81
ROLLBACK (istruzione), 136– SQL (Structured Query uno-a-uno, relazione, 74, 81
137, 150, 153–154, 205 Language), istruzioni, UPDATE (istruzione),
roll forward, 149 - ALL, 159 104, 116, 119, 159
- COMMIT, utente,
S 133, 137, 150, 154, 205 - autorizzazione, 141, 159
schema, 81 - CREATE TABLE, 103, 115–119 - nome, 141
- concettuale, 81 - CREATE VIEW, 117
- esterno, 81 - DELETE, V
- interno, 81 104, 116, 118, 119, 159 valori funzionalmente
scrittura, operazioni, - DROP TABLE/DROP VIEW, 118 dipendenti, 79
130, 133–134, 159 - GRANT, 159, 168 valori transitivamente
seconda forma normale, 62, 64, - INSERT, 104, 116, 119, 159 dipendenti, 79
66–69, 78–79, 82 - LIKE, 97, 108 verticale,
SELECT (istruzione), 93–97, 98, - ORDER BY, 98 - distribuzione (v. distribuzione
105, 106, 113, 119, 159 - REVOKE, 159, 160, 168 verticale)
selezione, operazione, - ROLLBACK, 136–137, 150, - partizionamento, (v,
37, 39, 43, 47, 48, 165 153–154, 154, 205 partizionamento
SERIALIZABLE, transazione, - SELECT, 93–97, 98, 105, 106, verticale)
155, 156, 158 113, 119, 159 vista, creazione di, 117, 160
server, 178–185, 194–197, 205 - SET TRANSACTION, 158, 160
SET TRANSACTION - UPDATE, 104, 116, 119, 159 W
(istruzione), 158, 160 SQL92/SQL99, 124 Web, database sul,
sicurezza, 19, 127, 138–142, Structured Query Language. 177–182, 194–197
159–160, 161–164, 167, (v. SQL) WHERE (frase),
176, 182, 184 subquery, 112–114 94–97, 106, 110, 119
sort merge (ordina e unisci), subquery correlata, 113–114
metodo, 166 SUM (funzione), 99, 110 X
sovrascritture non autorizzate, XML (eXtensible Markup
140 T Language), 202
SQL (Structured Query tabella/tabelle, 34, 39, 48
Language), 90–92, 106, - a due dimensioni, 34, 79
116, 124 - base, 160

indice 211
l'autrice
Mana Takahashi, dopo una laurea in Economia alla Tokyo University si è
specializzata nella comunicazione tecnica e ha pubblicato numerosi libri su
argomenti quali Java, C, XML, progettazione e amministrazione di sistemi.