Transcript

PickACar Case study di progettazione DB

Sistemi Informativi T

Versione elettronica: 0.CarSharingCaseStudy.pdf

NB: Questo file viene aggiornato periodicamente

Versione del 8/12/2017

Case Study: Car Sharing Sistemi Informativi T 2

Car Sharing

� Il car sharing è un servizio che permette di utilizzare un'automobile su

prenotazione, prelevandola e riportandola in un parcheggio, e

pagando in ragione dell'utilizzo fatto.

https://it.wikipedia.org/wiki/Car_sharing

� Un fenomeno in continuo aumento

"As of December 2012, there were an estimated

1.7 million car-sharing members in 27 countries.“

https://en.wikipedia.org/wiki/Carsharing

� Diverse applicazioni online, tra cui:

Enjoy https://enjoy.eni.com , Zipcar http://www.zipcar.com/

Car2go https://www.car2go.com , Playcar http://www.playcar.net,

TPER http://www.tper.it/car-e-bike-sharing/carsharing

Come funziona

� Dalla home di Zipcar

Case Study: Car Sharing Sistemi Informativi T 3

Prime considerazioni

� La parte di registrazione (Join) è essenziale, ma non molto

“interessante” dal punto di vista progettazione DB

� Serve solo a definire che dati mantenere di ogni utente registrato

� Gli aspetti più tecnologici (Zipcard) sono anch’essi essenziali,

ma esulano dai nostri scopi

� In sintesi, le operazioni fondamentali da supportare riguardano:

� Prenotazione di un’auto (Reserve)

� Ritiro di un’auto (Pick)

� Riconsegna di un’auto (Park)

� Nella versione che svilupperemo non entriamo nei dettagli della

“flotta” di auto e delle tariffe

Case Study: Car Sharing Sistemi Informativi T 4

Possibili estensioni

� Di seguito alcuni suggerimenti per estendere la versione base:

� tariffario (con calcolo automatico dei costi)

� sistema di punti bonus che danno luogo a sconti

� diverse categorie di utenti

� descrizione della "flotta"

� preavviso disponibilità

� gestione parcheggi

� gestione prenotazioni non disdette, ma senza ritiro auto

� sistema integrato per il tracking dei veicoli in uso

� ...

Case Study: Car Sharing Sistemi Informativi T 5

PickACar (PAC)

� Il sistema che vogliamo progettare deve consentire la prenotazione

di auto, il loro ritiro e la riconsegna

� Supponiamo che tutto si basi su un insieme di “parcheggi”, ovvero

punti di ritiro/riconsegna

� Un aspetto rilevante riguarda la gestione delle prenotazioni, che

supponiamo

� si possano fare solo su auto disponibili (si evita l’overbooking)

� possano essere disdette

� Complessivamente, i requisiti si possono sintetizzare come segue:

Case Study: Car Sharing Sistemi Informativi T 6

Requisiti

� PickACar (PAC) è un servizio che permette di noleggiare auto, prelevandole da un

parcheggio e rilasciandole presso lo stesso o un altro parcheggio PAC.

� Per la prenotazione occorre preventivamente registrarsi, fornendo i dati anagrafici

(nome, cognome, indirizzo), un numero di patente e una carta di credito (per

quest’ultima servono: circuito, numero, titolare e scadenza).

� La ricerca di un’auto viene effettuata specificando il parcheggio da cui si vuole

ritirare l’auto e la data e orario previsto di ritiro. Per evitare spiacevoli inconvenienti,

PAC permette di prenotare solo le auto disponibili, ovvero né in uso né già

prenotate.

� Effettuata la scelta, all’utente viene fornito un codice di prenotazione e il numero di

targa dell’auto. Alla riconsegna del veicolo viene calcolato l’effettivo costo (che tiene

conto della data e orario di riconsegna e dei chilometri percorsi) e quindi addebitato

sulla carta di credito.

� Non è necessario mantenere informazioni storiche sulle prenotazioni non più attive,

ovvero che han già dato luogo a un noleggio oppure che sono state disdette.

