Sei sulla pagina 1di 39

Catalogazione di Astronavi in una ambientazione Sci-

Valerio Martella July 11, 2011

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

Diagramma E-R Logico Progettazione Fisica


4.1 4.2 4.3 4.4 Eliminazione delle generalizzazioni Eliminaazione delle relazioni 1-n Scheda della Base di Dati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

5 5
5 5 7 7

Diagramma E-R Fisico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

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

Consistenza logica Tra Flotta e Incarico

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 . . . . . . . . .

8.5 8.6 8.7 8.8 8.9

Calcolo del numero di navi e di otte di ogni fazione

. . . . . . .

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

10 Stored Procedure 11 Views 12 Transazioni

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

Analisi dei requisiti

2.1 Analisi informale dei requisiti


Si vuole realizzare una basi dati in grado di gestire un numero arbitrario di astronavi da guerra o esploratrici, tenendo conto del loro eventuale raggruppamento in otte che a loro volta sono raggruppate in fazioni. Una nave ha un codice, un nome di varo e un modello o classe, che rappresenta le speciche tecniche comuni a navi costruite allo stesso modo inoltre una otta d'appartenenza e un cantiere di varo. Una classe di nave ha una lunghezza, una larghezza e un'altezza espressi in decine di metri, una massa espressa in tonnellate, un motore a impulso, pu avere un motore di curvatura, degli scudi che hanno una certa resistenza e pu essere o meno da guerra. potenza espressa in newton e un carburante. Un motore ha un modello, una massa, un volume, un fabbisogno energetico. Un motore a impulso ha una Un motore a curvatura non essendo un normale motore ha soltanto un fattore di curvatura spaziale espresso in un numero puro compreso tra 1 e 10 e il tipo di tecnologia usata. Una nave da guerra ha diversi armamenti ,un numero di ponti di lancio usati per lanciare dei  caccia da attacco a corto raggio detti Velivoli. Ogni armamento ha un Id identicativo, un numero di munizioni, una data di ultima manutenzione e un modello. Un velivolo ha un codice,eventualmente pu avere un nick, e un modello,inoltre ha un numero di velivoli abbattuti, o tacche. Sia armamenti che velivoli sono costruiti in fabbriche , ognuna delle quali ha una locazione geograca su un pianeta ed appartiene ad una Casa di Produzione ed sono di un modello,un modello di velivolo ha una potenza massima, un modello di armamento ha una gittata massima e una cadenza di tiro, inoltre pu essere basato su un innumerevole numero di tecnologie e principi, quindi opportuno inserire una breve descrizione. Su ogni nave c' un equipaggio formato da marinai. Ogni marinaio appartiene a una specie, ha un nome e un cognome (o equivalenti a seconda delle tradizioni della razza ed etnia cui appartiene, indicati quindi come nome personale e nome di famiglia), una data di nascita, eventualmente una data di morte e uno storico degli incarichi, in cui ogni incarico ha una data di inizio incarico, eventualmente una data di ne incarico,un grado e una mansione. Un grado ha un nome e un certo valore nella scala gerarchica delle fazioni cui appartiene. Una mansione ha un nome e un ponte su cui viene svolta. Una specie ha un nome, un pianeta d'origine, un tipo di atmosfera respirabile pi innumerevoli altre caratteristiche univoche e dicilmente prevedibili in fase di progettazione. Ogni otta appartiene ad un Impero,uno stato o una generica

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.

2.2 Operazioni sui dati


si possono prevedere sul Database le seguenti richieste: 1. Calcolo dei pianeti dove non presente una fabbrica 2. Calcolo dei marinai in attivit sulla nave N 3. Calcolo delle astronavi capaci di volo a curvatura maggiore di 5 4. Calcolo della classica di navi da battaglia dotate di velivoli ordinata per il numero di velivoli avversari abbattuti 5. Calcolo del numero di navi e di otte di ogni fazione 6. Calcolo dell uciale di grado maggiore a bordo della Nave N 7. Calcolo di tutte le otte con navi incapaci di volo a Curvatura di una Fazione F 8. Calcolo di tutte le classi con almeno una nave costruita su un pianeta P 9. Calcolo di tutte le navi con armamenti non sottoposti a manutenzione da una data D 10. Calcololo del numero di marinai di ogni razza per ogni nave 11. Calcolo del Marinaio che ha svolto la mansione M col grado pi alto un una nave di classe C 12. Calcolo dei Velivoli pilotati da Piloti di Grado G 13. Calcolo del numero di marinai attivi su ogni nave 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" 15. Calcololo del numero di marinai di ogni razza per ogni nave

