Appunti per Scuola e Università
humanisticheUmanistiche
Appunti e tesine di tutte le materie per gli studenti delle scuole medie riguardanti le materie umanistiche: dall'italiano alla storia riguardanti le materie umanistiche: dall'italiano alla storia 
sceintificheScientifiche
Appunti, analisi, compresione per le scuole medie suddivisi per materie scientifiche, per ognuna troverai appunti, dispense, esercitazioni, tesi e riassunti in download.
tecnicheTecniche
Gli appunti, le tesine e riassunti di tecnica amministrativa, ingegneria tecnico, costruzione. Tutti gli appunti di AppuntiMania.com gratis!
Appunti
informatica
CComputerDatabaseInternetJava
Linux unixReti


AppuntiMania.com » Informatica » Appunti di database » Progetto del modulo di basi di dati

Progetto del modulo di basi di dati




Visite: 3363Gradito:apreciate 5-stela [ Medio appunti ]
Leggi anche appunti:

Documento delle Specifiche relativo alla progettazione di una base di dati per la gestione dei dipartimenti del Polo Didattico delle Scienze (v. 1.0)


Documento delle Specifiche relativo alla progettazione di una base di dati per la

DB Spaziali


DB Spaziali I dati territoriali (geometrici) sono oramai importanti per molte organizzazioni.. I

I Semafori , ovvero la gestione della multiutenza


I Semafori , ovvero la gestione della multiutenza Chiariamo subito una cosa: già
immagine di categoria

Scarica gratis Progetto del modulo di basi di dati

PROGETTO DEL MODULO DI BASI DI DATI

"CATENA DI ALBERGHI"

Pina Acierno




Specifiche dei dati


Si vuole realizzare una base di dati per una catena di grandi alberghi. Per ogni albergo, si vuole tenere traccia del nome, della località, del numero di camere e box auto presenti nell'albergo, del nome del direttore, nonché del numero di camere e box auto attualmente disponibili.

I clienti possono effettuare prenotazioni, presso uno o più alberghi appartenenti alla catena. La prenotazione è identificata da un codice e contiene il cognome del cliente, la data in cui è stata effettuata, le date previste di arrivo e partenza, e il numero di camere (ed eventualmente di box auto) prenotati.

Le camere sono caratterizzate da un numero (valido solo all'interno di ogni singolo albergo), dal tipo di camera (singola, doppia, suite, ecc.), dal numero di letti, dalla presenza o meno di servizi. I box auto, sono caratterizzati da un numero (valido solo all'interno di ogni singolo albergo) dall'ubicazione, dalla dimensione, dal tipo (coperto/scoperto).

Per ogni camera occupata si vuole tenere traccia delle informazioni relative agli ospiti, in particolare, numero del documento d'identità , nome, cognome, residenza, data di nascita. Inoltre, si vuole tenere traccia della prenotazione con la quale la camera era stata riservata. Per ogni box auto, si vuole tenere traccia delle camere in cui risiedono gli ospiti che lo utilizzano.




Termine originario

Termine sostitutivo

Ospite

Cliente


Specifiche sulle operazioni

Per la catena di alberghi sono previste alcune relazioni, di cui riportiamo una breve descrizione :

O1 Introduci un nuovo cliente 100g

O2 Eliminazione dei dati di un cliente già memorizzato

O3 Prenota una camera con o senza box 1000g

O4 Cancella una prenotazione 400g

O5 Consegna la camera con o senza box 800g


Analisi delle specifiche e ristrutturazione dei requisiti


In questo paragrafo ci si occupa della fase di analisi e ristrutturazione dei requisiti raccolti, producendo un insieme omogeneo e non ambiguo di specifiche da utilizzare nelle fasi successive della progettazione.


Si individuano i termini più rilevanti con eventuali sinonimi e omonimi utilizzando un glossario dei termini ai quali associamo una breve descrizione.

Termine

Descrizione

Sinonimi

Termini collegati

Albergo

Stabile

Hotel

Camere box cliente

Cliente

Soggetto che richiede la stanza

Ospite

Persona

Prenotazione

Camera

Camera

Camera presente in un albergo


Albergo

Box

Cliente

Box

Posto auto

Posto

Parcheggio

Garage

Albergo

Camera

Prenotazione