� Viceversa, vanno mantenute le informazioni relative a tutti i noleggi.

Case Study: Car Sharing Sistemi Informativi T 7

Schema E/R: versione 1

Case Study: Car Sharing Sistemi Informativi T 8

La parte storica riguarda i soli NOLEGGI, ed è supportata dalle

associazioni RITIRI, RICONSEGNE, UN e NA.

Quest’ultima, p roprio perché relativa a tutti i noleggi

(sia presenti che passati), associa NOLEGGI con AUTO.

In alternativa si poteva distinguere tra noleggi passati (conclusi) e

p resenti (in corso), e associare solo i presenti a IN_USO

(vedi versione 2).

1-1

0-NUP

1-1

0-NUN

1-1

0-N UIU

1-1 0-N

RITIRI

DataRitiro

OrarioRitiro

0-1 0-N

RICONSEGNE

DataRiconsegna

OrarioRiconsegna

KmPercorsi

Costo

0-N 1-1PIP

1-1

0-NNA

P

P

UTENTI

IDUtente

Cognome

Nome

Indirizzo

Patente

CartaCredito

Circuito

Numero

Titolare

Scadenza

M ese

Anno

id: IDUtente

PRENOTATE

CodicePrenotazione

DataRitiro

OrarioRitiro

id': CodicePrenotazione

PARCHEGGI

CodiceParcheggio

Indirizzo

id: CodiceParcheggio

NOLEGGI

IDNoleggio

id: IDNoleggio

IN_USOIN_PARCHEGGIO

DISPONIBILI

AUTO

Targa

M odello

Km

id: Targa

Schema E/R: versione 2

Case Study: Car Sharing Sistemi Informativi T 9

Viene partiizionata l'entità NOLEGGI.

L'associazione UIU è ridondante:

l'utente che ha in uso un'auto è infatti

univocamente determinato dal cammino

NICIU -> NOLEGGI_IN_CORSO -> UN -> UTENTI

Gli attributi vengono, equivalentemente, modellati come

proprietà delle entità che partecipano con cardinalità (1,1).

1-1

0-NUP

1-1

0-NUN

1-1

0-N UIU

1-1 0-NRITIRI

1-1 0-NRICONSEGNE

0-N 1-1PIP

1-1

1-1 NICIU

1-1 0-NNCA

P

P

P

UTENTI

IDUtente

Cognome

Nome

Indirizzo

Patente

CartaCredito

Circuito

Numero

Titolare

Scadenza

M ese

Anno

id: IDUtente

PRENOTATE

CodicePrenotazione

DataRitiro

OrarioRitiro

id': CodicePrenotazione

PARCHEGGI

CodiceParcheggio

Indirizzo

id: CodiceParcheggio

NOLEGGI_IN_CORSO

NOLEGGI_CONCLUSI

DataRiconsegna

OrarioRiconsegna

KmPercorsi

CostoNOLEGGI

IDNoleggio

DataRitiro

OrarioRitiro

id: IDNoleggio

IN_USOIN_PARCHEGGIO

DISPONIBILI

AUTO

Targa

M odello

Km

id: Targa

Progettazione logica: scelte

� Si parte dalla versione 2 dello schema concettuale, in quanto appare

opportuno tenere distinta la parte “storica” (NOLEGGI_CONCLUSI)

dal resto. Per la gerarchia dei noleggi si adotta pertanto una

traduzione verso il basso

� Per quanto riguarda la gerarchia delle AUTO, appare opportuna una

traduzione ibrida, in quanto:

� Il cambio frequente di “stato” di un’auto (da DISPONIBILE a PRENOTATA a IN_USO, e così via) farebbe propendere per un collassoverso l’alto, al fine di evitare “spostamenti” da una table all’altra (se sioptasse per un collasso verso il basso);

� d’altronde, le auto PRENOTATE, a differenza delle altre, hanno diverse informazioni aggiuntive, che conviene memorizzare separatamente.