2.3 Buisness Rules


1. La data di nascita di un marinaio deve essere precedente alla sua data di morte se presente 2. La data di inizio di un Incarico deve essere precedente alla sua data di ne se precedente 3. Tutte le navi con almeno 5 ponti sono da considerarsi navi da guerra

Diagramma E-R Logico

Progettazione Fisica

4.1 Eliminazione delle generalizzazioni


Sono presenti due generalizzazioni:

Motore = Motore Impulso,Motore Curvatura Nave = Nave da guerra,Nave esploratrice

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.

4.2 Eliminaazione delle relazioni 1-n


Le relazioni 1-n presenti sono:

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.

4.3 Diagramma E-R Fisico

4.4 Scheda della Base di Dati


1. ModVelivolo (idModVelivolo, Max_Engine_Output) 2. ModArmamento (idMod_Armamento, FireRate, Descrizione. Gittata) 3. Mansione (idIncarico, Name, Ponte) 4. Pianeta (idPianeta, Nome, Sistema, Pos_x, Pos_y, Pos_z, AvrgTemperatura, Apogeo, Perigeo, isNotDestroyed) 5. MotoreImplz (idMotoreImplz, Output, EnergyReq, Massa, Carburante) 6. MotoreCurv (idMotoreCurv, Curvatura, EnergyReq, Massa, TecnologiaCurvatura) 7. Grado (IdGrado,HscalaComando, NomeGrado) 8. Fazione (idFazione, AllianceName, idPianeta) 9. Facility (idFacility, idPianeta, Residenza, CasaDIProd) 10. Specie (idSpecie, idPianeta, NameRace, AtmosferaReq, Note)

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

5.1 Script di creazione


CREATE TABLE M o d V e l i v o l o ( NULL, i d M o d V e l i v o l o INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, Max_Engine_Output FLOAT( 6 , 2 ) PRIMARY KEY( i d M o d V e l i v o l o ) ENGINE =InnoDB ; CREATE TABLE ModArmamento ( )

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 )

INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, )

Name VARCHAR( 2 0 ) NOT NULL, PRIMARY KEY( i d I n c a r i c o ) ENGINE =InnoDB ;

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 )

ENGINE =InnoDB ; CREATE TABLE idFacility Facility (

INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,

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 )

INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,

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 )

INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,

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

CREATE TABLE V e l i v o l o idVelivolo

INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, INTEGER UNSIGNED NOT NULL,

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 )

FOREIGN KEY( M o d V e l i v o l o _ i d M o d V e l i v o l o ) FOREIGN KEY( F a c i l i t y _ i d F a c i l i t y )

INT UNSIGNED NOT NULL AUTO_INCREMENT, INTEGER UNSIGNED NOT NULL,

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 )

INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,

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 )

FOREIGN KEY( ModArmamento_idMod_Armamento ) FOREIGN KEY( F a c i l i t y _ i d F a c i l i t y )

REFERENCES ModArmamento ( idMod_Arma

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:

Amministratore: colui che gestisce l'intero DataBase e pertanto


l'unico a possedere i permessi di inserimento,modica e cancellazione su tutte le tabelle. Possiede inoltre anche i permessi di Lettura

Lettore: un visitatore del DataBase. Ha solo permessi di lettura su


tutte le tabelle e le view

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

Nome utente: Il nome dell'utente a cui si stanno dando i privilegi in


riferimento ad una data tabella (nel nostro caso Admin, Moderator)

Password utente: La password con cui l'utente si pu identicare al DB


per poter identicarsi come Admin o Moderator a seconda dei casi.

Triggers

7.1 Buisness rule 2


delimiter Create before for if begin new . D a t a I n i z i o I n c a r i c o > new . D a t a F i n e I n c a r i c o then SET N W. D a t a F i n e I n c a r i c o = new . D a t a I n i z i o I n c a r i c o ; E end end ; } delimiter ; if ; } Incarico_Data_consistency on Incarico trigger insert row