Richiesta di una camera da parte di un cliente, in un tempo anticipato


Cliente

Camere


Dati su albergo          

Per l'albergo (circa 100),si  rappresenta dati come il nome, località e nome direttore, l'unione di nome e località identifica l'albergo


Dati sui clienti          

Per i clienti (circa 3000), si  rappresentano i dati anagrafici come nome, cognome, data di nascita, residenza e codice fiscale.








































Dati sulle camere

Per le camere (circa 3000), si  rappresenta dati come il numero (che lo identificano all'interno di un unico albergo), il tipo (come suite, singola doppia eccetera), e la presenza o meno dei servizi.


Dati sui box   

Per i box (circa 900), si  rappresenta dati come il numero (che lo identificano all'interno di un unico albergo), l'ubicazione, il tipo (coperto o scoperto).


Dati sulla prenotazione        

Per le prenotazioni (circa 500), si  rappresenta un codice per identificarlo, il cognome del cliente la data di inizio e la data di fine del periodo di pernottamento, il numero della camera e l'eventuale numero box




Entità

Descrizione

Attributi

Identificatore

Camera

Camera presente in un albergo

Numero letti

Servizi

Numero

Numero, nome e località dell'albergo

Cliente

Soggetto che prenota una camera e/o la occupa

Numero C.I.

Nome

Cognome

Data di nascita

Residenza

Numero C.I.

Albergo

Stabile

Nome

Località

Nome direttore

Nome, località

Box

Luogo nel quale far sostare l'auto

Numero

Ubicazione

Dimensione

Numero, nome e località dell'albergo





Relazione

Entità partecipanti

Descrizione

Attributi

Composizione

Albergo

camera

Gli alberghi contengono al loro interno un diverso numero di camere


Possesso

Albergo

box

Gli alberghi possono avere dei box per le auto dei clienti

Id

Data arrivo

Data partenza

Prenotazione

Cliente

Camera

Prenotazione

Un cliente può prenotare una o più camere


Occupazione

Cliente

Camera

I clienti ospitano una camera per un certo periodo

Data Arrivo

Data Partenza

Associazione

Box

Camera

Se un cliente usufruisce di un box, quest'ultimo è associato alla camera in cui risiede




Progettazione logica


Si effettua, ora, la progettazione logica della base di dati.


Analisi delle ridondanze

Si è effettuata prima una analisi delle ridondanze, da tale anali si è trovata una ridondanza nella relazione prenotazione, poiché il box è già associato alla camera.


Eliminazione delle gerarchie

Nello schema sono presenti due gerarchie.

Per quanto riguarda le camere, le entità suite, doppia e singola possono essere sostituite da un attributo chiamato tipo perché non indicano niente altro che il tipo che la camera può assumere. Analogamente avviene per l'entità box che assumerà l'attributo tipo, in questo caso di tipo boleano.




































Tavola dei volumi


Concetto

Tipo

Volume

Albergo

E


Camera

E


Box

E


Cliente

E


Occupazione

R


Prenotazione

R


Associazione

R



Tavola degli accessi


Concetto

Costrutto

Accessi

Tipo

Albero

Entità

1 al mese

L

Camera

Entità

200 al giorno

L

Box

Entità

50 al giorno

L

Cliente

Entità

100 al giorno

SL

Prenotazione

Relazione

100 al giorno

SL

Occupazione

Relazione

5 al giorno

S

Associazione

Relazione

1 al giorno

S



Tavola delle frequenze


Operazione

Descrizione

Frequenza

Tipo

O1

Introduci un nuovo cliente

100 al giorno

OL

O2

Eliminazione dei dati di un cliente già memorizzato

200 al giorno

B

O3

Prenota una camera con o senza box

10000 al giorno

OL

O4

Cancella una prenotazione

400 al giorno

OL

O5

Consegna la camera con o senza box

800 al giorno

OL



Cammino di join

Ci nome cognome data_nascita residenza

 

Cliente

 


Progettazione logica nel modello relazionale


Traduzione entità

Si individuano una serie di schemi di R-relazioni, l'albergo introduce un nuovo attributo che diventerà la chiave, essendo richiamato in molte entità:


  • Albergo (Id, Nome, Locazione, Nome direttore);
  • Camera (Numero, Albergo, Numero letti, Tipo);
  • Box (Numero, Albergo, Ubicazione, Dimensione, Tipo);
  • Cliente (CI, Nome, Cognome, Data di nascita, Residenza);


Traduzione di relazioni

Relazioni uno a uno non sono presenti.

Di relazioni molti a molti sono presenti prenota e occupazione, esse vanno entrambe tradotte in R-relazioni:


  • Occupazione (Albergo,Camera, Data_arrivo, Data_partenza, Box_associato, Cliente);
  • Prenotazione (Id, Cliente, Albergo, Camera, Box, Data_arrivo, Data_partenza);

Le relazioni uno a molti sono: associazione, composizione e possedere.

Gli ultimi due sono rilevabili delle chiavi esterne rispettivamente di camera e box, la prima invece deve essere rappresentata dalla seguente tabella:

  • Associazione(box, albergo, data_inizio, camera,data_fine)

Implementazione di alcune operazioni.


In questo paragrafo è proposta l'implementazione di alcune delle operazioni che definiscono la catena di alberghi.




Script di istallazione





* script di istallazione


create database CatenaAlberghi



*Albergo



Si prevede che la catena comprende 100 alberghi, tale numero andrà a modificarsi solo con l'acquisto di un altro albergo che accade di rado. Ciò fa sì che il tablespace delle tabelle albergo, camere e box è quasi invariato nel tempo.



CREATE TABLE 'ALBERGO' ('ID' NUMBER(10) NOT NULL,

'NOME' VARCHAR2(20) NOT NULL,

'LOCALITA' VARCHAR2(20) NOT NULL, 'INDIRIZZO' VARCHAR2(30) NOT NULL, 'NOME_DIRETTORE' VARCHAR2(10) NOT NULL, PRIMARY KEY('ID'))

TABLESPACE 'USERS' PCTFREE 5 PCTUSED 60 INITRANS 2

STORAGE ( INITIAL 16384 NEXT 8192 PCTINCREASE 0)




*camera


La seguente create table presuppone che le camere sono memorizzate su bd diversi in base all'albergo.




CREATE TABLE 'CAMERA' ('NUMERO' NUMBER(10) NOT NULL,

'NUM_LETTI' NUMBER(10) NOT NULL, 'TIPO' NVARCHAR2(15) NOT

NULL, 'ALBERGO' NUMBER(10) NOT NULL,

CONSTRAINT 'SYS_C003615' PRIMARY KEY('NUMERO', 'ALBERGO')

USING INDEX

TABLESPACE 'USERS'

STORAGE ( INITIAL 64K NEXT 0K MINEXTENTS 1 MAXEXTENTS

2147483645 PCTINCREASE 0) PCTFREE 10 INITRANS 2 MAXTRANS 255,

CONSTRAINT 'SYS_C003616' FOREIGN KEY('ALBERGO')

REFERENCES 'ALBERGO'('ID'))

TABLESPACE 'USERS' PCTFREE 20 INITRANS 2 MAXTRANS 255

STORAGE ( INITIAL 80K NEXT 8K PCTINCREASE 0)

NOLOGGING

PARTITION BY RANGE ('ALBERGO') (PARTITION 'CAMERA_P1'

VALUES LESS THAN (15)

TABLESPACE 'USERS' PCTFREE 20 PCTUSED 0 INITRANS 2 MAXTRANS

255

STORAGE ( INITIAL 80K NEXT 0K MINEXTENTS 1 MAXEXTENTS

2147483645 PCTINCREASE 0)

LOGGING,

PARTITION 'CAMERA_P2'

VALUES LESS THAN (30)

TABLESPACE 'USERS' PCTFREE 20 PCTUSED 0 INITRANS 2 MAXTRANS

255

STORAGE ( INITIAL 80K NEXT 0K MINEXTENTS 1 MAXEXTENTS

2147483645 PCTINCREASE 0)

LOGGING,

PARTITION 'CAMERA_P3'

VALUES LESS THAN (45)

TABLESPACE 'USERS' PCTFREE 20 PCTUSED 0 INITRANS 2 MAXTRANS

255

STORAGE ( INITIAL 80K NEXT 0K MINEXTENTS 1 MAXEXTENTS

2147483645 PCTINCREASE 0)

LOGGING,

PARTITION 'CAMERA_P4'

VALUES LESS THAN (60)

TABLESPACE 'USERS' PCTFREE 20 PCTUSED 0 INITRANS 2 MAXTRANS

255

STORAGE ( INITIAL 80K NEXT 0K MINEXTENTS 1 MAXEXTENTS

2147483645 PCTINCREASE 0)

LOGGING,

PARTITION 'CAMERA_P5'

VALUES LESS THAN (75)

TABLESPACE 'USERS' PCTFREE 20 PCTUSED 0 INITRANS 2 MAXTRANS

255

STORAGE ( INITIAL 80K NEXT 0K MINEXTENTS 1 MAXEXTENTS

2147483645 PCTINCREASE 0)

LOGGING,

PARTITION 'CAMERA_P6'

VALUES LESS THAN (90)

TABLESPACE 'USERS' PCTFREE 20 PCTUSED 0 INITRANS 2 MAXTRANS

255

STORAGE ( INITIAL 80K NEXT 0K MINEXTENTS 1 MAXEXTENTS

2147483645 PCTINCREASE 0)

LOGGING,

PARTITION 'CAMERA_P7'

VALUES LESS THAN (105)

TABLESPACE 'USERS' PCTFREE 20 PCTUSED 0 INITRANS 2 MAXTRANS

255

STORAGE ( INITIAL 80K NEXT 0K MINEXTENTS 1 MAXEXTENTS

2147483645 PCTINCREASE 0)

LOGGING,

PARTITION 'CAMERA_P8'

VALUES LESS THAN (120)

TABLESPACE 'USERS' PCTFREE 20 PCTUSED 0 INITRANS 2 MAXTRANS

255

STORAGE ( INITIAL 80K NEXT 0K MINEXTENTS 1 MAXEXTENTS

2147483645 PCTINCREASE 0)

LOGGING,

PARTITION 'CAMERA_P9'

VALUES LESS THAN (135)

TABLESPACE 'USERS' PCTFREE 20 PCTUSED 0 INITRANS 2 MAXTRANS

255

STORAGE ( INITIAL 80K NEXT 0K MINEXTENTS 1 MAXEXTENTS

2147483645 PCTINCREASE 0)

LOGGING,

PARTITION 'CAMERA_P10'

VALUES LESS THAN (150)

TABLESPACE 'USERS' PCTFREE 20 PCTUSED 0 INITRANS 2 MAXTRANS

255

STORAGE ( INITIAL 80K NEXT 0K MINEXTENTS 1 MAXEXTENTS

2147483645 PCTINCREASE 0) LOGGING)



*box





CREATE TABLE 'BOX' ('ALBERGO' NUMBER(10) NOT NULL,

'NUMERO' NUMBER(10) NOT NULL, 'UBICAZIONE' VARCHAR2(20 byte)

NOT NULL, 'TIPO' NUMBER(1) NOT NULL, 'DIMENSIONE' NUMBER(10)

NOT NULL,

CONSTRAINT 'BOOL_BOX' CHECK(tipo=0 or tipo=1),

CONSTRAINT 'FK_BOX_ALBERGO' FOREIGN KEY('ALBERGO')

REFERENCES 'ALBERGO'('ID'),

CONSTRAINT 'PK_BOX' PRIMARY KEY('ALBERGO', 'NUMERO'))

TABLESPACE 'USERS' PCTFREE 5 PCTUSED 0 INITRANS 2 MAXTRANS

255

STORAGE ( INITIAL 48K NEXT 0K MINEXTENTS 1 MAXEXTENTS

2147483645 PCTINCREASE 0)

LOGGING




*Cliente


Le tabelle create di seguito hanno una crescita considerevole nel tempo, quindi i tablespace cresceranno notevolmente. Quello della tabella cliente ha una crescita minore rispetto agli altri perché sono previsti clienti fedeli.



CREATE TABLE 'CLIENTE' ('CI' VARCHAR2(10 byte) NOT

NULL, 'NOME' VARCHAR2(20 byte) NOT NULL, 'COGNOME'

VARCHAR2(20 byte) NOT NULL, 'DATA_NASCITA' DATE NOT NULL,

'RESIDENZA' VARCHAR2(40 byte) NOT NULL,

CONSTRAINT 'SYS_C003635' PRIMARY KEY('CI')

USING INDEX

TABLESPACE 'USERS'

STORAGE ( INITIAL 64K NEXT 0K MINEXTENTS 1 MAXEXTENTS

2147483645 PCTINCREASE 0) PCTFREE 10 INITRANS 2 MAXTRANS 255)


TABLESPACE 'USERS' PCTFREE 10 PCTUSED 0 INITRANS 1 MAXTRANS

255

STORAGE ( INITIAL 64K NEXT 0K MINEXTENTS 1 MAXEXTENTS

2147483645 PCTINCREASE 0)

LOGGING



* Prenotazioni



Si è creato una sequenza per incrementare automaticamente il valore id della tabella prenotazione.



CREATE SEQUENCE 'CATENAALBEGHI'.'CONT_PREN' INCREMENT BY 1 START WITH

21 MAXVALUE 1.0E28 MINVALUE 1 NOCYCLE

CACHE 20 NOORDER



CREATE TABLE 'PRENOTAZIONE' ('ID' NUMBER(10) NOT NULL,

'CLIENTE' VARCHAR2(10 byte) NOT NULL, 'ALBERGO' NUMBER(10)

NOT NULL, 'CAMERA' NUMBER(10) NOT NULL, 'NUM_BOX' NUMBER(10)

NOT NULL, 'DATA_ARRIVO' DATE NOT NULL, 'DATA_PARTENZA' DATE

NOT NULL,

CONSTRAINT 'CK_DATE_PRENOTAZIONI'

CHECK(data_arrivo<data_partenza),

CONSTRAINT 'FK_PRENOTAZIONE_CAMERA' FOREIGN KEY('CAMERA',

'ALBERGO')

REFERENCES 'CAMERA'('NUMERO', 'ALBERGO'),

CONSTRAINT 'FK_PRENOTAZIONE_CLIENTE' FOREIGN KEY('CLIENTE')

REFERENCES 'CLIENTE'('CI'),

CONSTRAINT 'PK_PRENOTAZIONE' PRIMARY KEY('ID')

USING INDEX

TABLESPACE 'USERS'

STORAGE ( INITIAL 64K NEXT 0K MINEXTENTS 1 MAXEXTENTS

2147483645 PCTINCREASE 0) PCTFREE 10 INITRANS 2 MAXTRANS 255)


TABLESPACE 'USERS' PCTFREE 5 PCTUSED 0 INITRANS 2 MAXTRANS

255

STORAGE ( INITIAL 808K NEXT 0K MINEXTENTS 1 MAXEXTENTS

2147483645 PCTINCREASE 0)

LOGGING





*Occupazione




CREATE TABLE 'OCCUPAZIONE' ('ALBERGO' NUMBER(10) NOT

NULL, 'CAMERA' NUMBER(10) NOT NULL, 'DATA_ARRIVO' DATE NOT

NULL, 'DATA_PARTENZA' DATE NOT NULL, 'BOX_ASSOCIATO'

NUMBER(10) NOT NULL, 'CLIENTE' VARCHAR2(10 byte) NOT NULL,

CONSTRAINT 'FK_CLIENTE' FOREIGN KEY('CLIENTE')

REFERENCES 'CLIENTE'('CI'),

CONSTRAINT 'FK_OCC_BOX' FOREIGN KEY('ALBERGO',

'BOX_ASSOCIATO')

REFERENCES 'BOX'('ALBERGO', 'NUMERO'),

CONSTRAINT 'FK_OCC_CAMERA' FOREIGN KEY('CAMERA', 'ALBERGO')

REFERENCES 'CAMERA'('NUMERO', 'ALBERGO'),

CONSTRAINT 'PK_OCCUPAZIONE' PRIMARY KEY('ALBERGO', 'CAMERA',

'DATA_ARRIVO')

USING INDEX

TABLESPACE 'USERS'

STORAGE ( INITIAL 64K NEXT 0K MINEXTENTS 1 MAXEXTENTS

2147483645 PCTINCREASE 0) PCTFREE 10 INITRANS 2 MAXTRANS 255)


TABLESPACE 'USERS' PCTFREE 10 PCTUSED 0 INITRANS 2 MAXTRANS

255

STORAGE ( INITIAL 1400K NEXT 0K MINEXTENTS 1 MAXEXTENTS

2147483645 PCTINCREASE 0)

LOGGING




*Associazione




CREATE TABLE 'ASSOCIAZIONE' ('BOX' NUMBER(10) NOT NULL,

'ALBERGO' NUMBER(10) NOT NULL, 'CAMERA' NUMBER(10) NOT NULL,

'DATA_INIZIO' DATE NOT NULL, 'DATA_FINE' DATE NOT NULL,

CONSTRAINT 'FK_ASS_BOX' FOREIGN KEY('ALBERGO', 'BOX')

REFERENCES 'BOX'('ALBERGO', 'NUMERO'),

CONSTRAINT 'FK_ASS_CAMERA' FOREIGN KEY('CAMERA', 'ALBERGO')

REFERENCES 'CAMERA'('NUMERO', 'ALBERGO'),

CONSTRAINT 'PK_ASSOCIAZIONE' PRIMARY KEY('BOX', 'ALBERGO',

'CAMERA', 'DATA_INIZIO')

USING INDEX

TABLESPACE 'USERS'

STORAGE ( INITIAL 64K NEXT 0K MINEXTENTS 1 MAXEXTENTS

2147483645 PCTINCREASE 0) PCTFREE 10 INITRANS 2 MAXTRANS 255)


TABLESPACE 'USERS' PCTFREE 10 PCTUSED 0 INITRANS 2 MAXTRANS

255

STORAGE ( INITIAL 48K NEXT 0K MINEXTENTS 1 MAXEXTENTS

2147483645 PCTINCREASE 0)

LOGGING



Operazioni O1


La seguente procedura controlla se l'ospite è un vecchio cliente, in caso contrario memorizza i suoi dati nel db.



create or replace procedure ins_cliente

(n in cliente.nome %type, -- nome cliente

c in cliente.cognome %type, -- cognome cliente

carta in cliente.ci %type, -- numero carta di identità

nascita in cliente.data_nascita %type, -- data di nascita

indirizzo in cliente.residenza %type -- residenza del cliente

) is

begin

declare

presente number(5);

begin

-- controlla se il cliente è già memorizzato

select count(*) into presente from cliente where ci=carta;

if presente=0 then

-- inserisce i dati del cliente nel db

insert into cliente values(carta,n,c,nascita,indirizzo);

commit;

end if;

end;

end ins_cliente;




Operazioni O2


La cancellazione nella tabella cliente, avviene solo nel caso in cui un nuovo cliente ha prenotato e poi disdetto una camera, quindi solo dopo la cancellazione della prenotazione.

Tale operazione è fatta dal seguente trigger, che seleziona i clienti che non hanno mai occupato una stanza e non hanno una prenotazione, li copia in un cursore tramite il quale identifica i clienti da cancellare :




create or replace trigger del_cliente

after delete on prenotazione

for each row

declare

cli cliente.ci %type;

-- creazione del cursore

cursor cliente_as is

select c.ci from cliente c, occupazione o prenotazione p where c.ci!=o.cliente and c.ci!=p.cliente

begin

-- apertura del cursore

open cliente_as;

fetch cliente_as into cli;

while cliente_as %notfound

loop

-- cancellazione del cliente

delete from cliente where ci=cli;

fetch cliente_as into cli;

end loop

--chiusura del cursore

close cliente_as;

commit;

end;



Operazioni O3


Di seguito sono rappresentate sia le procedure di controllo che la procedura di inserimento.

Quando un cliente chiede di prenotare una camera, un responsabile dell'albergo controlla se ci sono camere e box liberi per il periodo e del tipo richiesto.

La camera è controllata dalla funzione disp() che utilizza una query innestata che interroga le tabelle camera, albergo e prenotazione, il box è controllato dalla funzione posti_liberi() che restituisce il numero di posti liberi in un dato periodo, infine la procedura prenota() effettua la prenotazione inserendo una tupla nella relativa tabella.



create or replace function disp

(nome_alb in albergo.nome %type, -- nome albergo

loc in albergo.localita %type, -- località albergo

tip in camera.tipo %type, -- tipo di camera richiesta

arrivo in prenotazione.data_arrivo %type, -- data arrivo

partenza in prenotazione.data_partenza %type) -data partenza

return varchar2

is

begin

declare

libero varchar2(100

cam camera.numero %type;

alb camera.albergo %type;

cursor cur is

select c.numero, c.albergo

from camera c inner join albergo a on c.albergo=a.id

where a.nome=nome_alb and a.localita=loc and c.tipo=tip and c.numero<> ALL(select camera

from prenotazione p

where p.data_arrivo<=partenza and p.data_partenza>=arrivo);

begin

open cur

loop

fetch cur into cam,alb; exit when cur %notfound;

libero:=libero||to_char(cam)||' '||to_char(alb);

end loop;

close cur;                              

--restituisce l'elenco delle camere libere

return libero;

end;

end disp;





create or replace function posti_liberi

(num in albergo.id %type, -- id albergo

arrivo in prenotazione.data_arrivo %type, -- data di arrivo

partenza in prenotazione.data_partenza %type --data partenza


return number

is

begin

declare

libero number(5);

tutti number(5);

pieni number(5);

begin

-- conta i posti presenti in un albergo

select count(*) into tutti from box b where b.albergo=num;

-- selezionna il numero dei posti occupati

select sum(p.num_box) into pieni from prenotazione p where p.albergo=num and p.data_arrivo<=partenza and p.data_partenza>=arrivo;

/* restituisce il numero dei posti liberi sottraendo i totali da quelli occupato */

libero:=(tutti-pieni);

return libero;

end;

end posti_liberi;




create or replace procedure prenota


n in cliente.nome %type, --nome cliente

c in cliente.cognome %type, -- cognome cliente

ci in cliente.ci %type, -- numero della carta di identità

nascita in cliente.data_nascita %type, -- data di nascita

indirizzo in cliente.residenza %type, --indirizzo del cliente

cod_alb in albergo.id %type, --codice albergo

num_camera in camera.numero %type, -- numero camera

arrivo in prenotazione.data_partenza %type, --data di arrivo

partenza in prenotazione.data_partenza %type, --data di partenza

n_box in prenotazione.num_box %type) --quantità dei box richiesti

as begin

begin

-- inserisce i dati del cliente

ins_prenota(ci,n,c,nascita,indirizzo);

-- inserisce i dati della prenotazione

insert into prenotazione values (cont_pren.nextval,ci,cod_alb,num_camera,n_box,arrivo,partenza);

commit;

end;

end prenota;





Operazioni O4


Nel caso in cui un cliente annulla una prenotazione la seguente procedura, date le informazioni della prenotazione ed il numero della carta di identità del cliente, elimina una tupla dal db.


create or replace procedure del_prenotazione

(carta in cliente.ci %type, --numero carta di identità

cod_alb in albergo.id %type, --codice albergo

num_camera in camera.numero %type, -- numero camera

arrivo in prenotazione.data_partenza %type, -- data di arrivo

partenza in prenotazione.data_partenza %type) is

begin

declare

codice prenotazione.id %type;

begin

/* elimina la tupla in cui sono memorizzati i dati della prenotazione annullata */

select id into codice from prenotazione where cliente='carta' and albergo='cod_alb' and data_arrivo='arrivo' and camera='num_camera';

delete from prenotazione where id=codice;

end;

end del_prenotazione;




Operazioni O4


La seguente procedura è utilizzata quando un cliente arriva nell'albergo e gli vengono consegnate le chiavi della camera. Il database sarà aggiornato nella tabella occupazione, e nel caso di un nuovo cliente in quella cliente.


create or replace procedure arrivo


n in cliente.nome %type, --nome cliente

c in cliente.cognome %type, -- cognome cliente

carta in cliente.ci %type, --numero carta si identità del cliente

--data di nascita del cliente

nascita in cliente.data_nascita %type,

indirizzo in cliente.residenza %type, --residenza del cliente

cod_alb in albergo.id %type, -- codice associato all'albergo

num_camera in camera.numero %type, --numero della camera assegnata

--numero di boxs richiesti

numero_b in occupazione.box_associato %type,

oggi in prenotazione.data_partenza %type, --data odierna

-- data di presunto rilascio della camera

partenza in prenotazione.data_partenza %type


as

begin

declare

presente number(5);

i number(5);

boxs box.numero %type;

--cursore di appoggio per il numero dei boxs liberi

cursor cur_box is

select num_box from prenotazione p where p.albergo=cod_alb and p.data_arrivo<=partenza and p.data_partenza>=oggi;

begin

-- controlla se il cliente è già stato ospite

select count(*) into presente from cliente where ci=carta;

if presente=0 then

--inserimento dei dati del cliente, se nuovo

insert into cliente values(carta,n,c,nascita,indirizzo);

end if;

-- aggiornamento della tabella occupazione

insert into occupazione values (cod_alb,num_camera,oggi,partenza,numero_b,carta);

i:=0;

open cur_box;

while i<numero_b loop

fetch cur_box into boxs;

-- aggiornamento della tabella associazione

insert into associazione values (boxs,cod_alb,num_camera,oggi,partenza);

i:=i+1;

end loop;

close cur_box;

end;

end arrivo



Ulteriori operazioni


La seguente funzione cerca il cliente che ha trascorso più tempo negli alberghi, questo potrebbe servire per dare un trattamento migliore ad un cliente fedele.



create or replace function miglior_cliente ()

return varchar2

is

begin

declare

clien varchar2(100);

giorni number(5);

massimo number(5);

mcliente occupazione.cliente %type;

arrivo occupazione.data_arrivo %type;

partenza occupazione.data_partenza %type;

cli occupazione.cliente %type;

ci_cli occupazione.cliente %type;

/*dichiarazione di un curso che serve come appoggio per effettuare calcoli basati sui dati della tabella occupazione*/

cursor cur is

select data_arrivo, data_partenza, cliente from occupazione order by cliente asc;

begin

massimo:=0;

open cur;

fetch cur into arrivo, partenza, cli;

-- ciclo sulle tuple della tabella occupazione

while not(cur %notfound) loop

ci_cli:=cli;

giorni:=0;

-- ciclo sulle tuple della tabella occupazione che fanno riferimento allo stesso cliente

while (not(cur%notfound) and cli=ci_cli) loop

giorni:=giorni+(partenza-arrivo);

fetch cur into arrivo, partenza, cli;

end loop;

-- ricerca del massimo tra il numero di pernottamenti dei clienti

if massimo<giorni then

mcliente:=cli; -- identificazione della chiave del miglior cliente

massimo:=giorni;

end if;

end loop;

close cur;

-- selezione del miglior cliente

select to_char(nome)||' '||to_char(cognome) into clien from cliente where ci=mcliente;

return clien;

end;

end;



Considerazioni


Il progetto creato tratta di una catena di circa 100 alberghi con relativa gestione delle prenotazioni e della permanenza dei clienti. Naturalmente questi sono problemi presenti in ogni albergo, ma sicuramente non sono gli unici.

Altre operazioni che dovrebbero essere informatizzate sono il calcolo delle ricevute,la gestione dei sevizi che può offrire un albergo come il ristorante, il frigobar, informazioni turistiche ecc, la gestione del personale, eventuali statistiche per aumentare la clientela.

Tali servizi possono essere presenti in alcuni alberghi mentre in altri no, oppure differenziarsi in base al luogo in cui si trova un albergo (montagna, mare, città).

Per informatizzare la gestione delle ricevute bisogna inserire un campo prezzo nell'entità camera che varia in base all'albergo, al tipo, e ai servizi che offre come TV, terrazzino, telefono ecc. Poi è necessaria una procedura che moltiplica il costo della camera per il numero di pernottamento che si ricava dalla tabella occupazione.

Come visto, il minimondo di questo progetto è applicabile in un mondo più vasto e complesso quindi potrà essere ampliato ed intergrato ad altri già presenti.

Per quel che riguarda il backup dei dati è importante fare spesso un salvataggio almeno delle tabelle occupazione e cliente in modo da non effettuare errori nel calcolo dei giorni da far pagare al cliente.


Scarica gratis Progetto del modulo di basi di dati
Appunti su: https:wwwappuntimaniacominformaticadatabaseprogetto-del-modulo-di-basi-di15php,



Scarica 100% gratis e , tesine, riassunti



Registrati ora

Password dimenticata?
  • Appunti superiori
  • In questa sezione troverai sunti esame, dispense, appunti universitari, esercitazioni e tesi, suddivisi per le principali facoltà.
  • Università
  • Appunti, dispense, esercitazioni, riassunti direttamente dalla tua aula Universitaria
  • all'Informatica
  • Introduzione all'Informatica, Information and Comunication Tecnology, componenti del computer, software, hardware ...