� Lo schema che ne deriva (PAC/logico-manuale-2 nel file .lun) è

ottenuto eliminando la ridondanza dell’associazione UIU e

inglobando, ove possibile, le associazioni nelle entità

� Si veda il file .lun per altre alternative

Case Study: Car Sharing Sistemi Informativi T 10

Progettazione logica: schema

Case Study: Car Sharing Sistemi Informativi T 11

Traduzione ibrida per la gerarchia delle AUTO.

Collasso verso il basso di NOLEGGI.

Si elimina l'associazione UIU.

L'associazione NICIU 1-1 si assorbe in NOLEGGI_IN_CORSO

UTENTI

IDUtente

Cognome

Nome

Indirizzo

Patente

CCCircuito

CCNumero

CCTitolare

ScadenzaM ese

ScadenzaAnno

id: IDUtente

PRENOTATE

Targa

CodicePrenotazione

DataRitiro

OrarioRitiro

IDUtente

id: Targa

ref

id': CodicePrenotazione

ref: IDUtente

PARCHEGGI

CodiceParcheggio

Indirizzo

id: CodiceParcheggio

NOLEGGI_IN_CORSO

IDNoleggio

IDUtente

Targa

CodParcheggioRitiro

DataRitiro

OrarioRitiro

id: IDNoleggio

ref: CodParcheggioRitiro

ref: Targa

ref: IDUtente

NOLEGGI_CONCLUSI

IDNoleggio

IDUtente

Targa

CodParcheggioRitiro

DataRitiro

OrarioRitiro

CodParcheggioRiconsegna

DataRiconsegna

OrarioRiconsegna

KmPercorsi

Costo

id: IDNoleggio

ref: Targa

ref: CodParcheggioRiconsegna

ref: CodParcheggioRitiro

ref: IDUtente

AUTO

Targa

M odello

Km

IN_USO[0-1]

DISPONIBILE[0-1]

PRENOTATA[0-1]

CodiceParcheggio[0-1]

id: Targa

ref: CodiceParcheggio

exact-1: IN_USO

DISPONIBILE

PRENOTATA

exact-1: IN_USO

CodiceParcheggio

Progettazione logica: vincoli

Case Study: Car Sharing Sistemi Informativi T 12

Per evitare il vincolo di mutua esclusione tra gli ID dei NOLEGGI,

conviene avere domini distinti.

Quando un noleggio termina, si genera un nuovo IDNoleggio

Targa referenzia IN_USO NOT NULL

Targa referenzia PRENOTATA NOT NULL

UTENTI

IDUtente

Cognome

Nome

Indirizzo

Patente

CCCircuito

CCNumero

CCTitolare

ScadenzaMese

ScadenzaAnno

id: IDUtente

PRENOTATE

Targa

CodicePrenotazione

DataRitiro

OrarioRitiro

IDUtente

id: Targa

ref

id': CodicePrenotazione

ref: IDUtente

PARCHEGGI

CodiceParcheggio

Indirizzo

id: CodiceParcheggio

NOLEGGI_IN_CORSO

IDNoleggioTemp

IDUtente

Targa

CodParcheggioRitiro

DataRitiro

OrarioRitiro

id: IDNoleggioTemp

ref: CodParcheggioRitiro

ref: Targa

ref: IDUtente

NOLEGGI_CONCLUSI

IDNoleggio

IDUtente

Targa

CodParcheggioRitiro

DataRitiro

OrarioRitiro

CodParcheggioRiconsegna

DataRiconsegna

OrarioRiconsegna

KmPercorsi

Costo

id: IDNoleggio

ref: Targa

ref: CodParcheggioRiconsegna

ref: CodParcheggioRitiro

ref: IDUtente

AUTO

Targa

M odello

Km

IN_USO[0-1]

DISPONIBILE[0-1]

PRENOTATA[0-1]

CodiceParcheggio[0-1]

id: Targa

ref: CodiceParcheggio

exact-1: IN_USO

DISPONIBILE

PRENOTATA

exact-1: IN_USO

CodiceParcheggio

