Professional Documents
Culture Documents
Contents
1 2 Introduzione. Analisi dei requisiti
2.1 2.2 2.3 Analisi informale dei requisiti . . . . . . . . . . . . . . . . . . . . Operazioni sui dati . . . . . . . . . . . . . . . . . . . . . . . . . . Buisness Rules . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2 3
3 4 4
3 4
5 5
5 5 7 7
Implementazione
5.1 Script di creazione . . . . . . . . . . . . . . . . . . . . . . . . . .
8
8
6 7
Sicurezza Triggers
7.1 7.2 7.3 7.4 Buisness rule 2 Buisness rule 1 Buisness rule 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13 14
14 14 15 15
Query
8.1 8.2 8.3 8.4 Calcolo dei pianeti dove non presente una fabbrica Calcolo dei marinai in attivit sulla nave N . . . . . . . . . . . . . . . . . . .
16
16 17 17 17
Calcolo delle astronavi capaci di volo a curvatura maggiore di 5 Calcolo della classica di navi da battaglia dotate di velivoli ordinata per il numero di velivoli avversari abbattuti . . . . . . . . .
. . . . . . .
17 17 18 18 18 18 19 19 19
Calcolo dell' uciale di grado maggiore a bordo della Nave N . . Calcolo di tutte le otte con navi incapaci di volo a Curvatura di una Fazione F . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Calcolo di tutte le classi con almeno una nave costruita su un pianeta P . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Calcolo di tutte le navi con armamenti non sottoposti a manutenzione da una data D
8.10 Calcololo del numero di marinai di ogni razza per ogni nave . . . 8.11 Calcolo del Marinaio che ha svolto la mansione M col grado pi alto un una nave di classe C . . . . . . . . . . . . . . . . . . . . . 8.12 Calcolo dei Velivoli pilotati da Piloti di Grado G . . . . . . . . . 8.13 Calcolo del numero di marinai attivi su ogni nave . . . . . . . . . 8.14 Calcolo dei Marinai che Sono di una specie originaria di un pianeta nel sistema "S" o che hanno avuto un incarico in una otta stanziata su un pianeta nel sistema "S" . . . . . . . . . . . . . .
19 20
8.15 Calcolo degli incarichi eettuati o su navi varate nel 2000 o da marinai nati nel 2000 . . . . . . . . . . . . . . . . . . . . . . . . . 8.16 Calcolo delle navi con parti prodotte in pianeti con alte temperature 20
Ottimizzazione Query
9.1 9.2 9.3 9.4 9.5 9.6 Ottimizzazione di 8.10 (2.56sec Ottimizzazione di 8.11 Ottimizzazione di 8.13 Ottimizzazione di 8.14 Ottimizzazione di 8.15 Ottimizzazione di 8.16
20
1.69sec) (0.06sec 0.00sec) (0.76sec 0.48sec) (2.45sec 0.05sec) (1.21sec 0.13sec) (1.21sec 0.13sec)
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
20 23 24 26 32 33
36 37 38
Introduzione.
In molte delle ambientazioni della fantascienza moderna uno degli elementi pi importanti la presenza di navi capaci di volo atmosferico e interplanetario, se non interstellare o intergalattico a seconda della potenza dei motori (e del livello di plausibilit dell'ambientazione presa in esame). Che si parli degli enormi StarDestroyers Imperiali di Star Wars alle piccole scorte classe Deant di Star Trek DS9. Gli sceneggiatori di questo genere di narrativa pongono spesso l'accento sulle speciche e le caratteristiche di queste navi, dando spessore e verosimigianza a racconti e telelm di fantascienza. Spesso dietro alle navi c' una complessa organizzazione in otte e squadroni, provenienti da diverse organizzazioni come stati, imperi e unioni commerciali. Questo progetto si propone
di creare uno strumento utile a gestire tutto questo insieme di informazioni, che consiste in:
Speciche tecniche delle navi personale umano (spesso umano un termine riduttivo in questo ambito) organizazione politica
organizzazione o fazione, ha un porto di stanza ed un ammiraglio. Una fazione ha un nome e ha il suo quartier generale su un pianeta. Un pianeta ha un nome ed orbita in un sistema, ha una serie di coordinate spaziali, una temperatura media, e la sua orbita ha un apogeo ed un perigeo.
Progettazione Fisica
nel primo caso si scelto di incorpare il padre nelle glie essendo profonda la distinzione tra le due entit,nel secondo caso si scelto di incorpare le glie nel padre,essendo la distinzione tra le due entit ebile, aggiungendo l' attributo booleano IsWarship a Nave in modo da poter tener traccia della dierenza.
Produzione Arm.
Produzione Vel. Pilota Nascita Xenologia Origine Speciche Tipologia Arm. Tipologia Vel. Fa_Fl Fl_Na Cl_Mc Cl_Mi Locazione Inc_Mar In_Gr Compito Stanza QG
in tutti i casi la chiave della tabella che partecipa con cardinalit n posta come chiave esterna (o foregin key) della tabella con cardinalit n.
11. Flotta (idFleet, idFazione, idPianeta, Ammiraglio_Name, Ammiraglio_Cognome) 12. Class (Class, MotoreImplz_idMotoreImplz, MotoreCurv_idMotoreCurv, NameClass, ISWarship, NoPonti,Lunghezza, Larghezza, Altezza, Massa, PotenzaScudi) 13. Gerarchia ( idFazione, Grado_idGrado) 14. Marinaio (Matricola, idSpecie, idPianeta, Nome, Cognome, DataDiNascita, DataDiMorte) 15. Velivolo (idVelivolo, ModVelivolo_idModVelivolo, Facility_idFacility, Pilota_Matricola, Nick, Tacche) 16. Nave (Codice, Class, Facility_idFacility, Flotta_IdFleet, Nome_Varo, Data_varo) 17. Incarico (IdIncarico, Nave_Codice, Grado_IdGrado, Mansione_idIncarico, Marinaio_Marticola, DataFineIncarico, DataInizioIncarico) 18. Armamento (idArmamento, Facility_idFacility, idModArmamento, Nave_Codice, MunizioniRimaste, DataUltimaManutenzione)
Implementazione
idMod_Armamento INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, F i r e R a t e INTEGER UNSIGNED NOT NULL, D e s c r i z i o n e VARCHAR( 8 0 0 ) NULL, G i t t a t a FLOAT( 1 0 , 2 ) ENGINE =InnoDB ; CREATE TABLE M a n s i o n e idIncarico ( P o n t e VARCHAR( 2 0 ) NULL, NULL, ) PRIMARY KEY( idMod_Armamento )
CREATE TABLE P i a n e t a
I d P i a n e t a INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, Nome VARCHAR( 3 0 ) NOT NULL, S i s t e m a VARCHAR( 3 0 ) NOT NULL, Pos_y FLOAT( 5 , 2 ) NOT NULL, Pos_x FLOAT( 5 , 2 ) NOT NULL, Pos_z FLOAT( 5 , 2 ) NOT NULL, A v r g T e m p e r a t u r a FLOAT( 4 , 1 ) NOT NULL, Apogeo INTEGER UNSIGNED NOT NULL, P e r i g e o INTEGER UNSIGNED NOT NULL, I s N o t D e s t r o y e d BOOL NULL DEFAULT True , PRIMARY KEY( I d P i a n e t a ) ENGINE =InnoDB ; CREATE TABLE M o t o r e I m p l z ( )
i d M o t o r e I m p l z INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, Output FLOAT( 4 , 1 ) NOT NULL, EnergyReq FLOAT( 6 , 3 ) NOT NULL, Massa FLOAT( 6 , 3 ) NOT NULL, Carburante VARCHAR( 2 0 ) NULL, ) PRIMARY KEY( i d M o t o r e I m p l z ) ENGINE =InnoDB ; CREATE TABLE MotoreCurv (
i d M o t o r e C u r v INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, C u r v a t u r a FLOAT( 3 , 2 ) NOT NULL, EnergyReq FLOAT( 5 , 2 ) NOT NULL, Massa FLOAT( 5 , 2 ) NOT NULL, T e c n o l o g i a C u r v a t u r a VARCHAR( 3 0 ) NULL, PRIMARY KEY( i d M o t o r e C u r v ) ENGINE =InnoDB ; CREATE TABLE Grado ( )
I d G r a d o INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, HScalaComando INTEGER UNSIGNED NOT NULL, NomeGrado VARCHAR( 2 0 ) NULL, PRIMARY KEY( I d G r a d o ) ENGINE =InnoDB ; CREATE TABLE F a z i o n e ( )
I d F a z i o n e INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, A l l i a n c e N a m e VARCHAR( 3 0 ) NOT NULL, I d P i a n e t a INTEGER UNSIGNED NOT NULL, PRIMARY KEY( I d F a z i o n e ) , FOREIGN KEY( I d P i a n e t a ) ON DELETE NO ACTION REFERENCES P i a n e t a ( I d P i a n e t a ) ON UPDATE CASCADE )
I d P i a n e t a INTEGER UNSIGNED NOT NULL, R e s i d e n z a VARCHAR( 3 0 ) NULL, CasaDIProd VARCHAR( 3 0 ) NULL, PRIMARY KEY( i d F a c i l i t y ) , INDEX F a c i l i t y _ F K I n d e x 1 ( I d P i a n e t a ) , FOREIGN KEY( I d P i a n e t a ) ON DELETE RESTRICT ENGINE =InnoDB ; CREATE TABLE S p e c i e idSpecie ( REFERENCES P i a n e t a ( I d P i a n e t a ) ON UPDATE CASCADE )
I d P i a n e t a INTEGER UNSIGNED NOT NULL, NameRace VARCHAR( 2 0 ) NOT NULL, A t m o s f e r a R e q VARCHAR( 2 0 ) NULL, Note BLOB NULL, I s N e a r E x t i n c t i o n BOOL NULL DEFAULT F a l s e , PRIMARY KEY( i d S p e c i e ) , INDEX S p e c i e _ F K I n d e x 1 ( I d P i a n e t a ) , FOREIGN KEY( I d P i a n e t a ) ON DELETE NO ACTION ENGINE =InnoDB ; CREATE TABLE G e r a r c h i a ( REFERENCES P i a n e t a ( I d P i a n e t a ) ON UPDATE CASCADE )
Grado_IdGrado INTEGER UNSIGNED NOT NULL, I d F a z i o n e INTEGER UNSIGNED NOT NULL, PRIMARY KEY( Grado_IdGrado , IdFazione ) , INDEX Fazione_has_Grado_FKIndex1 ( I d F a z i o n e ) , INDEX Fazione_has_Grado_FKIndex2 ( Grado_IdGrado ) , FOREIGN KEY( I d F a z i o n e ) ON DELETE CASCADE ON DELETE CASCADE ENGINE =InnoDB ; CREATE TABLE C l a s s ( FOREIGN KEY( Grado_IdGrado ) REFERENCES F a z i o n e ( I d F a z i o n e ) ON UPDATE CASCADE, REFERENCES Grado ( I d G r a d o ) ON UPDATE CASCADE )
C l a s s INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, M o t o r e I m p l z _ i d M o t o r e I m p l z INTEGER UNSIGNED NOT NULL, MotoreCurv_idMotoreCurv INTEGER UNSIGNED NULL, NameClass VARCHAR( 2 5 ) NULL, I S W a r s h i p BOOL NOT NULL, N o P o n t i INTEGER UNSIGNED NULL, L u n g h e z z a FLOAT( 7 , 3 ) NOT NULL,
10
L a r g h e z z a FLOAT( 7 , 3 ) NOT NULL, A l t e z z a FLOAT( 7 , 3 ) NOT NULL, Massa FLOAT( 4 , 3 ) NOT NULL, D e s c r i z i o n e BLOB NULL, P o t e n z a S c u d i FLOAT( 4 , 2 ) NOT NULL, PRIMARY KEY( C l a s s ) , INDEX Class_FKIndex2 ( MotoreCurv_idMotoreCurv ) , INDEX Class_FKIndex3 ( M o t o r e I m p l z _ i d M o t o r e I m p l z ) , FOREIGN KEY( MotoreCurv_idMotoreCurv ) ON DELETE RESTRICT ON DELETE RESTRICT ENGINE =InnoDB ; CREATE TABLE F l o t t a IdFleet ( FOREIGN KEY( M o t o r e I m p l z _ i d M o t o r e I m p l z ) REFERENCES MotoreCurv ( i d M o t o r e C u r v ) REFERENCES M o t o r e I m p l z ( i d M o t o r e I m p l z ) ON UPDATE RESTRICT , ON UPDATE RESTRICT )
I d F a z i o n e INTEGER UNSIGNED NOT NULL, I d P i a n e t a INTEGER UNSIGNED NOT NULL, Ammiraglio_Name VARCHAR( 2 0 ) NULL, Ammiraglio_Cognome VARCHAR( 2 0 ) NULL, PRIMARY KEY( I d F l e e t ) , INDEX F l o t t a _ F K I n d e x 1 ( I d P i a n e t a ) , INDEX F l o t t a _ F K I n d e x 2 ( I d F a z i o n e ) , FOREIGN KEY( I d P i a n e t a ) ON DELETE RESTRICT FOREIGN KEY( I d F a z i o n e ) ON DELETE CASCADE ENGINE =InnoDB ; CREATE TABLE M a r i n a i o ( REFERENCES P i a n e t a ( I d P i a n e t a ) ON UPDATE CASCADE, REFERENCES F a z i o n e ( I d F a z i o n e ) ON UPDATE CASCADE )
M a t r i c o l a INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, I d P i a n e t a INTEGER UNSIGNED NOT NULL, idSpecie Nome INTEGER UNSIGNED NOT NULL, VARCHAR( 2 0 ) NOT NULL,
Cognome VARCHAR( 2 0 ) NOT NULL, D a t a D i N a s c i t a DATE NULL, DataDiMorte DATE NULL, PRIMARY KEY( M a t r i c o l a ) , INDEX Marinaio_FKIndex1 ( I d P i a n e t a ) , INDEX Marinaio_FKIndex2 ( i d S p e c i e ) , FOREIGN KEY( I d P i a n e t a ) ON DELETE NO ACTION FOREIGN KEY( i d S p e c i e ) ON DELETE RESTRICT ENGINE =InnoDB ; REFERENCES P i a n e t a ( I d P i a n e t a ) ON UPDATE NO ACTION, REFERENCES S p e c i e ( i d S p e c i e ) ON UPDATE CASCADE )
11
M o d V e l i v o l o _ i d M o d V e l i v o l o INTEGER UNSIGNED NOT NULL, Facility_idFacility P i l o t a _ M a t r i c o l a INTEGER UNSIGNED NOT NULL, N i c k VARCHAR( 1 5 ) NULL, T a c c h e INTEGER UNSIGNED NULL, PRIMARY KEY( i d V e l i v o l o ) , INDEX V e l i v o l o _ F K I n d e x 1 ( P i l o t a _ M a t r i c o l a ) , INDEX V e l i v o l o _ F K I n d e x 3 ( M o d V e l i v o l o _ i d M o d V e l i v o l o ) , INDEX V e l i v o l o _ F K I n d e x 4 ( F a c i l i t y _ i d F a c i l i t y ) , FOREIGN KEY( P i l o t a _ M a t r i c o l a ) ON DELETE RESTRICT ON DELETE RESTRICT ON DELETE RESTRICT ENGINE =InnoDB ; CREATE TABLE Nave Codice ( REFERENCES M a r i n a i o ( M a t r i c o l a ) REFERENCES M o d V e l i v o l o ( i d M o d V e l i v o l o ) Facility ( idFacility ) ON UPDATE CASCADE, ON UPDATE CASCADE, REFERENCES ON UPDATE CASCADE )
C l a s s INTEGER UNSIGNED NOT NULL, Facility_idFacility F l o t t a _ I d F l e e t INTEGER UNSIGNED NOT NULL, NomeVaro VARCHAR( 2 0 ) NOT NULL, DataVaro DATE NULL, PRIMARY KEY( C o d i c e ) , INDEX Nave_FKIndex1 ( F l o t t a _ I d F l e e t ) , INDEX Nave_FKIndex2 ( C l a s s ) , INDEX Nave_FKIndex3 ( F a c i l i t y _ i d F a c i l i t y ) , FOREIGN KEY( F l o t t a _ I d F l e e t ) ON DELETE RESTRICT FOREIGN KEY( C l a s s ) ON UPDATE RESTRICT , FOREIGN KEY( F a c i l i t y _ i d F a c i l i t y ) ON DELETE RESTRICT ENGINE =InnoDB ; CREATE TABLE I n c a r i c o IdIncarico ( REFERENCES Facility ( idFacility ) ON UPDATE CASCADE ) REFERENCES F l o t t a ( I d F l e e t ) ON DELETE RESTRICT ON UPDATE CASCADE, REFERENCES C l a s s ( C l a s s )
Nave_Codice INT UNSIGNED NOT NULL, Grado_IdGrado INTEGER UNSIGNED NOT NULL, M a n s i o n e _ i d I n c a r i c o INTEGER UNSIGNED NOT NULL, M a r i n a i o _ M a t r i c o l a INTEGER UNSIGNED NOT NULL, D a t a F i n e I n c a r i c o DATE NULL DEFAULT NULL, D a t a I n i z i o I n c a r i c o DATE NOT NULL,
12
PRIMARY KEY( I d I n c a r i c o ) , INDEX I n c a r i c o _ F K I n d e x 1 ( M a r i n a i o _ M a t r i c o l a ) , INDEX I n c a r i c o _ F K I n d e x 2 ( M a n s i o n e _ i d I n c a r i c o ) , INDEX I n c a r i c o _ F K I n d e x 3 ( Grado_IdGrado ) , FOREIGN KEY( M a r i n a i o _ M a t r i c o l a ) ON DELETE CASCADE ON DELETE RESTRICT ON DELETE RESTRICT FOREIGN KEY( Nave_Codice ) ON DELETE RESTRICT ENGINE =InnoDB ; CREATE TABLE Armamento Facility_idFacility ( FOREIGN KEY( M a n s i o n e _ i d I n c a r i c o ) FOREIGN KEY( Grado_IdGrado ) REFERENCES M a r i n a i o ( M a t r i c o l a ) REFERENCES M a n s i o n e ( i d I n c a r i c o ) ON UPDATE CASCADE, ON UPDATE CASCADE, REFERENCES Grado ( I d G r a d o ) REFERENCES Nave ( C o d i c e ) ON UPDATE CASCADE ) ON UPDATE CASCADE,
idArmamento INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, INTEGER UNSIGNED NULL, ModArmamento_idMod_Armamento INTEGER UNSIGNED NOT NULL, Nave_Codice INT UNSIGNED NOT NULL, M u n i z i o n i R i m a s t e INTEGER UNSIGNED NULL, D a t a U l t i m a M a n u t e n z i o n e DATE NULL, PRIMARY KEY( idArmamento ) , INDEX Armamento_FKIndex1 ( Nave_Codice ) , INDEX Armamento_FKIndex2 ( ModArmamento_idMod_Armamento ) , INDEX Armamento_FKIndex3 ( F a c i l i t y _ i d F a c i l i t y ) , FOREIGN KEY( Nave_Codice ) ON DELETE CASCADE ON DELETE RESTRICT ON DELETE RESTRICT ENGINE =InnoDB ; REFERENCES Nave ( C o d i c e ) ON UPDATE CASCADE, ON UPDATE CASCADE, REFERENCES Facility ( idFacility ) ON UPDATE CASCADE )
Sicurezza
Su questo database sono previsti due tipi di utenti con diversi permessi a seconda delel tabelle su cui hanno i permessi di lettura, inserimento e modica:
Il DB per garantire questi controlli d'accesso fornisce la possibilit di attribuire permessi a diversi utenti a cui viene associata una password. Ecco il comando in questione:
13
GRANT <elenco privilegi> ON <nome tabella> TO <nome utente> IDENTIFIED BY < password utente>
Elenco privilegi: I privilegi sono quelli sopra elencati (lettura, modica, inserimento, cancellazione) che al DB vengono indicati come Select, Update, Insert, Delete.
Nome tabella: Il nome della tabella a cui ci si riferisce, una sola. Non
si pu fare elenco di tutte le tabelle a cui dare determinati permessi
Triggers
each
each
14
each
15
} Incarico_Grado_conistency after
Create t r i g g e r
row begin
i n s e r t on I n c a r i c o
select
flotta
f l o t t a . idFazione
into
@faction
from
join
Incarico
into
Gerarchia
delimiter
Query
(0.01
16
(0.01
(0.01
8.4 Calcolo della classica di navi da battaglia dotate di velivoli ordinata per il numero di velivoli avversari abbattuti
select join where group set NomeVaro , sum ( T a c c h e ) join on Incarico is on as Tacche , c o u n t ( V e l i v o l o . i d V e l i v o l o ) as Velivoli (( Velivolo Nave Pilota_Matricola = Marinaio_Matricola ) Nave_Codice = C o d i c e ) NULL by ( sum ( T a c c h e ) ) desc ; order
from
(0.82
NomeVar
AllianceName ; sec )
(0.02
17
C o d i c e = 12 join on
into on
Incarico Nave
Codice = 1 sec )
(0.00
8.7 Calcolo di tutte le otte con navi incapaci di volo a Curvatura di una Fazione F
select Nave join where set distinct Class on idFleet on from join ( Nave . C l a s s = C l a s s . C l a s s ) and MotoreCurv_idMotoreCurv is null ; Flotta ( IdFleet = Flotta_IdFleet )
i d F a z i o n e = 15 sec )
(0.00
8.8 Calcolo di tutte le classi con almeno una nave costruita su un pianeta P
select Nave join where set on distinct on Class . Class ( idFacility from Class join ( C l a s s . C l a s s = Nave . C l a s s ) = Facility_idFacility ) = 15; Facility
F a c i l i t y . idPianeta sec )
(0.03
8.9 Calcolo di tutte le navi con armamenti non sottoposti a manutenzione da una data D
select where set Nave . NomeVaro , idArmamento join Nave on from Armamento ( C o d i c e = Nave_Codice ) DataUltimaManutenzione < " 3 1 0 0 / 0 2 / 1 9 " ; sec )
(0.06
8.10 Calcololo del numero di marinai di ogni razza per ogni nave
select from join join where group Nave . C o d i c e , NomeVaro , NameRace , c o u n t ( NameRace ) join on Incarico on ( ( on ( C o d i c e = Nave_Codice ) ) Matricola = Marinaio_Matricola is null Nave Marinaio Specie by
Marinaio . i d S p e c i e = Specie . i d S p e c i e )
DataFineIncarico
Nave . C o d i c e , NameRace ;
18
set
(2.71
sec )
8.11 Calcolo del Marinaio che ha svolto la mansione M col grado pi alto un una nave di classe C
select join join join where in ( join join join join where set M a r i n a i o . Nome , M a r i n a i o . Cognome join on on Incarico on ( on ( from ) ) Marinaio Marinaio_Matricola = Matricola Mansione Grado Nave M a n s i o n e _ i d I n c a r i c o = Mansione . i d I n c a r i c o
( i d G r a d o = Grado_idGrado ) ( Nave_Codice = Nave . C o d i c e ) and Nave . C l a s s = 1 0 from Marinaio ) ) and Grado_idGrado max ( Grado_idGrado ) on on ( (
Marinaio_Matricola = Matricola
M a n s i o n e _ i d I n c a r i c o = Mansione . i d I n c a r i c o
Mansione . i d I n c a r i c o = 14 sec )
(0.06
(0.68
(0.76
8.14 Calcolo dei Marinai che Sono di una specie originaria di un pianeta nel sistema "S" o che hanno avuto un incarico in una otta stanziata su un pianeta nel sistema "S"
select distinct join Marinaio . Matricola , on M a r i n a i o . Nome , M a r i n a i o . Cognome from Incarico Marinaio ( Matricola = Marinaio_Matricola )
19
on on on a
( Marinaio . i d S p e c i e = Specie . i d S p e c i e ) ( Specie . idPianeta = Pianeta . idPianeta ) ( flotta_idFleet = Flotta . idFleet ) on ( f l o t t a . idpianeta = a . idpianeta ) or a . s i s t e m a = "L W Q L C G K W U Y N W E O Q K" ;
( Nave_Codice = Nave . C o d i c e )
(2.27
8.15 Calcolo degli incarichi eettuati o su navi varate nel 2000 o da marinai nati nel 2000
Select
Incarico . idIncarico
from I n c a r i c o
join
Marinaio
on ( M a r i n a i o . M a t r i c o l a =
I n c a r i c o . Marinaio_matricola ;
8.16 Calcolo delle navi con parti prodotte in pianeti con alte temperature
Select join join join d i s t i n c t Nave . NomeVaro
Facility
from Nave j o i n
Pianeta Facility Pianeta
on ( Nave . F a c i l i t y _ i d F a c i l i t y = i d F a c i l i t y )
on ( F a c i l i t y . i d P i a n e t a = P i a n e t a . i d P i a n e t a ) as as
Facility2 pianeta2
on ( F a c i l i t y 2 . i d P i a n e t a = P i a n e t a 2 . i d P i a n e t a )
Ottimizzazione Query
on (
C o d i c e = Nave_Codice ) )
on (
Matricola = Marinaio_Matricola is
on (
Marinaio . i d S p e c i e = Specie . i d S p e c i e )
where D a t a F i n e I n c a r i c o
null
20
c o u n t ( NameRace )
from
> Nave j o i n I n c a r i c o on ( C o d i c e = Nave_Codice ) > j o i n M a r i n a i o on ( M a t r i c o l a = M a r i n a i o _ M a t r i c o l a ) > j o i n S p e c i e on ( M a r i n a i o . i d S p e c i e = S p e c i e . i d S p e c i e ) > w h e r e D a t a F i n e I n c a r i c o i s n u l l > g r o u p by Nave . C o d i c e , NameRace \G 1 . row
id : 1 select_type : Specie ALL NULL NULL Using possible_keys : key_len : rows : temporary ; PRIMARY NULL 5063 Using 2. filesort row SIMPLE table : type : key : ref :
Extra : id : 1
select_type : table : type : key : ref : rows : Extra : id : 1 SIMPLE Incarico ref 4 possible_keys : ref 4 SIMPLE
key_len :
I n c a r i c o _ F K I n d e x 1 , Nave_Codice
key_len :
select_type : Nave eq_ref PRIMARY 4 possible_keys : SIMPLE table : type : key : ref : rows : Extra : rows in
PRIMARY
key_len : 1 4
s h i p . I n c a r i c o . Nave_Codice
set
(0.00
sec )
Essendo Il DBMS scelto MySql, l'unico algoritmo disponibile per eettuare i Join il Nested Loop Join. Questo algoritmo molto sensibile alla scelta
21
dell'ordine di Join delle tabelle scelto, in quanto presta migliri performances se la Driving Table quella pi restrittiva, ovvero quella con meno tuple. Dal comando Explain quindi si vede che L'ordine di Join scelto
Specie
(104 )
che l'ordine in cui vengano Joinate non faccia molta divverenza. quindi risulterebbe pi conveniente come ordine di Join
M arinaio Specie.
Si vede subito infatti che eseguendo mysql> select /! straight_join
c o u n t ( NameRace )
from
> Nave j o i n I n c a r i c o on ( C o d i c e = Nave_Codice ) > j o i n M a r i n a i o on ( M a t r i c o l a = M a r i n a i o _ M a t r i c o l a ) > j o i n S p e c i e on ( M a r i n a i o . i d S p e c i e = S p e c i e . i d S p e c i e ) > w h e r e D a t a F i n e I n c a r i c o i s n u l l > g r o u p by Nave . C o d i c e , NameRace l i m i t 1 0 ; + ++++
| | | | | | | | | | | 10 Codice 4001 4001 4001 4001 4001 4001 4001 4001 4001 4001 rows | | | | | | | | | | | in NomeVaro K K K K K K K K K K set (1.66 | | | AESXCW | B | B X W M A Y P Z C D | CQUTXYD | DJBYI | D G O W D B | EHNKVPKHVBS | G sec ) NameRace | | | | | | | | | | c o u n t ( NameRace ) 1 1 1 1 1 1 1 1 1 1 | | | | | | | | | | | + ++++
| ELYYEFXQCFXSLKNNW |
+ ++++
il tempo di esecuzione scenda. un Explain sulla nuova query mysql> e x p l a i n c o u n t ( NameRace ) select from /! straight_join
> Nave j o i n I n c a r i c o on ( C o d i c e = Nave_Codice ) > j o i n M a r i n a i o on ( M a t r i c o l a = M a r i n a i o _ M a t r i c o l a ) > j o i n S p e c i e on ( M a r i n a i o . i d S p e c i e = S p e c i e . i d S p e c i e ) > w h e r e D a t a F i n e I n c a r i c o i s n u l l > g r o u p by Nave . C o d i c e , NameRace l i m i t 1 \G 1 . row
id : 1 select_type : Nave SIMPLE table :
22
ALL NULL
possible_keys :
PRIMARY
key_len :
NULL
table : Incarico
possible_keys : I n c a r i c o _ F K I n d e x 1 , Nave_Codice key : ref : rows : Extra : id : key : ref : rows : Extra : 1 Nave_Codice 4 s h i p . Nave . C o d i c e 31 Using where 3. row key_len :
table : Marinaio
PRIMARY, Marinaio_FKIndex2
key_len : 1
ship . I n c a r i c o . Marinaio_Matricola
id : 1 select_type : Specie eq_ref PRIMARY 4 ship . Marinaio . i d S p e c i e 1 4 rows in set (0.00 possible_keys : SIMPLE table : type : key : ref : rows : Extra :
4.
row
PRIMARY
key_len :
sec )
Marinaio_Matricola = Matricola
) )
M a n s i o n e _ i d I n c a r i c o = Mansione . i d I n c a r i c o
( select
Marinaio_Matricola = Matricola
M a n s i o n e _ i d I n c a r i c o = Mansione . i d I n c a r i c o
23
Grado Nave
on on
Mansione . i d I n c a r i c o = 14
Si pu notare che anche se il tempo di esecuzione modesto la query presenta una query annidata. Siccome consigliabile evitare le query annidate si pu provare a riformulare una query equivalente che eviti l'annidamento. select join join join where select join join join where max ( Grado_idGrado ) join on on Incarico on ( on from ( Marinaio_Matricola = Matricola ) )
Marinaio
M a n s i o n e _ i d I n c a r i c o = Mansione . i d I n c a r i c o
Mansione . i d I n c a r i c o = 14
Marinaio
Marinaio_Matricola = Matricola
M a n s i o n e _ i d I n c a r i c o = Mansione . i d I n c a r i c o
Mansione . i d I n c a r i c o = 14
Usando la variabile @Max per memorizzare il risultato della subquery si riesce a spezzare la query in due query con meno complessit temporale mysql> select max ( Grado_idGrado ) Incarico on ( on ( from ) )
join on
Mansione Grado 1
( Nave_Codice = Nave . C o d i
Mansione . i d I n c a r i c o = 14 row
Query OK,
mysql> mysql>
select
M a r i n a i o . Nome , M a r i n a i o . Cognome
from
> M a r i n a i o j o i n I n c a r i c o on ( M a r i n a i o _ M a t r i c o l a = M a t r i c o l a ) > j o i n M a n s i o n e on ( M a n s i o n e _ i d I n c a r i c o = M a n s i o n e . i d I n c a r i c o ) > j o i n Grado on ( i d G r a d o = Grado_idGrado ) j o i n Nave on ( Nave_Codice = Nave . C o d i > w h e r e M a n s i o n e . i d I n c a r i c o = 1 4 and Nave . C l a s s = 10 and Grado_idGrado = @max ; + ++
| Nome | Cognome | + ++ | YMVCFGDOLANSQKCXDZJ | B H K O E G F F G A Q M A B G V V F | + ++ 1 row in set (0.00 sec )
come si pu vedere l tempo complessivo sceso ad un tempo arrotondato a 0.00 sec. Nel caso peggiore il tempo di esecuzione 0.005 sec, e quindi la query sar scesa a un tempo di esecuzione all'incirca del 10% rispetto a prima
Marinaio_Matricola )
as
N_Marinai
from
Incarico
la Query non presenta delle subquery annidate, quindi si procede ad analizzare l'execution plan con il comando explain
id : 1 SIMPLE possible_keys : Nave index PRIMARY 4 NULL 4064 Using temporary ; select_type : table : type : key : ref : rows : Extra : id : 1 SIMPLE Incarico ref 4 possible_keys :
1.
row
PRIMARY, C o d i c e , P i p p o I n d e x
key_len :
Using 2.
filesort row
Nave_Codice
key_len :
Come discusso precedentemente l'ordine di Join molto importante. L'ordine di grandezza di Nave
Quindi si Nota
facilmente che ancora una volta l'ordine di Join scelto il peggiore. select /! straight_join Nave on
Marinaio_Matricola ) is
N_Marinai by
mysql> s e l e c t / ! s t r a i g h t _ j o i n / >NomeVaro , C o d i c e , c o u n t ( d i s t i n c t M a r i n a i o _ M a t r i c o l a ) a s N_Marinai > I n c a r i c o j o i n Nave on ( I n c a r i c o . Nave_Codice = Nave . C o d i c e ) > w h e r e I n c a r i c o . D a t a F i n e I n c a r i c o i s NULL g r o u p by Nave . C o d i c e >o r d e r by c o u n t ( d i s t i n c t M a r i n a i o _ M a t r i c o l a ) d e s c l i m i t 1 0 ; + +++ | NomeVaro | | Codice 4850 | | N_Marinai 45 | | + +++ | F X AX C W V Y P G J W N F Q Y
from
25
CJSGKBEDOJ
| | | | | | | | sec ) /!
| | | | | | | | |
43 43 43 42 42 42 42 42 42
| | | | | | | | |
| AXILAOODRPQMXPIBOBWE |
+ +++ 10
select Nave on
straight_join
/
as N_Marinai 0.48 \G from
Nave . C o d i c e
select_type : table : type : key : ref : rows : Extra : id : 1 SIMPLE possible_keys : Nave eq_ref PRIMARY 4 ALL NULL NULL NULL 175429 Using where ; Using SIMPLE
key_len :
temporary ; 2. row
Using
filesort
select_type : table : type : key : ref : rows : Extra : 2 rows in set (0.00 sec )
PRIMARY, C o d i c e
key_len : 1
s h i p . I n c a r i c o . Nave_Codice
Si pu notare che il tempo di esecuzione diminuito e che la tabella che viene scelta come driving-table Nave.
26
on on a
( Specie . idPianeta = Pianeta . idPianeta ) ( flotta_idFleet = Flotta . idFleet ) on ( f l o t t a . idpianeta = a . idpianeta ) or a . s i s t e m a = "L W Q L C G K W U Y N W E O Q K" ; M a r i n a i o . Nome ,
( Nave_Codice = Nave . C o d i c e )
mysql> e x p l a i n
Marinaio . Matricola ,
M a r i n a i o . Cognom
> I n c a r i c o j o i n M a r i n a i o on ( M a t r i c o l a = M a r i n a i o _ M a t r i c o l a ) > j o i n s p e c i e on ( M a r i n a i o . i d S p e c i e = S p e c i e . i d S p e c i e ) > j o i n P i a n e t a on ( S p e c i e . i d P i a n e t a = P i a n e t a . i d P i a n e t a ) > j o i n Nave on ( Nave_Codice = Nave . C o d i c e ) > j o i n F l o t t a on ( f l o t t a _ i d F l e e t = F l o t t a . i d F l e e t ) > j o i n P i a n e t a a on ( f l o t t a . i d p i a n e t a = a . i d p i a n e t a ) > w h e r e p i a n e t a . s i s t e m a = "LUWYQNLWCEGOKQWK" > o r a . s i s t e m a = "LUWYQNLWCEGOKQWK" \G 1 . row
id : 1 select_type : Pianeta ALL NULL NULL NULL 954 Using temporary 2. row possible_keys : PRIMARY SIMPLE table : type : key : ref : rows : Extra : id : 1 SIMPLE PRIMARY, S p e c i e _ F K I n d e x 1 specie ref 4 possible_keys :
key_len :
select_type : table : type : key : ref : rows : Extra : id : 1 SIMPLE Marinaio ref 4 possible_keys :
key_len :
PRIMARY, Marinaio_FKIndex2
key_len :
id : 1
27
SIMPLE I n c a r i c o _ F K I n d e x 1 , Nave_Codice
Incarico possible_keys :
key_len :
select_type : table : type : key : ref : rows : Extra : id : 1 SIMPLE possible_keys : Flotta eq_ref PRIMARY 4 Nave eq_ref PRIMARY 4 possible_keys : SIMPLE
s h i p . I n c a r i c o . Nave_Codice
select_type : table : type : key : ref : rows : Extra : id : 1 SIMPLE possible_keys : a eq_ref PRIMARY 4 ship . Flotta . IdPianeta 1 Using in set where ; (0.00 sec )
PRIMARY, F l o t t a _ F K I n d e x 1
key_len : 1
PRIMARY
key_len :
Distinct
solo indice per query, e se non possibile futilizzare un indice per tutte le condizioni del where allora eettua per una full-table scan, quindi nel caso di OR nella clausola where spesso conveniente riscrivere la query usando invece
28
una UNION di due query diverse select join join where union select join join join where distinct join on on a Marinaio . Matricola , on M a r i n a i o . Nome , M a r i n a i o . Cognome from Incarico Nave Marinaio ( Matricola = Marinaio_Matricola ) distinct join on on b . Matricola , b on b . Nome , b . Cognome from
Incarico
Marinaio
(b . Matricola = Marinaio_Matricola )
specie Pianeta
p i a n e t a . s i s t e m a = "L W Q L C G K W U Y N W E O Q K"
Flotta Pianeta
mysql>
> I n c a r i c o j o i n M a r i n a i o b on ( b . M a t r i c o l a = M a r i n a i o _ M a t r i c o l a ) > j o i n s p e c i e on ( b . i d S p e c i e = S p e c i e . i d S p e c i e ) > j o i n P i a n e t a on ( S p e c i e . i d P i a n e t a = P i a n e t a . i d P i a n e t a ) > w h e r e p i a n e t a . s i s t e m a = "LUWYQNLWCEGOKQWK" > u n i o n > s e l e c t d i s t i n c t M a r i n a i o . M a t r i c o l a , M a r i n a i o . Nome , M a r i n a i o . Cognome > I n c a r i c o j o i n M a r i n a i o on ( M a t r i c o l a = M a r i n a i o _ M a t r i c o l a ) > j o i n Nave on ( Nave_Codice = Nave . C o d i c e ) > j o i n F l o t t a on ( f l o t t a _ i d F l e e t = F l o t t a . i d F l e e t ) > j o i n P i a n e t a a on ( f l o t t a . i d p i a n e t a = a . i d p i a n e t a ) > w h e r e a . s i s t e m a = "L W Q L C G K W U Y N W E O Q K" ; + +++
| | + +++ | | | | | [ . . . ] | | | | | | + +++ 80 rows in set (0.05 sec ) 227277 | SLRFDOBN | NJDLNRDMXCEKNAV 226273 | SDDCDPPV | EKPLIWUNPUGPQDLUJ 222439 | ER | IMEDUFDKEZCWXA 33983 | IHIXPVQABHOEMHH | MOVUXHYLSMSPYVAZ 28714 30770 | WTIQTAXJX | VEXDTFTLWTLRHKYGP | XANUVCZTOYHGJRJGDLVN | | NJCXC Matricola | Nome | Cognome
29
mysql> e x p l a i n
select
distinct
b . Matricola ,
b . Nome ,
b . Cognome
from
> I n c a r i c o j o i n M a r i n a i o b on ( b . M a t r i c o l a = M a r i n a i o _ M a t r i c o l a ) > j o i n s p e c i e on ( b . i d S p e c i e = S p e c i e . i d S p e c i e ) > j o i n P i a n e t a on ( S p e c i e . i d P i a n e t a = P i a n e t a . i d P i a n e t a ) > w h e r e p i a n e t a . s i s t e m a = "LUWYQNLWCEGOKQWK" > u n i o n > s e l e c t d i s t i n c t M a r i n a i o . M a t r i c o l a , M a r i n a i o . Nome , M a r i n a i o . Cognome > I n c a r i c o j o i n M a r i n a i o on ( M a t r i c o l a = M a r i n a i o _ M a t r i c o l a ) > j o i n Nave on ( Nave_Codice = Nave . C o d i c e ) > j o i n F l o t t a on ( f l o t t a _ i d F l e e t = F l o t t a . i d F l e e t ) > j o i n P i a n e t a a on ( f l o t t a . i d p i a n e t a = a . i d p i a n e t a ) > w h e r e a . s i s t e m a = "L W Q L C G K W U Y N W E O Q K" \G 1 . row
id : 1 PRIMARY PRIMARY Pianeta ALL NULL NULL NULL 954 Using where ; Using temporary 2. row possible_keys : select_type : table : type : key : ref : rows : Extra : id : 1 PRIMARY PRIMARY, S p e c i e _ F K I n d e x 1 specie ref 4 Extra : Using index 3. row possible_keys :
key_len :
key_len :
select_type : table : type : key : ref : rows : Extra : id : 1 PRIMARY Incarico ref possible_keys :
PRIMARY, Marinaio_FKIndex2
key_len :
4.
row
Incarico_FKIndex1
Incarico_FKIndex1
30
select_type : table : type : key : ref : rows : Extra : id : 2 UNION possible_keys : a eq_ref PRIMARY 4 ship . Flotta . IdPianeta 1 Using where Flotta index 4 possible_keys : UNION
PRIMARY, F l o t t a _ F K I n d e x 1
key_len :
select_type : table : type : key : ref : rows : Extra : id : 2 UNION Nave ref 4 possible_keys :
PRIMARY
key_len :
select_type : table : type : key : ref : rows : Extra : id : 2 UNION Incarico ref 4 possible_keys :
7.
row
PRIMARY, Nave_FKIndex1 , C o d i c e , P i p p o I n d e x
key_len :
I n c a r i c o _ F K I n d e x 1 , Nave_Codice
key_len :
id : 2
31
Marinaio
key_len : 1
ship . I n c a r i c o . Marinaio_Matricola
id : NULL UNION RESULT select_type : type : key : ref : rows : Extra : 10 rows in set (0.00 sec ) ALL NULL NULL NULL NULL
10.
row
key_len :
Incarico Nave
I n c a r i c o . Marinaio_matricola
y e a r ( Nave . d a t a V a r o ) = 2 0 0 0 sec )
(1.21
come discusso prima per l'ottimizzazione di 8.14 l'or nella clausola where rallenta il tempo di esecuzione della query. La tecnica di ottimizzazione sar la stessa. mysql> S e l e c t Incarico . idIncarico
> f r o m I n c a r i c o j o i n M a r i n a i o on ( M a r i n a i o . M a t r i c o l a = I n c a r i c o > w h e r e y e a r ( m a r i n a i o . d a t a d i n a s c i t a ) = 2 0 0 0 > u n i o n > S e l e c t I n c a r i c o . i d I n c a r i c o > f r o m I n c a r i c o j o i n Nave on Nave . c o d i c e = I n c a r i c o . Nave_Codice > w h e r e y e a r ( Nave . d a t a V a r o ) = 2 0 0 0 ; + +
| | | idIncarico 300015 261263 | | | + +
. Marinaio_matri
32
| | | | 2254
+ +
Armamento
p i a n e t a . A v r g t e m p e r a t u r a > 50
come visto nelle ottimizzazioni di 8.15 e 8.14 il problema in questa query l'or nella clausola where. Come negli altri casi l'ottimizzazione
d i s t i n c t Nave . NomeVaro as as
Facility2 pianeta2
on ( Armamento . F a c i l i t y _ i d F a c i l i t y = f a c i l i t y 2 . i d F a c i l
on ( F a c i l i t y 2 . i d P i a n e t a = P i a n e t a 2 . i d P i a n e t a )
from Nave j o i n
Pianeta
on ( Nave . F a c i l i t y _ i d F a c i l i t y = i d F a c i l i t y )
on ( F a c i l i t y . i d P i a n e t a = P i a n e t a . i d P i a n e t a )
where p i a n e t a . A v r g t e m p e r a t u r a < 5 0 ;
mysql> e x p l a i n
Select
d i s t i n c t Nave . NomeVaro
> from Nave j o i n Armamento on ( Armamento . N a v e _ c o d i c e = n a v e . C o d i c e ) > j o i n F a c i l i t y as F a c i l i t y 2 on ( Armamento . F a c i l i t y _ i d F a c i l i t y = f a c i l i t y 2 > j o i n P i a n e t a as p i a n e t a 2 on ( F a c i l i t y 2 . i d P i a n e t a = P i a n e t a 2 . i d P i a n e t a ) > where p i a n e t a 2 . a v r g t e m p e r a t u r a < 5 0 > union d i s t i n c t > S e l e c t d i s t i n c t Nave . NomeVaro > from Nave j o i n F a c i l i t y on ( Nave . F a c i l i t y _ i d F a c i l i t y = i d F a c i l i t y ) > j o i n P i a n e t a on ( F a c i l i t y . i d P i a n e t a = P i a n e t a . i d P i a n e t a ) > where p i a n e t a . A v r g t e m p e r a t u r a < 5 0 \G 1 . row
id : 1 select_type : P I A Y RM R
. idFa
33
table :
type :
Facility2
index
4
p o s s i b l e _ k e y s : P I A Y Facility_FKIndex1 RM R ,
key :
Facility_FKIndex1
key_len :
ref : N UL L
rows :
Extra : id : 1
2104
Using index ;
Using temporary
2. row
select_type : P I A Y RM R
table :
type :
key : P I A Y RM R
key_len : ref : ship . F a c i l i t y 2 . IdPianeta 1
rows :
Extra : id : 1
Using where
3. row
select_type : P I A Y RM R
table :
type :
key :
ref :
key_len :
rows :
Extra : id : 1
Using where
4. row
select_type : P I A Y RM R
table :
type :
key : P I A Y RM R
key_len : ref : s h i p . Armamento . Nave_Codice 1 5. row
rows :
Extra :
id : 2 Facility select_type : U I N NO
table :
type :
index
4
p o s s i b l e _ k e y s : P I A Y Facility_FKIndex1 RM R ,
key :
Facility_FKIndex1
key_len :
r e f : NU L L
rows :
2104
34
Extra : id : 2
Using index ;
Using temporary
6. row
select_type : U I N NO
table :
type :
key : P I A Y RM R
key_len : ref : ship . F a c i l i t y . IdPianeta 1
rows :
Extra : id : 2
Using where
7. row
select_type : U I N NO
table :
type :
key :
ref :
key_len :
rows :
Extra :
id : N UL L s e l e c t _ t y p e : U I N RESULT NO
t a b l e : <u n i o n 1 ,2 >
t y p e : ALL p o s s i b l e _ k e y s : N UL L
key : NU L L
key_len : N UL L r e f : NU L L
rows : N L UL
Extra : 8
rows i n
set
(0.00
sec )
35
10
Stored Procedure
Questa Stored Procedure Prende come parametro di input la matricola di un marinaio, e lo promuove automaticamente di un grado nella scala gerarchica cercando automaticamente se c' un grado superiore al grado attualmente ricoperto dal marinaio. Se il grado non dovesse esistere lo crea e glielo assegna. delimiter begin } Promote ( in Mtr
Create p r o c e d u r e
int )
s e l e c t max ( HScalaComando )
Incarico
i n t o @Max from
is
join
grado
on ( i n c a r i c o . Grado_idGrado = g r a d o . i d G r a d o ) null ;
i n t o @ F a z i o n e from on ( i n c a r i c o . Grado_idGrado = g r a d o . i d G r a d o )
Incarico
join
grado
gerarchia
join
grado
on ( g e r a r c h i a . Grado_idGrado = g r a d o . i d g r a d o )
then select
Grado_idGrado Gerarchia
join
grado
null ;
join
grado
on ( g e r a r c h i a . Grado_idGrado = g r a d o . i d g r a d o )
, Nomegrado ) maggiore " ) ) ; @fazione ) ; is
where HScalaComando = @Max and i d F a z i o n e = @ F a z i o n e ; insert values select insert update E D IF ; N end ;
} delimiter ;
i n t o Grado ( HscalaComando
(@max+1 , idGrado c o n c a t ( @nome , "
into
Gerarchia
incarico
s e t g r a d o _ i d G r a d o = @grado null ;
36
Questa Stored Procedure prende come parametro di input l'id di un pianeta e Modica il Database In occasione di un evento catastroco sul pianeta dato in input, settando il pianeta come distrutto, le specie abitanti sul pianeta come vicine all'estinzione e distruggendo le otte di stanza sul pianeta stesso. delimiter } DoomDay ( In iD
create
begin
procedure
int )
update P i a n e t a set
isnotdestroyed = false
where P i a n e t a . i d P i a n e t a = iD ;
= true where S p e c i e . i d P i a n e t a = iD ;
set
isnearextinction
flotta
where F l o t t a . i d P i a n e t a = iD ;
Questa Stored Procedure semplicemente una re-implementazione della query 8.11 come Procedure in modo da poter essere pi facilmente usata in maniera parametrica. Prende come parametri di input l'id di una mansione e l'id di un incarico e stampa a video il risultato della query delimiter begin } Find ( in ClassiD
Create p r o c e d u r e
int ,
in
IncaricId
int )
join
Incarico
on (
Marinaio_Matricola = Matricola
) )
join
Mansione
on (
M a n s i o n e _ i d I n c a r i c o = Mansione . i d I n c a r i c o
join
Incarico
on (
Marinaio_Matricola = Matricola
) )
Mansione
on (
M a n s i o n e _ i d I n c a r i c o = Mansione . i d I n c a r i c o
11
Views
Crea una view che restituisce tutte le navi varate nell'anno corrente
as S e l e c t
Codice ,
NomeVaro ,
DataVaro ,
Class . Class
on ( Nave . C l a s s = C l a s s . C l a s s )
37
Crea una view che restituisce tutti i marinai che hanno pi di 50 anni
M a r i n a i o . Cognome ;
/365 > 50
Crea una view che restituisce tutte le Classi a disposizione della otta F
C l a s s . NameClass
as C l a s s ,
count ( )
as No
Crea una view che restituisce i pianeti che hanno dato vita ad una specie
from S p e c i e
join
Pianeta
on ( S p e c i e . i d P i a n e t a = P i a n e t a . i d P i a n e t a )
group by P i a n e t a . i d P i a n e t a ;
Crea una view che restituisce tutte le navi varate questo anno di una classe a disposizione della otta F
join
Navi_attuali
from C l a s s i _ d i
on ( C l a s s e = C l a s s ) ;
12
Transazioni
Una transazione una serie di azioni che vengono compiute assieme contemporaneamente. Il meccanismo delle transazioni permette di assicurare il rispetto delle propriet ACID (Atomiicity, Consistency, Isolation, Durability) quando si eettuano dei commit nel Database. Le propriet da rispettare sono appunto
Atomicit:
quita in parte, quindi se per qualche motivo la transazione non v a buon ne bisogna eettuare un rollback no all'inizio della transazione stessa ripristinando i i dati nel database ad una situazione precedente all'avvio della transazione
Consistenza: Una transazione rispetta i vincoli di integrit Isolazione: Una transazione indipendente dalle altre, se pi transazioni vengono eettuate in parallelo l'eetto risultante deve essere identico ad una esecuzione sequenziale
38
Durabilit: Gli eetti di una transazione portata a buon ne sono persistenti nel tempo
Questo un esempio di transazione che simula l'abbattimento di un velivolo B1 da un velivolo A1 Start update delete Commit ; In Questo altro esempio si vede una transazione che accorpa la otta A1 nella otta B1, e poi distrugge la otta A1 oramai vuota Start update delete Commit ; Transaction ; Nave from set F l o t t a _ i d F l e e t = @B1 w h e r e where i d F l e e t = @A1 ; F l o t t a _ i d F l e e t = @A1 ; Flotta Transaction ; Velivolo from Set T a c c h e = T a c c h e +1 w h e r e where i d V e l i v o l o = @B1 ; idvelivolo = @A1 ; Velivolo
39