each

7.2 Buisness rule 1


delimiter Create before for if begin new . D a t a D i N a s c i t a > new . DataDiMorte then SET N W. DataDiMorte = NULL ; E end end ; } delimiter ; if ; } Marinaio_Date_consistency on Marinaio trigger insert row

each

14

7.3 Buisness rule 3


delimiter Create before for if begin new . I s W a r S h i p = F a l s e and new . N o P o n t i > 5 then SET new . I s W a r S h i p = True ; end end ; } delimiter ; if ; } Class_noPonti_Consistency on Class trigger insert row

each

7.4 Consistenza logica Tra Flotta e Incarico


In questo Database si f l'assunzione che alle navi di una data fazione possano essere assegnati solo marinai che hanno un Grado che appartiene alla scala gerarchica della fazione stessa. Per determinare l'associazione di un Marinaio ad una Fazione si fa fede a quanto inserito nella tabella Gerarchia, passando per la tabella Incarico, in quanto eettivamente nel corso del suo storico un Marinaio pu militare in pi fazioni. Per assicurare che questa assunzione si verichi sempre si scelto di correggere la tabella Gerarchia aggiungendo alla fazione l'eventuale grado del marinaio a cui si sta assegnando un Incarico sulla Nave nel qual caso non dovesse essere prensente il grado stesso nella gerarchia della fazione cui la nave fa parte.

15

delimiter for each

} 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

j o i n Nave on ( f l o t t a . i d F l e e t = n a v e . f l o t t a _ i d F l e e t ) on ( I n c a r i c o . N a v e _ c o d i c e = Nave . C o d i c e ) i n t o @count from G e r a r c h i a

join

Incarico

where new . i d I n c a r i c o = i d I n c a r i c o ; s e l e c t count ( )


if @count = 0

where G e r a r c h i a . Grado_idGrado = new . Grado_idGrado and G e r a r c h i a . i d F a z i o n e = @ f a c then values


( new . g r a d o _ i d G r a d o , @faction ) ;

insert end end ;


} if ;

into

Gerarchia

delimiter

Query

8.1 Calcolo dei pianeti dove non presente una fabbrica


select Pianeta where set distinct left Nome , S i s t e m a Facility is from F a c i l i t y . idPianeta ) by ( Nome ) ; NULL order join on ( Nome = Facility . idFacility sec )

(0.01

16

8.2 Calcolo dei marinai in attivit sulla nave N


select join where set M a r i n a i o . Nome , M a r i n a i o . Cognome , M a r i n a i o . M a t r i c o l a join on Incarico on ( I n c a r i c o . Nave_Codice = Nave . C o d i c e ) is NULL and Nave . NomeVaro = " E n t e r p r i s e " ; from Marinaio Nave ( Marinaio . Matricola = I n c a r i c o . Marinaio_Matricola )

Incarico . DataFineIncarico sec )

(0.01

8.3 Calcolo delle astronavi capaci di volo a curvatura maggiore di 5


select ( ( Nave join where set C l a s s . C l a s s , NomeVaro , C u r v a t u r a join Class on on from Nave . C l a s s = C l a s s . C l a s s ) order by ( C u r v a t u r a ) desc ; MotoreCurv i d M o t o r e C u r v = MotoreCurv_idMotoreCurv )

Curvatura > 5 sec )

(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

DataFineIncarico by ( Nave_Codice ) sec )

