!1
Indice
Raccolta e analisi dei requisiti 3
Realtà d’interesse 3
Glossario dei termini 4
Tavola dei volumi 4
Tavola delle operazioni 5
Progetto concettuale 6
Schema concettuale con generalizzazioni 6
Schema concettuale senza generalizzazioni 6
Progetto logico 7
Matrice CRUD 7
Schema concettuale ristrutturato 8
Tabelle e vincoli d’integrità referenziale 9
!2
Raccolta e analisi dei requisiti
Realtà d’interesse
Un ufficio turistico con sede in alcune città italiane vuole informatizzare il sistema di
prenotazione dei tour che offre.
Nelle 8 città in cui opera organizza due tipologie di tour: itinerari enogastronomici della città
nei suoi vari quartieri e visite guidate in alcuni dei musei del centro.
Ognuno di questi tour è identificato da un ID che contiene il nome della città in cui viene
svolto, l’orario e il prezzo, uguale per i tour della stessa durata.
Ciascun tour é disponibile in spagnolo, inglese, tedesco, francese e i costi non variano con
la scelta della lingua.
I percorsi possono essere svolti in un’ora, 3 ore o nell’intera giornata e se ne svolgono
rispettivamente 4 (9.30, 12.30, 18.30, 21,00) al costo di 10€, 2 (10.00, 15.00) al costo di
30€, 1 (9.30) al costo di 45€).
Ogni tour è offerto da un'unica guida, identificata dal relativo codice fiscale e ciascuna guida
può decidere di condurre uno o più giri turistici. Tutte le guide vengono selezionate
accuratamente tra lo staff di differenti agenzie turistiche che mettono a disposizione i propri
professionisti.
Ciascuna guida può inoltre scegliere quali tra i tour proposti offrire in base alla propria
preparazione. Non è detto che ogni giorno le guide riescano a coprire tutti i tour che l’ufficio
offre in tutte le lingue.
Gli utenti, per accedere al servizio di prenotazione per uno o più tour, devono essere in
possesso di un codice identificativo che si ottiene dopo aver effettuato la registrazione alla
piattaforma. La possibilità di accesso verrà revocata dopo 60 giorni in caso di inattività.
Tale codice può rappresentare sia la singola persona che un gruppo, ciascuno dei quali può
essere formato da un minimo di 2 persone ad un massimo di 20.
Affinché un servizio venga svolto, è necessaria la presenza di almeno 2 persone.
Una volta effettuato l’accesso alla piattaforma l’utente riuscirà a visualizzare tutti i tour con le
rispettive informazioni, e avrà la possibilità sia di scegliere il tour sia la guida turistica, il cui
profilo contiene nome, cognome e lingue parlate.
L’utente non potrà più prenotarsi a un tour se sono presenti già 20 persone.
Una volta partecipato ad uno dei tour l’utente registrato, sia singolo che gruppo, può
esprimere il grado di soddisfazione del giro turistico di cui ha usufruito lasciando una
recensione con una valutazione da 1 a 5 stelle. Ogni tour registra solo le 50 recensioni più
recenti.
!3
Glossario dei termini
Di seguito viene riportato un elenco dei termini più frequenti e centrali della nostra realtà
d’interesse:
Agenzia turistica 30
Assunzione 100 Ogni guida è assunta da solo un’agenzia
Sceglie 120.000
Scrive 11.200 La recensione è unica
!4
Tavola delle operazioni
Riportiamo qui la tavola di alcune delle operazioni possibili con la relativa frequenza
giornaliera.
Abbiamo ritenuto opportuno scegliere questo arco di tempo perché l’agenzia turistica offre i
propri servizi giornalmente.
Si stima che ogni giorno si registrino un massimo di 250 persone interessate ai tour in una
città, quindi un totale di 2000 per le 8 città.
Questo numero è stato scelto approssimando a 10 utenti il totale di partecipanti ad ognuno
dei 28 tour proposti, considerando che spesso la registrazione di un utente rappresenta un
gruppo.
!5
Schema concettuale con generalizzazioni
!6
Progetto logico
Matrice CRUD
Operazione 1
Viene richiesto un solo accesso per ciascuna nuova registrazione e si tratta dell’aggiunta di
un elemento a utente.
Operazione 2
Assumendo già l’esistenza delle tre entità, sono necessari 3 accessi di lettura alle entità e
uno di scrittura dell’associazione per un totale di 4 accessi.
Operazione 3
Innanzitutto realizziamo 2 accessi per la creazione di guida e di agenzia a cui si aggiungono
i 2 di lettura e un quinto di associazione tra essi.
Operazione 4
Sono necessari 3 accessi all’entità di lettura e uno di scrittura dell’associazione per un totale
di 4 accessi.
Operazione 5
Leggiamo la guida, leggiamo il tour e creiamo l’assegnazione scelta per un totale di 3
operazioni.
Operazione 6
Leggiamo il tour e modifichiamo il suo attributo. Sono in tutto 2 accessi.
Operazione 7
Serve solamente un accesso per eliminare l’utente.
Operazione 8
Viene richiesto di trovare le guide per agenzia che sono 3.3 in media. È necessario leggere
prima la guida, poi le assunzioni per agenzia e le agenzie per guide.
In totale: 1 + 3.3 + 3.3 = 7.6
Operaz Recen Utente Tour Agenzia Guida Scrittur Scelt Assunz Costo
ione sioni a a ione
1 C 2000
2 R R R C 2000 x
4=
8000
3 C,R C, R C 5x0.5
4 R R R C 4x100
0
5 R R C 3x
224
6 R, U 2 x 0.1
7 D 500
8 R R R 7.6x2
Volum 11.200 120.00 224 30 100 11.200 120. 100
e 0 000
!7
Schema concettuale ristrutturato
Per evitare ridondanza abbiamo accorpato le agenzie da cui sono state assunte le guide
come attributi di quest’ultime.
In questo modo diminuisce il costo delle operazioni 3 e 8:
Guida Costo
3 C 0.5
8 R 2
Volume 100
!8
Tabelle e vincoli d’integrità referenziale
!9
Progetto fisico ed implementazione SQL
Principali interrogazioni SQL
1. Trovare il numero di tour in spagnolo.
2. Trovare gli utenti che hanno svolto un tour di tutta la giornata.
3. Trovare la media delle recensioni dei tour a Milano raggruppati per lingua.
4. Trovare le guide per ogni agenzia.
!10
Chiavi primarie e secondarie
Imporre ID come chiave primaria della tabella UTENTE:
ALTER TABLE utente ADD PRIMARY KEY ID_pkey (ID);
Imporre come chiave primaria gli attributi utente, tour, guida della tabella SCELTA:
ALTER TABLE scelta ADD PRIMARY KEY (utente, tour, guida)
Creare una chiave esterna tra l’ID-tour della tabella RECENSIONE e l’ID della tabella
TOUR:
ALTER TABLE recensione
ADD FOREIGN KEY (ID_tour)
REFERENCES tour(ID);
Creare una chiave esterna tra utente della tabella SCELTA e l’ID della tabella UTENTE:
ALTER TABLE scelta
ADD FOREIGN KEY (utente)
REFERENCES utente(ID);
Creare una chiave esterna tra tour della tabella SCELTA e l’ID della tabella TOUR:
ALTER TABLE scelta
ADD FOREIGN KEY (tour)
REFERENCES tour(ID);
Creare una chiave esterna tra guida della tabella SCELTA e CF della tabella GUIDA:
ALTER TABLE scelta
ADD FOREIGN KEY (guida)
REFERENCES guida(CF);
!11
Esempi di operazioni CRUD
4 Scrivere una recensione:
INSERT INTO recensione VALUES (‘08-06-2020’, 4, ‘HFI4D’ ‘BD289N’,
‘Milano 8:00 €20’);
7 Cancellare un utente:
DELETE FROM utente WHERE ID = ‘BD289N’;
3. Trovare la media delle recensioni dei tour di Milano raggruppati per lingua:
SELECT tour.lingua, AVG(recensione.voto)
FROM recensione INNER JOIN tour
ON recensione.ID_tour = tour.ID
WHERE tour.ID LIKE BINARY ‘Milano%’
GROUP BY tour.lingua
!12