Progettazione logica: le relazioni PK-FK

� Gli schemi relazionali, mantenendo le sole PK (sottolineate) e

FK (in corsivo, * se ammettono valori nulli), sono:

UTENTI (IdUtente)

PARCHEGGI (CodiceParcheggio)

AUTO (Targa, CodiceParcheggio*)

PRENOTATE (Targa, IdUtente)

NOLEGGI_IN_CORSO (IDNoleggioTemp, IDUtente, Targa,

CodParcheggioRitiro)

NOLEGGI_CONCLUSI (IDNoleggio, IDUtente, Targa,

CodParcheggioRitiro, CodParcheggioRiconsegna)

Case Study: Car Sharing Sistemi Informativi T 13

Le 3 operazioni (+1)

Case Study: Car Sharing Sistemi Informativi T 14

Disponibile Prenotata

In uso

Prenotazione

Cancellazione

RitiroRiconsegna

Prenotazione

Input:

:id_cl ID del cliente

:targa Targa dell'auto

:data Data del ritiro

:ora Ora prevista del ritiro

Azioni sul DB:

� Inserire una tupla in PRENOTATE, generando un CodicePrenotazione per il ritiro dell'auto

� Aggiornare in AUTO lo stato da Disponibile a Prenotata

Case Study: Car Sharing Sistemi Informativi T 15

Cancellazione

Input:

:cod_prenotaz Codice della prenotazione (in alternativa, la targa dell'auto)

Azioni sul DB:

� Cancellare la tupla da PRENOTATE

� Aggiornare in AUTO lo stato da Prenotata a Disponibile

Case Study: Car Sharing Sistemi Informativi T 16

Ritiro

Input:

:cod_prenotaz Codice della prenotazione(data e ora effettive del ritiro si ottengono dal sistema con CURRENT DATE e CURRENT TIME)

Azioni sul DB:

� Inserire una tupla in NOLEGGI_IN_CORSO, generando un IDNoleggioTemp

� Cancellare la tupla da PRENOTATE

� Aggiornare in AUTO lo stato da Prenotata a In_Uso e porre a NULL il CodiceParcheggio

Case Study: Car Sharing Sistemi Informativi T 17

Riconsegna

Input:

:targa Targa dell'auto (in alternativa, IDNoleggioTemp)

:codPark Codice del parcheggio di riconsegna

:km Chilometri percorsi

:costo Costo del noleggio

(data e ora della riconsegna si ottengono dal sistema)

Azioni sul DB:

� Inserire una tupla in NOLEGGI_CONCLUSI, generando un IDNoleggio

� Cancellare la tupla relativa da NOLEGGI_IN_CORSO

� Aggiornare in AUTO lo stato da In_Uso a Disponibile e porre CodiceParcheggio = :codPark e Km = Km + KmPercorsi

Case Study: Car Sharing Sistemi Informativi T 18

SQL: alcuni strumenti utili (1)

IDENTITY COLUMN: permette di generare automaticamente valori

(interi), definendo il primo e l'incremento

CREATE TABLE R (

ID INT NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY

(START WITH 500,INCREMENT BY 1),

A INT NOT NULL );

INSERT INTO R(A) VALUES (10);

INSERT INTO R(ID,A) VALUES (DEFAULT, 20);

SELECT * FROM R;

ID A

------ ------

500 10

501 20

Case Study: Car Sharing Sistemi Informativi T 19

SQL: alcuni strumenti utili (2)

DERIVED COLUMN: l'opzione GENERATED ALWAYS AS si usa anche per

generare automaticamente i valori di un attributo mediante

un'espressione

CREATE TABLE R (

A INT NOT NULL,

CODE CHAR(10) NOT NULL PRIMARY KEY

GENERATED ALWAYS AS ('cx' || A) );

INSERT INTO R(A) VALUES (10);

INSERT INTO R(A,CODE) VALUES (20, DEFAULT);

SELECT * FROM R;

A CODE

------ ----------

10 cx10

20 cx20

Case Study: Car Sharing Sistemi Informativi T 20

SQL: alcuni strumenti utili (3)

INSERT:

� Usando la forma VALUES è possibile usare una subquery scalare (tra

parentesi) per assegnare valori a singoli attributi

INSERT INTO R(A,B)

VALUES ((SELECT A FROM S WHERE K = 5),'b1');

� Si possono usare anche più subquery

� Ma se la subquery scalare restituisce una tupla con più attributi, allora

bisogna usare la forma SELECT

INSERT INTO R(A,B)

SELECT A,B FROM S WHERE K = 5;

Case Study: Car Sharing Sistemi Informativi T 21

Definizione delle table (1)

� Per brevità si omettono gli attributi non rilevanti per le diverse operazioniCREATE TABLE UTENTI (

IDUTENTE INT NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY,

... );

CREATE TABLE PARCHEGGI (

CODICEPARCHEGGIO INT NOT NULL PRIMARY KEY,

... );

CREATE TABLE AUTO (

TARGA CHAR(10) NOT NULL PRIMARY KEY,

KM INT NOT NULL DEFAULT 0,

IN_USO CHAR(1) DEFAULT NULL,

PRENOTATA CHAR(1) DEFAULT NULL,

DISPONIBILE CHAR(1) DEFAULT 'Y',

CODICEPARCHEGGIO INT REFERENCES PARCHEGGI,

CONSTRAINT STATO CHECK ((IN_USO IS NOT NULL AND PRENOTATA IS NULL AND

DISPONIBILE IS NULL) OR (...) OR (...)),

CONSTRAINT PARK CHECK ((IN_USO IS NOT NULL AND CODICEPARCHEGGIO IS

NULL) OR (IN_USO IS NULL AND CODICEPARCHEGGIO IS NOT NULL)));

Case Study: Car Sharing Sistemi Informativi T 22

Definizione delle table (2)

CREATE TABLE PRENOTATE (

TARGA CHAR(10) NOT NULL UNIQUE REFERENCES AUTO,

IDUTENTE INT NOT NULL REFERENCES UTENTI,

CODICEPRENOTAZIONE INT NOT NULL PRIMARY KEY GENERATED ALWAYS AS

IDENTITY (START WITH 1000,INCREMENT BY 1),

DATARITIRO DATE NOT NULL ,

ORARIORITIRO TIME NOT NULL CHECK (ORARIORITIRO BETWEEN 0 AND 24)

);

CREATE TABLE NOLEGGI_IN_CORSO (

IDNOLEGGIOTEMP INT NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY

(START WITH 10000,INCREMENT BY 2),

TARGA CHAR(10) NOT NULL REFERENCES AUTO,

IDUTENTE INT NOT NULL REFERENCES UTENTI,

CODPARCHEGGIORITIRO INT NOT NULL REFERENCES PARCHEGGI,

DATARITIRO DATE NOT NULL ,

ORARIORITIRO TIME NOT NULL

);

Case Study: Car Sharing Sistemi Informativi T 23

Definizione delle table (3)

CREATE TABLE NOLEGGI_CONCLUSI (

IDNOLEGGIO INT NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY

(START WITH 10001,INCREMENT BY 2),

TARGA CHAR(10) NOT NULL REFERENCES AUTO,

IDUTENTE INT NOT NULL REFERENCES UTENTI,

CODPARCHEGGIORITIRO INT NOT NULL REFERENCES PARCHEGGI,

DATARITIRO DATE NOT NULL,

ORARIORITIRO TIME NOT NULL,

CODPARCHEGGIORICONSEGNA INT NOT NULL REFERENCES PARCHEGGI,

DATARICONSEGNA DATE NOT NULL,

ORARIORICONSEGNA TIME NOT NULL,

KMPERCORSI INT NOT NULL CHECK (KMPERCORSI > 0),

COSTO DEC(6,2) NOT NULL CHECK (COSTO > 0),

CONSTRAINT VALID_PARK CHECK ((DATARICONSEGNA > DATARITIRO) OR

((DATARICONSEGNA = DATARITIRO) AND

(ORARIORICONSEGNA > ORARIORITIRO)))

);

Case Study: Car Sharing Sistemi Informativi T 24

Operazioni e trigger

Case Study: Car Sharing Sistemi Informativi T 25

Disponibile Prenotata

In uso

Prenotazione

Cancellazione

RitiroRiconsegna

ATTENZIONE: la cancellazione da PRENOTATE non può innescare trigger, perché le azioni da compiere sono diverse a seconda che si tratti di Cancellazione o Ritiro

Operazioni e trigger: prenotazione

INSERT INTO PRENOTATE(TARGA,IDUTENTE,CODICEPRENOTAZIONE,

DATARITIRO,ORARIORITIRO)VALUES (:targa, :id_cl,DEFAULT,:data,:ora)

CREATE TRIGGER DISP2PRENOTAFTER INSERT ON PRENOTATEREFERENCING NEW AS NPFOR EACH ROWUPDATE AUTOSET DISPONIBILE = NULL,

PRENOTATA = 'Y'WHERE TARGA = NP.TARGA

Case Study: Car Sharing Sistemi Informativi T 26

Input: :id_cl ID del cliente:targa Targa dell'auto:data Data del ritiro:ora Ora prevista del ritiro

Azioni sul DB:• Inserire una tupla in PRENOTATE, generando un

CodicePrenotazione per il ritiro dell'auto• Aggiornare in AUTO lo stato da Disponibile a

Prenotata

Operazioni e trigger: cancellazione

DELETE FROM PRENOTATEWHERE CODICEPRENOTAZIONE = :cod_prenotaz

CREATE TRIGGER PRENOT2DISPAFTER DELETE ON PRENOTATEREFERENCING OLD AS OPFOR EACH ROWUPDATE AUTOSET DISPONIBILE = 'Y',

PRENOTATA = NULLWHERE TARGA = OP.TARGA

UPDATE AUTOSET DISPONIBILE = 'Y',

PRENOTATA = NULLWHERE TARGA = :targa

Case Study: Car Sharing Sistemi Informativi T 27

Input: :cod_prenotaz Codice della prenotazione (in alternativa, la targa dell'auto)

Azioni sul DB:• Cancellare la tupla da PRENOTATE• Aggiornare in AUTO lo stato da Prenotata a

Disponibile

Operazioni e trigger: ritiro (1)

INSERT INTO NOLEGGI_IN_CORSO(IDNOLEGGIOTEMP,TARGA,IDUTENTE,CODPARCHEGGIORITIRO,

DATARITIRO,ORARIORITIRO)VALUES (DEFAULT,

(SELECT TARGA FROM PRENOTATE WHERE CODICEPRENOTAZIONE = :cod_prenotaz),

(SELECT IDUTENTE FROM PRENOTATE WHERE CODICEPRENOTAZIONE = :cod_prenotaz),

(SELECT CODPARCHEGGIO FROM AUTOWHERE TARGA =

(SELECT TARGA FROM PRENOTATE WHERE CODICEPRENOTAZIONE = :cod_prenotaz)),

CURRENT DATE,CURRENT TIME)

DELETE FROM PRENOTATEWHERE CODICEPRENOTAZIONE = :cod_prenotaz

CREATE TRIGGER PRENOT2IN_USOAFTER INSERT ON NOLEGGI_IN_CORSOREFERENCING NEW AS NNFOR EACH ROWUPDATE AUTOSET IN_USO = 'Y',

PRENOTATA = NULL,CODPARCHEGGIO = NULL

WHERE TARGA = NN.TARGA

Case Study: Car Sharing Sistemi Informativi T 28

Input: :cod_prenotaz Codice della prenotazione (data e ora effettive del ritiro si ottengono dal sistema con CURRENT DATE e CURRENT TIME)

Azioni sul DB:• Inserire una tupla in NOLEGGI_IN_CORSO,

generando un IDNoleggioTemp• Cancellare la tupla da PRENOTATE• Aggiornare in AUTO lo stato da Prenotata a

In_Uso e porre a NULL il CodiceParcheggio

Operazioni e trigger: ritiro (2)

� Per evitare di eseguire tante query quanti sono i valori da inserire già presenti nel DB, si può optare per la seguente soluzione, senz'altro più efficiente

� Il valore di IDNOLEGGIOTEMP viene calcolato dal sistema

INSERT INTO NOLEGGI_IN_CORSO(TARGA,IDUTENTE,CODPARCHEGGIORITIRO,DATARITIRO,ORARIORITIRO)

SELECT P.TARGA,P.IDUTENTE,A.CODPARCHEGGIO,CURRENT DATE,CURRENT TIMEFROM PRENOTATE P, AUTO AWHERE A.TARGA = P.TARGAAND P.CODICEPRENOTAZIONE = :cod_prenotaz

Case Study: Car Sharing Sistemi Informativi T 29

Input: :cod_prenotaz Codice della prenotazione (data e ora effettive del ritiro si ottengono dal sistema con CURRENT DATE e CURRENT TIME)

Azioni sul DB:• Inserire una tupla in NOLEGGI_IN_CORSO,

generando un IDNoleggioTemp• Cancellare la tupla da PRENOTATE• Aggiornare in AUTO lo stato da Prenotata a

In_Uso e porre a NULL il CodiceParcheggio

Operazioni e trigger: riconsegna

INSERT INTO NOLEGGI_CONCLUSI(TARGA,IDUTENTE,CODPARCHEGGIORITIRO,DATARITIRO,ORARIORITIRO,

CODPARCHEGGIORICONSEGNA, DATARICONSEGNA,ORARIORICONSEGNA, KMPERCORSI,COSTO)

SELECT TARGA,IDUTENTE, CODPARCHEGGIORITIRO,DATARITIRO,ORARIORITIRO,:codPark,CURRENT DATE,CURRENT TIME,:km,:costo

FROM NOLEGGI_IN_CORSOWHERE TARGA = :targa

CREATE TRIGGER NOLEGGIO_CONCLUSOAFTER INSERT ON NOLEGGI_CONCLUSIREFERENCING NEW AS NNCFOR EACH ROWBEGIN ATOMICDELETE FROM NOLEGGI_IN_CORSOWHERE TARGA = NNC.TARGA;UPDATE AUTOSET IN_USO = NULL,

DISPONIBILE = 'Y',CODPARCHEGGIO = NNC.CODPARCHEGGIORICONSEGNA,KM = KM + NNC.KMPERCORSI

WHERE TARGA = NNC.TARGA;END

Case Study: Car Sharing Sistemi Informativi T 30

Azioni sul DB:Input:

:targa Targa dell'auto (in alternativa, IDNoleggioTemp):codPark Codice del parcheggio di riconsegna:km Chilometri percorsi:costo Costo del noleggio

Azioni sul DB:• Inserire una tupla in NOLEGGI_CONCLUSI• Cancellare la tupla relativa da NOLEGGI_IN_CORSO• Aggiornare in AUTO lo stato da In_Uso a Disponibile,

CodiceParcheggio e Km

Case Study: Car Sharing Sistemi Informativi T 31

Commenti conclusivi

� Il case study esaminato, oltre a mostrare come le diverse fasi della

progettazione si possono applicare ad un caso reale (sia pure semplificato),

e come la conoscenza delle principali operazioni può guidare la fase di

progettazione logica, permette di apprezzare la correlazione esistente tra

progettazione e codice SQL, e come quest'ultimo, avvalendosi di strumenti

quali i trigger, possa essere sviluppato riducendo all'essenziale le interazioni

con il lato client, a tutto vantaggio delle prestazioni

� Si suggerisce di analizzare come quanto prodotto possa essere

opportunamente esteso/modificato a fronte di nuove esigenze, in

particolare considerando, tra quelle elencate a pag. 5, le più interessanti in

termini di ripercussioni sul Data Base


Top Related