(0.82

8.5 Calcolo del numero di navi e di otte di ogni fazione


select from join group set AllianceName , count ( d i s t i n c t join on Nave on idFleet ) as NumFlotte , count ( d i s t i n c t Flotta Fazione by ( Flotta_idFleet = Flotta . idFleet ) ( Flotta . idFazione = Fazione . idFazione )

NomeVar

AllianceName ; sec )

(0.02

8.6 Calcolo dell' uciale di grado maggiore a bordo della Nave N


select Nave join max ( HScalaComando ) Incarico on from join Grado on ( C o d i c e = Nave_Codice ) ( i d G r a d o = Grado_idGrado )

17

where select join where set

C o d i c e = 12 join on

into on

@max ; from ( i d G r a d o = Grado_idGrado )

NomeVaro , M a r i n a i o _ M a t r i c o l a , HScalaComando Grado and ( C o d i c e = Nave_Codice ) HScalaComando = @max ;

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 ( (

Mansione . i d I n c a r i c o = 14 select Incarico Mansione Grado Nave 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

( 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 );

Mansione . i d I n c a r i c o = 14 sec )

(0.06

8.12 Calcolo dei Velivoli pilotati da Piloti di Grado G


select join where set idVelivolo join on ( from on ( Pilota_Matricola = Marinaio_Matricola ) ) Velivolo Incarico Grado Grado_idGrado = i d G r a d o

NomeGrado = " rpnzm " ; sec )

(0.68

8.13 Calcolo del numero di marinai attivi su ogni nave


select where group set NomeVaro , C o d i c e , c o u n t ( d i s t i n c t join Nave on Incarico . DataFineIncarico by Nave . C o d i c e sec ) order by is Marinaio_Matricola ) as N_Marinai from Incarico ( I n c a r i c o . Nave_Codice = Nave . C o d i c e ) NULL Marinaio_Matricola ) desc ; count ( d i s t i n c t

(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

join join join join join where set

specie Pianeta Nave on Flotta Pianeta

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 )

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" sec )

(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 ;

j o i n Nave on Nave . c o d i c e = I n c a r i c o . Nave_Codice where year ( Nave . d a t a V a r o ) = 2 0 0 0 or year ( 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 set


(1.21 sec )

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

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 ) 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


pianeta2 . avrgtemperatura > 50;

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 . A v r g t e m p e r a t u r a > 5 0 or set


(0.11 sec )

Ottimizzazione Query

9.1 Ottimizzazione di 8.10 (2.56sec 1.69sec)


s e l e c t Nave . C o d i c e , NomeVaro , NameRace , count ( NameRace ) from Nave j o i n join join
Marinaio Specie Incarico

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

group by Nave . C o d i c e , NameRace ;


Si nota subito che la query non ha sottoquery,quindi lanciamo il comando Explain sulla stessa: mysql> e x p l a i n select Nave . C o d i c e , NomeVaro , NameRace ,

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

Marinaio possible_keys : PRIMARY, Marinaio_FKIndex2

Marinaio_FKIndex2 ship . Specie . idSpecie 19 Using index 3. row

key_len :

select_type : table : type : key : ref : rows : Extra : id : 1

I n c a r i c o _ F K I n d e x 1 , Nave_Codice

Incarico_FKIndex1 ship . Marinaio . Matricola 1 Using where 4. row

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

M arinaio Incarico N ave.

Nei dati di prova inseriti la tabella specie e la

tabella nave hanno un ordini di grandezza di

(104 )

quindi potrebbe sembrare Se si va a

che l'ordine in cui vengano Joinate non faccia molta divverenza. quindi risulterebbe pi conveniente come ordine di Join

vedere l'ordine di grandezza della tabella Incarico per si scopre che di

(105 ), N ave Incarico

M arinaio Specie.
Si vede subito infatti che eseguendo mysql> select /! straight_join

Nave . C o d i c e , NomeVaro , NameRace ,

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 . C o d i c e , NomeVaro , NameRace ,

> 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

type : key : ref : rows : Extra : id : 1

ALL NULL

possible_keys :

PRIMARY

key_len :

NULL

NULL 3754 Using temporary ; Using 2. filesort row

select_type : ref SIMPLE type :

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 :

select_type : eq_ref PRIMARY 4 SIMPLE type : possible_keys :

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 )

9.2 Ottimizzazione di 8.11 (0.06sec 0.00sec)


select join join join where in 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 Mansione Grado Nave

mostra che la query non pu essere ulteriormente ottimizzata.

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

( i d G r a d o = Grado_idGrado ) ( Nave_Codice = Nave . C o d i c e ) and from Nave . C l a s s = 1 0 Marinaio ) ) and Grado_idGrado

Mansione . i d I n c a r i c o = 14 max ( Grado_idGrado ) Incarico Mansione on on ( ( join join

( 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

join join where

Grado Nave

on on

( 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 );

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

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 ) ) into @max ;

Mansione . i d I n c a r i c o = 14

M a r i n a i o . Nome , M a r i n a i o . Cognome join on on Incarico on ( on (

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 and Grado_idGrado = @max ;

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 ) )

> > > >

Marinaio join join where

join on

Marinaio_Matricola = Matricola join Nave on

Mansione Grado 1

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 and Nave . C l a s s = 10 into @max ;

( i d G r a d o = Grado_idGrado ) affected (0.00 sec )

( 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

9.3 Ottimizzazione di 8.13 (0.76sec 0.48sec)


24

select where group

NomeVaro , C o d i c e , c o u n t ( d i s t i n c t join Nave on Incarico . DataFineIncarico by Nave . C o d i c e order by is

Marinaio_Matricola )

as

N_Marinai

from

Incarico

( I n c a r i c o . Nave_Codice = Nave . C o d i c e ) NULL Marinaio_Matricola ) desc ; count ( d i s t i n c t

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

select_type : table : type : key : ref : rows : Extra :

Nave_Codice

Nave_Codice s h i p . Nave . C o d i c e 20 Using where 2 rows in set (0.00 sec )

key_len :

Come discusso precedentemente l'ordine di Join molto importante. L'ordine di grandezza di Nave

(104 ) mentre quello di Incarico (105 ). /


NomeVaro , C o d i c e , as

Quindi si Nota

facilmente che ancora una volta l'ordine di Join scelto il peggiore. select /! straight_join Nave on

count ( d i s t i n c t Incarico where order by join

Marinaio_Matricola ) is

N_Marinai by

from Nave . C o d i c e limit 10;

( I n c a r i c o . Nave_Codice = Nave . C o d i c e ) NULL g r o u p Marinaio_Matricola ) desc

Incarico . DataFineIncarico count ( d i s t i n c t

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 ) /!

4394 6480 7570 4244 6906 5516 6279 4824 5112

| | | | | | | | |

43 43 43 42 42 42 42 42 42

| | | | | | | | |

| PIDHPDMSHHDT | XSQXJVMC | | FB KNAVSSRZOTPGI

| AXILAOODRPQMXPIBOBWE |

| B L X W B C O X V B Y H | MWGIHSQFEO | XHGITZPKCZZYHFHO rows in set (0.48

+ +++ 10

mysql> e x p l a i n Incarico where order id : 1 by join

select Nave on

straight_join

/
as N_Marinai 0.48 \G from

NomeVaro , C o d i c e , c o u n t ( d i s t i n c t Incarico . DataFineIncarico count ( d i s t i n c t 1.

Marinaio_Matricola ) is row NULL g r o u p by desc

( I n c a r i c o . Nave_Codice = Nave . C o d i c e ) Marinaio_Matricola ) limit 10

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

Incarico possible_keys : Nave_Codice

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.

9.4 Ottimizzazione di 8.14 (2.45sec 0.05sec)


select join distinct join on 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 ) specie ( Marinaio . i d S p e c i e = Specie . i d S p e c i e )

26

join join join join where

Pianeta Nave on Flotta Pianeta

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 )

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" select distinct

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 :

Specie_FKIndex1 ship . Pianeta . IdPianeta 1 Using index 3. row

key_len :

select_type : table : type : key : ref : rows : Extra :

PRIMARY, Marinaio_FKIndex2

Marinaio_FKIndex2 ship . specie . idSpecie 20 4. row

key_len :

id : 1

27

select_type : table : type : key : ref : rows : Extra : id : 1 ref 4

SIMPLE I n c a r i c o _ F K I n d e x 1 , Nave_Codice

Incarico possible_keys :

Incarico_FKIndex1 ship . Marinaio . Matricola 1 Distinct 5. row

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

PRIMARY, Nave_FKIndex1 , C o d i c e , P i p p o I n d e x key_len : 1 Distinct 6. row

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

s h i p . Nave . F l o t t a _ I d F l e e t Distinct 7. row

select_type : table : type : key : ref : rows : Extra : 7 rows

PRIMARY

key_len :

Distinct

la Query ha un OR nella clausola where.

in Mysql possibile usare un

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

(b . idSpecie = Specie . idSpecie ) ( Specie . idPianeta = Pianeta . idPianeta )

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"

( Nave_Codice = Nave . C o d i c e ) ( flotta_idFleet = Flotta . idFleet ) on ( f l o t t a . idpianeta = a . idpianeta )

Flotta Pianeta

a . s i s t e m a = "L W Q L C G K W U Y N W E O Q K" ; select distinct b . Matricola , b . Nome , b . Cognome from

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 :

select_type : table : type : key : ref : rows : id : 1 PRIMARY b ref 4 possible_keys :

Specie_FKIndex1 ship . Pianeta . IdPianeta 1

key_len :

select_type : table : type : key : ref : rows : Extra : id : 1 PRIMARY Incarico ref possible_keys :

PRIMARY, Marinaio_FKIndex2

Marinaio_FKIndex2 ship . specie . idSpecie 20

key_len :

4.

row

select_type : table : type : key :

Incarico_FKIndex1

Incarico_FKIndex1

30

key_len : ref : rows : Extra : id : 2 1

ship . b . Matricola Using index 5. row

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

Flotta_FKIndex1 NULL 250 Using index ; Using temporary 6. row

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

Nave_FKIndex1 ship . Flotta . IdFleet 8 Using index 8. row

key_len :

select_type : table : type : key : ref : rows : Extra :

I n c a r i c o _ F K I n d e x 1 , Nave_Codice

Nave_Codice s h i p . Nave . C o d i c e 20 9. row

key_len :

id : 2

31

select_type : table : type : key : ref : rows : Extra : eq_ref PRIMARY 4

UNION possible_keys : PRIMARY

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

t a b l e : <u n i o n 1 ,2 > possible_keys : NULL

key_len :

9.5 Ottimizzazione di 8.15 (1.21sec 0.13sec)


come si pu vedere il tempo di esecuzione diminuisce fortemente con questa soluzione. Select from join where set Incarico . idIncarico join Marinaio on ( Marinaio . Matricola = or on Nave . c o d i c e = I n c a r i c o . Nave_Codice 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 ) = 2000 ;

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

316363 [ . . . ] 289180 412253 330724 rows in

| | | | set (0.13 sec )

+ +

9.6 Ottimizzazione di 8.16 (1.21sec 0.13sec)


Select from join join join join where distinct join on as as Nave . NomeVaro Facility on on ( Nave . F a c i l i t y _ i d F a c i l i t y = idFacility ) ( F a c i l i t y . idPianeta = Pianeta . idPianeta ) ( Armamento . N a v e _ c o d i c e = n a v e . C o d i c e ) Facility2 pianeta2 on on ( Armamento . F a c i l i t y _ i d F a c i l i t y = or facility2 . idFacil 50; ( F a c i l i t y 2 . idPianeta = Pianeta2 . idPianeta ) pianeta2 . avrgtemperatura > Nave Pianeta Facility Pianeta

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

Select join join

d i s t i n c t Nave . NomeVaro as as
Facility2 pianeta2

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 )


Facility Pianeta

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 )

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 Select join d i s t i n c t Nave . NomeVaro


Facility

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 :

pianeta2 eq_ref 4 possible_keys : P I A Y RM R

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 :

Armamento ref 5 possible_keys : Armamento_FKIndex1 , Armamento_FKIndex3

key :
ref :

Armamento_FKIndex3 ship . Facility2 . i d F a c i l i t y 2

key_len :

rows :
Extra : id : 1

Using where
4. row

select_type : P I A Y RM R

table :
type :

Nave eq_ref 4 possible_keys : P I A Y RM R

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 :

Pianeta eq_ref 4 possible_keys : P I A Y RM R

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 :

Nave ref 4 possible_keys : Nave_FKIndex3

key :
ref :

Nave_FKIndex3 ship . F a c i l i t y . i d F a c i l i t y 1 8. row

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 )

come si pu vedere dall'explain la query non ulteriormente ottimizzabile.

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 ;

where M a r i n a i o _ M a t r i c o l a = mtr and d a t a f i n e i n c a r i c o select join


idFazione

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

on ( g e r a r c h i a . Grado_idGrado = g r a d o . i d g r a d o ) i n t o @Min from

where M a r i n a i o _ M a t r i c o l a = mtr and HScalaComando = @Max ; s e l e c t min ( HScalacomando )


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 )

where HScalaComando > @Max and i d F a z i o n e = @ F a z i o n e ;


if @min is

not n u l l i n t o @Grado from 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

where i d F a z i o n e = @ F a z i o n e and HSCALACOMANDO = @Min ; update


incarico is

s e t g r a d o _ i d G r a d o = @grado where M a r i n a i o _ M a t r i c o l a = mtr and d a t a f i n e i n c a r i c o else s e l e c t NomeGrado into@Name from


gerarchia

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 , "

i n t o @grado from Grado where h s c a l a c o m a n d o = @max+1 a values


( @grado ,

into

Gerarchia

incarico

s e t g r a d o _ i d G r a d o = @grado null ;

where M a r i n a i o _ M a t r i c o l a = mtr and d a t a f i n e i n c a r i c o

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 ;

update S p e c i e d e l e t e from end ;


} delimiter ;

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 )

s e l e c t max ( Grado_idGrado ) from


Marinaio

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

j o i n Grado on ( i d G r a d o = Grado_idGrado ) select join

j o i n Nave on ( Nave_Codice = Nave . C o d i n t o @max ;

where M a n s i o n e . i d I n c a r i c o = I n c a r i c I d and Nave . C l a s s = C l a s s i D


M a r i n a i o . Nome , M a r i n a i o . Cognome from Marinaio

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

j o i n Grado on ( i d G r a d o = Grado_idGrado ) end ;


} delimiter ;

j o i n Nave on ( Nave_Codice = Nave . C o d

where M a n s i o n e . i d I n c a r i c o = I n c a r i c I d and Nave . C l a s s = C l a s s i D and Grado_idG

11

Views
Crea una view che restituisce tutte le navi varate nell'anno corrente

c r e a t e view N a v i _ a t t u a l i from Nave j o i n


Class

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 )

where year ( DataVaro ) = year ( now ( ) ) ;

37

Crea una view che restituisce tutti i marinai che hanno pi di 50 anni

C E T VE R A E I W a n z i a n i AS SELECT M a r i n a i o . Nome F O R M Marinaio W E E DATEDIFF(CURDATE( HR


) , DataDiNascita )

M a r i n a i o . Cognome ;

/365 > 50

Crea una view che restituisce tutte le Classi a disposizione della otta F

Create V E I W C l a s s i _ d i AS S e l e c t from C l a s s join join


Flotta Fazione

C l a s s . NameClass

as C l a s s ,

count ( )

as No

j o i n Nave on ( C l a s s . C l a s s = Nave . C l a s s ) on ( Nave . 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 ) on ( F l o t t a . i d F a z i o n e = F a z i o n e . i d F a z i o n e )


;

where a l l i a n c e n a m e = "J U W G D C U O Y" E N X H E O W M

Crea una view che restituisce i pianeti che hanno dato vita ad una specie

Create view P i a n e t i _ v i v i AS Select


P i a n e t a . Nome as Planet

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

Create view N a v i _ c o m e _ c l a s s _ a t t u a l i AS Select

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:

Una transazione una unit atomica.

Non pu essere ese-

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