Esercitazione di laboratorio             Corso di Gestione dell’Informazione                         A.A. 2008/09         ...
1. Analisi del dominio e assunzioni1.1 Analisi del dominio Alla palestra hanno accesso due tipi diversi di persone: gli ab...
Quando una persona rinnova labbonamento le informazioni relative al precedente abbonamentosono cancellate dalla base di da...
1.2 Assunzioni  • Non è possibile associarsi ad un ente quando è già in corso l’abbonamento  • Un tupla della tabella uten...
2. Progettazione Concettuale2.1 Dizionario dei datiLegenda:_____ = entità_____ = associazioni_____ = attributiAlla palestr...
Quando una persona rinnova labbonamento le informazioni relative al precedente abbonamentosono cancellate dalla base di da...
Tabella EntitàNome             Descrizione                Attributi                Identificatori                         ...
Tabella EntitàNome             Descrizione                 Attributi              Identificatori                          ...
Gerarchie di generalizzazioneEntità Padre         Entità Figlie                Tipologia                     AbbonatoClien...
TabellaAssociazioniNome                  Descrizione                   Attributi   Entità collegate                      U...
Nome relazioniR1=releffettuaR2=relutenteclienteR3=reldipendenteutenteR4= relcontieneesR5=relassegnaR6=reltieneR7= relvuole...
2.3 Vincoli di dominioV1   la durata dell’abbonamento è 1 mese, 3 mesi, 6 mesi o                                          ...
Il sabato la palestra chiude alle 13 (controllo sui corsi   TriggerV10            che non superino l’orario di chiusura)V1...
R1=releffettuaR2=relutenteclienteR3=reldipendenteutenteR4= relcontieneesR5=relassegnaR6=reltieneR7= relvuoleesguireR8=relh...
3. Progettazione logicaABBONAMENTO (codabb, tipoabbnn, durataabbnn, costoabbnn, bonusabb, noteabb)CLIENTE (codf, nomenn, c...
4. Comandi SQL5.1 Implementazione in sql dei vincoli CHECKTabella “abbonamento”check_durataabb CHECK (durataabb = 30 OR du...
Tabella “scheda”check_difficolta CHECK (difficolta >= 1 AND difficolta <= 5);controlla che la difficoltà di una scheda sia...
Funzione:CREATE OR REPLACE FUNCTION func_checkcorsisab() RETURNS trigger AS$BODY$DECLAREBEGIN       IF (NEW.giorno = sabat...
Trigger:CREATE TRIGGER trig_checkcorsisovrapposti BEFORE INSERT OR UPDATE ON corso FOR EACH ROW EXECUTE PROCEDURE funz_che...
RETURN NEW;END;$BODY$ LANGUAGE plpgsql VOLATILE COST 100;ALTER FUNCTION funz_checkcorsisovrapposti() OWNER TO postgres;Que...
SELECT INTO totaleorecorso SUM(durata)       FROM corso       WHERE          preparatore=NEW.preparatore AND              ...
Tabella “entrata”Trigger:CREATE TRIGGER trig_abbonamentoscadutoonentrata BEFORE INSERT ON entrata FOR EACH ROW EXECUTE PRO...
WHERE         t.codf=NEW.codf AND t.codabb IS NOT NULL;              IF NOT FOUND THEN                     RAISE EXCEPTION...
Trigger:CREATE TRIGGER trig_checkinsertonentrata AFTER INSERT OR UPDATE ON entrata FOR EACH ROW EXECUTE PROCEDURE func_che...
ELSEIF        indexgiorno=5 THEN engiorno=venerdì;              ELSEIF        indexgiorno=6 THEN engiorno=sabato;         ...
Trigger:CREATE TRIGGER trig_ingressoconcorsi BEFORE INSERT OR UPDATE ON entrata FOR EACH ROW EXECUTE PROCEDURE func_ingres...
ELSEIF          ngiorno=1 THEN gentrata=lunedì;              ELSEIF          ngiorno=2 THEN gentrata=martedì;             ...
Tabella “tessera”Trigger:CREATE TRIGGER trig_deleteonentrate AFTER UPDATE ON tessera FOR EACH ROW EXECUTE PROCEDURE func_d...
END;$BODY$ LANGUAGE plpgsql VOLATILE COST 100;ALTER FUNCTION func_deleteonentrate() OWNER TO postgres;Questo trigger si at...
Data una settimana restituire il corso che ha registrato il massimo numero dipresenze. Restituire, inoltre, tale numero di...
Documentazione palestra
Documentazione palestra
Upcoming SlideShare
Loading in …5
×

Documentazione palestra

996 views

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
996
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
9
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Documentazione palestra

  1. 1. Esercitazione di laboratorio Corso di Gestione dell’Informazione A.A. 2008/09 Docenti: Valtolina, Mesiti Titolo esercitazione Palestra srl Gruppo:Massimo Santicchi massimo.santicchi@studenti.unimi.it [referente] Andrea Lanza andrea.lanza@studenti.unimi.it Stefano Manicone stefano.manicone@studenti.unimi.it Docente responsabile: Stefano Valtolina Data consegna: Aprile 2009
  2. 2. 1. Analisi del dominio e assunzioni1.1 Analisi del dominio Alla palestra hanno accesso due tipi diversi di persone: gli abbonati e gli utenti occasionali. Gliabbonati sono titolari di un abbonamento alla palestra, mentre gli utenti occasionali accedono allapalestra tramite il pagamento di unentrata a prezzo fisso(in Euro) e non sono titolari di nessun tipodi abbonamento.Per ogni persona che ha accesso alla palestra si vogliono memorizzare le seguenti informazioni:nome, cognome, codice fiscale, indirizzo(via, n civ, città), numero di telefono(casa o cellulare), datadi nascita, luogo di nascita ed eventuali note relative al cliente considerato. Gli abbonati allapalestra hanno una tessera identificata univocamente da un codice di tessera.Gli abbonati si suddividono in due categorie: studenti e lavoratori. Gli studenti hanno uno scontodel 20% sul costo di tutti i tipi di abbonamento, mentre i lavoratori di enti convenzionati con lapalestra hanno uno sconto variabile a seconda dellente di appartenenza. Si noti che tutti i lavoratoriappartenenti allo stesso ente hanno lo stesso sconto su tutti i tipi di abbonamento.Ogni abbonato è titolare di un certo tipo di abbonamento. Ogni tipo di abbonamento è identificatoda un codice e dà diritto a frequentare solo i corsi o solo la sala pesi o entrambi. Inoltre, ogniabbonamento ha una durata (che varia fra un anno, sei mesi, tre mesi, un mese)(in mesi), uncosto(in Euro), un campo per memorizzare eventuali note relative allabbonamento e un campobonus in cui si memorizza un eventuale bonus a cui labbonamento dà diritto (lampade solarigratuite, buoni sconto presso negozi di articoli sportivi, ecc.).Quando una persona si abbona alla palestra si vogliono memorizzare informazioni relative alla datadi inizio e di scadenza dellabbonamento. Queste informazioni devono essere coerenti con quellerelative al tipo di abbonamento scelto. Laccesso di un abbonato alla palestra è concesso solo edunicamente entro tali date. Un abbonato può iscriversi alla palestra senza portare il certificatomedico. Ha tempo un mese a decorrere dalla data di iscrizione per portare il certificato medico.Dopo un mese non viene più ammesso alla palestra se ancora senza certificato medico.
  3. 3. Quando una persona rinnova labbonamento le informazioni relative al precedente abbonamentosono cancellate dalla base di dati. Non si è quindi interessati ad informazioni relative alla storiadegli abbonamenti di un abbonato.Nella palestra si tengono dei corsi. I corsi sono caratterizzati da un codice del corso, che li identificaunivocamente, un tipo (aerobica, step, kick boxing, ecc.), il giorno della settimana(uno solo) in cuisi tiene il corso, un orario (esempio: 9 AM-10 AM)1, nome del preparatore atletico(codicepreparatore) che tiene il corso, grado di difficoltà del corso (da 1 a 5 dove 1 indica i corsi perprincipianti e 5 i corsi avanzati). Si noti che esiste una sola zona della palestra dove si fanno i corsi,quindi non è possibile effettuare due corsi diversi contemporaneamente. Ogni preparatore atleticonon può dedicare più di tre ore al giorno ai corsi. Il sabato pomeriggio (13 PM in poi) non si fanno icorsi. Gli orari della palestra sono (9 AM-10 PM) tutti i giorni esclusa la domenica in cui la palestraè chiusa.Per quello che riguarda il body building, esistono un insieme di schede predefinite da assegnare agliabbonati che hanno accesso alla sala pesi. Tali schede sono caratterizzate da un codice di schedache le identifica, un grado di difficoltà (analogo a quello dei corsi), il nome del preparatoreatletico(codice preparatore) che ha creato la scheda, se la scheda è adatta solo agli uomini, solo alledonne o ad entrambi, il tipo della scheda (circuito aerobico, potenziamento, tonificazione, ecc.), iltempo medio stimato per effettuare la scheda (unora, due ore, ecc.), per quanto tempo deve esserefatta la scheda (una settimana, un mese, due settimane, ecc.)(in settimane), quante volte allasettimana deve essere fatta la scheda. Ad ogni scheda è associato un certo numero di esercizi. Ogniesercizio è caratterizzato dal nome della macchina su cui fare lesercizio e la descrizionedellesercizio stesso. Si vuole inoltre tenere traccia del numero di ripetizioni per ogni serie e delnumero di serie che devono essere effettuate per un dato esercizio relativamente ad una scheda.Quando una persona si iscrive alla palestra con accesso alla sala pesi le viene assegnataobbligatoriamente una scheda. Si osservi che le schede hanno dei vincoli sul sesso della persona chesvolge la scheda. Si vogliono tenere informazioni relative alla data in cui tale scheda è stataassegnata, la data in cui si presume di cambiare scheda e il preparatore atletico(codice preparatore)che la assegna, che può essere diverso da quello che ha creato la scheda. Una volta raggiunta la datain cui si presume di cambiare scheda il preparatore atletico convoca labbonato per effettuare uneventuale cambio di scheda o confermare quella attualmente assegnata. È possibile cambiare lascheda attualmente assegnata solo con una di 1 grado di difficoltà più alto di quella in corso, conuna minore o con una di pari grado. Si può eventualmente confermare quella attualmente in uso. Vaconservata nella base di dati la storia delle schede assegnate ad una persona fino a quando talepersona è iscritta alla palestra.Si vogliono gestire, in modo consistente, attraverso la base di dati le entrate delle persone nellapalestra. Per ogni entrata si memorizza la data, lora(es :10.30 o 22.30) di entrata e di uscita. Nelcaso in cui una persona entri per frequentare una o più ore di corsi si vuole memorizzare quali corsila persona ha seguito. Gli utenti occasionali dopo cinque entrate hanno diritto ad unentrata gratis.Per gli abbonati le entrate sono vincolate al tipo di abbonamento che una persona possiede. Alladata di scadenza di un abbonamento si vogliono cancellare le entrate relative a quellabbonamento.
  4. 4. 1.2 Assunzioni • Non è possibile associarsi ad un ente quando è già in corso l’abbonamento • Un tupla della tabella utente deve necessariamente partecipare o alla tabella cliente o alla tabella dipendente • I clienti occasionali non possiedono una tessera • Lo username corrisponderà all’email inserita durane l’iscrizione sia per i clienti che per i dipendenti della palestra • Non è necessario che un cliente effettui un’entrata • Non tutti gli abbonamenti devono essere necessariamente associati ad un ente • Una tessera può rimanere in archivio anche con l’abbonamento scaduto • Non esistono distinzioni tra le entrate dei clienti • La data di scadenza di un Abbonamento viene calcolata come somma tra la data in cui l’abbonamento è stipulato e l’intervallo di giorni di validità di esso; • L’iscrizione di un cliente alla palestra non può avvenire autonomamente, ma solo tramite u dipendente • Un cliente abbonato può iscriversi ad un corso tramite l’applicativo php • Una Scheda può non contenere esercizi • Un Dipendente può essere sia preparatore atletico che no ma ha accesso a tutte le funzioni dell’applicativo • Un esercizio può non far parte di alcuna scheda • Un Dipendente potrebbe non tenere alcun Corso, o non aver creato/assegnato alcuna Scheda • In base all’abbonamento sottoscritto dal cliente, egli avrà accesso alla sala pesi e/o ai corsi • Un Cliente non può effettuare più di una Entrata alla stessa ora nella stessa data • Si suppone che l’ora di uscita sia successiva all’ora di entrata (supponiamo un entrata con badge)
  5. 5. 2. Progettazione Concettuale2.1 Dizionario dei datiLegenda:_____ = entità_____ = associazioni_____ = attributiAlla palestra hanno accesso due tipi diversi di persone: gli abbonati e gli utenti occasionali. Gliabbonati sono titolari di un abbonamento alla palestra, mentre gli utenti occasionali accedono allapalestra tramite il pagamento di unentrata a prezzo fisso(in Euro) e non sono titolari di nessun tipodi abbonamento.Per ogni persona che ha accesso alla palestra si vogliono memorizzare le seguenti informazioni:nome, cognome, codice fiscale, indirizzo(via, n civ, città), numero di telefono(casa o cellulare), datadi nascita, luogo di nascita ed eventuali note relative al cliente considerato. Gli abbonati allapalestra hanno una tessera identificata univocamente da un codice di tessera.Gli abbonati si suddividono in due categorie: studenti e lavoratori. Gli studenti hanno uno scontodel 20% sul costo di tutti i tipi di abbonamento, mentre i lavoratori di enti convenzionati con lapalestra hanno uno sconto variabile a seconda dellente di appartenenza. Si noti che tutti i lavoratoriappartenenti allo stesso ente hanno lo stesso sconto su tutti i tipi di abbonamento.Ogni abbonato è titolare di un certo tipo di abbonamento. Ogni tipo di abbonamento è identificatoda un codice e dà diritto a frequentare solo i corsi o solo la sala pesi o entrambi. Inoltre, ogniabbonamento ha una durata (che varia fra un anno, sei mesi, tre mesi, un mese)(in mesi), uncosto(in Euro), un campo per memorizzare eventuali note relative allabbonamento e un campobonus in cui si memorizza un eventuale bonus a cui labbonamento dà diritto (lampade solarigratuite, buoni sconto presso negozi di articoli sportivi, ecc.).Quando una persona si abbona alla palestra si vogliono memorizzare informazioni relative alla datadi inizio e di scadenza dellabbonamento. Queste informazioni devono essere coerenti con quellerelative al tipo di abbonamento scelto. Laccesso di un abbonato alla palestra è concesso solo edunicamente entro tali date. Un abbonato può iscriversi alla palestra senza portare il certificatomedico. Ha tempo un mese a decorrere dalla data di iscrizione per portare il certificato medico.Dopo un mese non viene più ammesso alla palestra se ancora senza certificato medico.
  6. 6. Quando una persona rinnova labbonamento le informazioni relative al precedente abbonamentosono cancellate dalla base di dati. Non si è quindi interessati ad informazioni relative alla storiadegli abbonamenti di un abbonato.Nella palestra si tengono dei corsi. I corsi sono caratterizzati da un codice del corso, che li identificaunivocamente, un tipo (aerobica, step, kick boxing, ecc.), il giorno della settimana(uno solo) in cuisi tiene il corso, un orario (esempio: 9 AM-10 AM)1, nome del preparatore atletico(codicepreparatore) che tiene il corso, grado di difficoltà del corso (da 1 a 5 dove 1 indica i corsi perprincipianti e 5 i corsi avanzati). Si noti che esiste una sola zona della palestra dove si fanno i corsi,quindi non è possibile effettuare due corsi diversi contemporaneamente. Ogni preparatore atleticonon può dedicare più di tre ore al giorno ai corsi. Il sabato pomeriggio (13 PM in poi) non si fanno icorsi. Gli orari della palestra sono (9 AM-10 PM) tutti i giorni esclusa la domenica in cui la palestraè chiusa.Per quello che riguarda il body building, esistono un insieme di schede predefinite da assegnare agliabbonati che hanno accesso alla sala pesi. Tali schede sono caratterizzate da un codice di schedache le identifica, un grado di difficoltà (analogo a quello dei corsi), il nome del preparatoreatletico(codice preparatore) che ha creato la scheda, se la scheda è adatta solo agli uomini, solo alledonne o ad entrambi, il tipo della scheda (circuito aerobico, potenziamento, tonificazione, ecc.), iltempo medio stimato per effettuare la scheda (unora, due ore, ecc.), per quanto tempo deve esserefatta la scheda (una settimana, un mese, due settimane, ecc.)(in settimane), quante volte allasettimana deve essere fatta la scheda. Ad ogni scheda è associato un certo numero di esercizi. Ogniesercizio è caratterizzato dal nome della macchina su cui fare lesercizio e la descrizionedellesercizio stesso. Si vuole inoltre tenere traccia del numero di ripetizioni per ogni serie e delnumero di serie che devono essere effettuate per un dato esercizio relativamente ad una scheda.Quando una persona si iscrive alla palestra con accesso alla sala pesi le viene assegnataobbligatoriamente una scheda. Si osservi che le schede hanno dei vincoli sul sesso della persona chesvolge la scheda. Si vogliono tenere informazioni relative alla data in cui tale scheda è stataassegnata, la data in cui si presume di cambiare scheda e il preparatore atletico(codice preparaotr)che la assegna, che può essere diverso da quello che ha creato la scheda. Una volta raggiunta la datain cui si presume di cambiare scheda il preparatore atletico convoca labbonato per effettuare uneventuale cambio di scheda o confermare quella attualmente assegnata. È possibile cambiare lascheda attualmente assegnata solo con una di 1 grado di difficoltà più alto di quella in corso, conuna minore o con una di pari grado. Si può eventualmente confermare quella attualmente in uso. Vaconservata nella base di dati la storia delle schede assegnate ad una persona fino a quando talepersona è iscritta alla palestra.Si vogliono gestire, in modo consistente, attraverso la base di dati le entrate delle persone nellapalestra. Per ogni entrata si memorizza la data, lora(es :10.30 AM) di entrata e di uscita. Nel caso incui una persona entri per frequentare una o più ore di corsi si vuole memorizzare quali corsi lapersona ha seguito. Gli utenti occasionali dopo cinque entrate hanno diritto ad unentrata gratis. Pergli abbonati le entrate sono vincolate al tipo di abbonamento che una persona possiede. Alla data discadenza di un abbonamento si vogliono cancellare le entrate relative a quellabbonamento.
  7. 7. Tabella EntitàNome Descrizione Attributi Identificatori • nome • cognome • telefono • datanascita • luogonascita Qualsiasi persona • noteCliente • codf iscritta alla palestra • codf • Indirizzo come via, nciv, cap, città e provincia • Sesso • Email Un utente nonAbbonato occasionale della • codf palestra Un utente non abbonato • codfOccasionale • entrate alla palestra • codd • nome Tutte le persone che • cognomeDipendente • codd lavorano nella palestra • email • telefono • stipendio Tutto i dipendenti dellaAltro • codd palestra non preparatori Una categoria diPreparatore • livelloqualifica • codd dipendente • codt Ciò che possiede un • dataiscrTessera • codt utente della palestra • datascad • hacertificato • oraentrata Entità debole che ha Ciò che effettua un • data come identificatoreEntrata cliente quando entra in palestra • orauscita esterno misto codf, ora • costo entrata, data
  8. 8. Tabella EntitàNome Descrizione Attributi Identificatori • codc • tipo Attività che si svolge • difficoltaCorso • codc nella palestra • ora • durata • giorno • codabb • durataabb “Permesso speciale” • costoabb • codaAbbonamento che possiede un abbonato alla palestra • bonusabb • noteabb • tipoabb • cods • tipo • difficolta “Guida” • ngiorniasettScheda • cods all’allenamento • sesso • tempoesecuzion • ngiornitotali • username Utente dell’applicativoUtente • pass • username php • tipo Tipicamente una ditta per cui un cliente lavora • nomepubblicoEnte • nomepubblico (permette di ottenere • sconto uno sconto) • nomees Ciò che è contenuto inEsercizio • macchina • nomees una scheda • descrizione
  9. 9. Gerarchie di generalizzazioneEntità Padre Entità Figlie Tipologia AbbonatoCliente Relazione di sottoinsieme Occasionale PreparatoreDipendente Relazione di sottoinsieme AltroTabellaAssociazioniNome Descrizione Attributi Entità collegate Una scheda contiene un • nserierelcontienees Scheda, Esercizio esercizio • nripetizioni In un entrata si partecipa arelvuoleeseguire Corso, Entrata un corso • datainiziosch eda Preparatore,reliscrittoaipesi Storico schede • datafinesche Scheda, Tessera da • statoscheda In una tessera si è iscritti areliscrittocorso Tessera, Corso un corso Un preparatore assegna una Preparatore,relassegna scheda Scheda Un preparatore tiene unreltiene Preparatore, Corso corso Una tessera può avere unrelhaconvenzionato Tessera, Ente ente convenzionatorelhatessera Un abbonato ha una tessera Abbonato, Tessera Un cliente è un utente dellarelutentecliente Cliente, Utente palestra
  10. 10. TabellaAssociazioniNome Descrizione Attributi Entità collegate Una tessera può contenere Tessera,relcontieneabb un abbonamento Abbonamento Un dipendente è unreldipendenteutente “utente” particolare della Dipendente, Utente palestra2.4 Schema ER non ristrutturato
  11. 11. Nome relazioniR1=releffettuaR2=relutenteclienteR3=reldipendenteutenteR4= relcontieneesR5=relassegnaR6=reltieneR7= relvuoleesguireR8=relhaconvenzionatoR9=relcontieneabbR10= reliscrittoaipesiR11= reliscrittocorsoR12=relhatessera
  12. 12. 2.3 Vincoli di dominioV1 la durata dell’abbonamento è 1 mese, 3 mesi, 6 mesi o Check un anno il tipo di abbonamento può assumere i seguenti valori:V2 “pesi”, “corsi” o “entrambi” Check il codice fiscale deve essere di 16 caratteri CheckV3 il sesso dei client inseriti deve essere “m”(maschio) oV4 Check “f”(femmina) la difficoltà di un corso deve essere compresa tra “1” eV5 Check “5” Una scheda può essere in tre stati:“corrente”(in uso),V6 “abbandonata” o “conclusa” Check la difficoltà di una scheda deve essere compresa tra “1”V7 Check e “5” L’attributo sesso nella tabella scheda può assumere iV8 Check seguenti valori: “m”, “f” o “e”(entrambi) L’attributo “tipo” nella tabella “utente” può assumereV9 solamente i seguenti valori: “abbonato”, occasionale” o Check “dipendente”
  13. 13. Il sabato la palestra chiude alle 13 (controllo sui corsi TriggerV10 che non superino l’orario di chiusura)V11 Due corsi non possono sovrapporsi TriggerV12 Un preparatore non può tenere più di tre ore di corsi al Trigger giorno Un abbonato no può entrare in palestra se il suo TriggerV13 abbonamento è scaduto2.4 Schema ER ristrutturato
  14. 14. R1=releffettuaR2=relutenteclienteR3=reldipendenteutenteR4= relcontieneesR5=relassegnaR6=reltieneR7= relvuoleesguireR8=relhaconvenzionatoR9=relcontieneabbR10= reliscrittoaipesiR11= reliscrittocorsoR12=relhatessera
  15. 15. 3. Progettazione logicaABBONAMENTO (codabb, tipoabbnn, durataabbnn, costoabbnn, bonusabb, noteabb)CLIENTE (codf, nomenn, cognomenn, sessonn, indirizzonn, telefononn, emailunn,datanascitann, luogonascitann, note, entrate, abbonato)CORSO (codc, giornonn, tiponn, difficoltànn, preparatore(FK→DIPENDENTE), orann, duratann)DIPENDENTE (codd, nomenn, cognomenn, ruolonn, telefononn, emailunn,preparatorenn, stipendio)ENTE (nome pubblico, scontonn)ENTRATA (codf(FK→CLIENTE), data, oraentrata, orauscita, costo)ESERCIZIO (nomees, descrizionenn, macchinann)RELCONTIENEES (cods(FK→SCHEDA), nomees(FK→ESERCIZIO), nserie, nripetizioni)RELISCRITTOAIPESI (codt (FK→TESSERA), cods (FK→SCHEDA), datainizioscheda,codprep(FK→DIPENDENTE), datafinescheda, statoschedann)RELISCRITTOCORSO (codc(FK→CORSO), codt(FK→TESSERA))RELVUOLEESEGUIRE (data(FK→ENTRATA), ora entrata(FK→ENTRATA), codc(FK→CORSO),codf(FK→ENTRATA))SCHEDA (cods, sessonn, tiponn, ngiornitotalinn, tempoesecuzionenn, ngiorniasettnn,preparatore(FK→DIPENDENTE), difficoltann)TESSERA (codt, codf(FK→CLIENTE), hacertificatonn, ente(FK→ENTE), dataiscr, datascad,codabb(FK→ABBONAMENTO))UTENTE (username, passnn, tipo)
  16. 16. 4. Comandi SQL5.1 Implementazione in sql dei vincoli CHECKTabella “abbonamento”check_durataabb CHECK (durataabb = 30 OR durataabb = 90 OR durataabb = 180OR durataabb = 365);controlla che la durata dell’abbonamento sia 1 mese, 3 mesi, 6 mesi o un annocheck_tipoabb CHECK (tipoabb::text = pesi::text OR tipoabb::text = corsi::text ORtipoabb::text = entrambi::text);controlla che il tipo di abbonamento sia “pesi”, “corsi” o “entrambi”Tabella “cliente”check_codf CHECK (char_length(codf::text) = 16);controlla che il codice fiscale dei clienti sia di 16 carattericheck_sesso CHECK (sesso = m::bpchar OR sesso = f::bpchar);controlla che il sesso dei client inseriti sia “m”(maschio) o “f”(femmina)Tabella “corso”check_difficolta CHECK (difficolta >= 1 AND difficolta <= 5);controlla che la difficoltà di un corso sia compresa tra “1” e “5”Tabella “dipendente”check_codd CHECK (char_length(codd::text) = 16);controlla che il codice fiscale dei dipendenti abbia 16 caratteriTabella “reliscrittoaipesi”reliscrittoaipesi_statoscheda_check CHECK (statoscheda::text = ANY(ARRAY[corrente::character varying, abbandonata::character varying,conclusa::character varying]::text[]));controlla in che “stato” è una scheda: se è “corrente”(in uso), “abbandonata” o “conclusa”
  17. 17. Tabella “scheda”check_difficolta CHECK (difficolta >= 1 AND difficolta <= 5);controlla che la difficoltà di una scheda sia compresa tra “1” e “5”check_sesso CHECK (sesso = m::bpchar OR sesso = f::bpchar OR sesso =e::bpchar);controlla che il valore impostato nell’attributo “sesso” nella tabella scheda sia “m”(maschi),“f”(femmine) o “e”(entrambi)Tabella “utente”tipo_username CHECK (tipo::bpchar = abbonato::bpchar OR tipo::bpchar =occasionale::bpchar OR tipo::bpchar = dipendente::bpchar);controlla che l’utente della palestra sia di tipo “abbonato”, occasionale” o “dipendente”5.2 TRIGGER in sql (implementazione dei vincoli)I Trigger sono delle procedure che vengono eseguite in maniera automatica incoincidenza di un determinato evento, come ad esempio la cancellazione di un recorddi una tabella.Riproponiamo in maniera più ordinata e unita i trigger presenti nella base di dati insieme allefunzioni a cui fanno riferimento:Tabella “corso”Trigger:CREATE TRIGGER trig_checkcorsisab BEFORE INSERT OR UPDATE ON corso FOR EACH ROW EXECUTE PROCEDURE func_checkcorsisab();
  18. 18. Funzione:CREATE OR REPLACE FUNCTION func_checkcorsisab() RETURNS trigger AS$BODY$DECLAREBEGIN IF (NEW.giorno = sabato AND (NEW.ora+NEW.durata)>13:00) THEN RAISE EXCEPTION La palestra al sabato chiude alle 13, i dati inseritinon rientrano nelle ore consentite; ELSE RETURN NEW; END IF;END;$BODY$ LANGUAGE plpgsql VOLATILE COST 100;ALTER FUNCTION func_checkcorsisab() OWNER TO postgres;Questo trigger si attiva prima dell’inserimento o dell’aggiornamento di un corso e attiva lafunzione che controlla che, se si inserisce un corso la cui durata supera l’ora di chiusura dellapalestra il sabato(ora in cui si vuole inserire il corso + durata del corso), ritorna l’errore:“La palestra al sabato chiude alle 13, i dati inseriti non rientrano nelle oreconsentite”
  19. 19. Trigger:CREATE TRIGGER trig_checkcorsisovrapposti BEFORE INSERT OR UPDATE ON corso FOR EACH ROW EXECUTE PROCEDURE funz_checkcorsisovrapposti();Funzione:CREATE OR REPLACE FUNCTION funz_checkcorsisovrapposti() RETURNS trigger AS$BODY$DECLARE tempinterval interval:=00:02:00;BEGIN IF EXISTS(SELECT * FROM corso c WHERE giorno = NEW.giorno ANDc.codc != NEW.codc AND (NEW.ora BETWEEN c.ora AND (c.ora+(c.durata-tempinterval)))) THEN RAISE EXCEPTION Errore, con questi valori dei corsi sisovrappongono; END IF; IF EXISTS(SELECT * FROM corso c WHERE giorno = NEW.giorno ANDc.codc != NEW.codc AND (NEW.ora+NEW.durata) BETWEEN c.ora AND((c.ora+c.durata)-tempinterval)) THEN RAISE EXCEPTION Errore, con questi valori dei corsi sisovrappongono; END IF;
  20. 20. RETURN NEW;END;$BODY$ LANGUAGE plpgsql VOLATILE COST 100;ALTER FUNCTION funz_checkcorsisovrapposti() OWNER TO postgres;Questo trigger si attiva prima dell’inserimento o dell’aggiornamento di un corso e attiva lafunzione che controlla che due corsi non si sovrappongano (controlla che l’ora di un corsoinserito o aggiornato non stia tra l’ora d’inizio un altro corso e la somma tra l’ora di inizio diun altro corso e la sua durata; inoltre controlla che,sommando l’ora di inizio di un corsoinserito o aggiornato con la sua durata, esso non vada a sovrapporsi alle ore di un altro corso)Trigger:CREATE TRIGGER trig_massimotreore BEFORE INSERT OR UPDATE ON corso FOR EACH ROW EXECUTE PROCEDURE func_massimotreore();Funzione:CREATE OR REPLACE FUNCTION func_massimotreore() RETURNS trigger AS$BODY$DECLARE totaleorecorso interval;BEGIN
  21. 21. SELECT INTO totaleorecorso SUM(durata) FROM corso WHERE preparatore=NEW.preparatore AND giorno=NEW.giorno AND codc!=NEW.codc GROUP BY(preparatore); IF NOT FOUND THEN totaleorecorso:=00:00:00; END IF; IF (totaleorecorso + NEW.durata) >03:00:00 THEN RAISE EXCEPTION non più di tre ore di corso al giorno, per ognipreparatore; ELSE RETURN NEW; END IF;END;$BODY$ LANGUAGE plpgsql VOLATILE COST 100;ALTER FUNCTION func_massimotreore() OWNER TO postgres;Questo trigger si attiva prima dell’inserimento o dell’aggiornamento di un corso e attiva lafunzione che verifica che per ogni preparatore, in uno stesso giorno, non siano associati più ditre ore di corsi; se si verifica tale condizione si avrà il messaggio:“non più di tre ore di corso al giorno, per ogni preparatore”
  22. 22. Tabella “entrata”Trigger:CREATE TRIGGER trig_abbonamentoscadutoonentrata BEFORE INSERT ON entrata FOR EACH ROW EXECUTE PROCEDURE func_abbonamentoscadutoonentrata();Funzione:CREATE OR REPLACE FUNCTION func_abbonamentoscadutoonentrata() RETURNS trigger AS$BODY$DECLARE eabbonato boolean;BEGIN SELECT INTO eabbonato abbonato FROM tessera t,cliente c WHERE t.codf=NEW.codf AND c.codf = t.codf; IF (eabbonato=TRUE) THEN PERFORM codt FROM tessera t
  23. 23. WHERE t.codf=NEW.codf AND t.codabb IS NOT NULL; IF NOT FOUND THEN RAISE EXCEPTION Abbonamento scaduto per questo utente.; ELSE RETURN NEW; END IF; ELSE RETURN NEW; END IF;END;$BODY$ LANGUAGE plpgsql VOLATILE COST 100;ALTER FUNCTION func_abbonamentoscadutoonentrata() OWNER TO postgres;questo trigger si attiva prima dell’inserimento di una tupla nella tabella “entrata”; attiva lafunzione che controlla all’entrata della palestra che l’abbonamento di un utente non siascaduto (controlla che il “codabb” non sia nullo)
  24. 24. Trigger:CREATE TRIGGER trig_checkinsertonentrata AFTER INSERT OR UPDATE ON entrata FOR EACH ROW EXECUTE PROCEDURE func_checkinsertonentrata();Funzione:CREATE OR REPLACE FUNCTION func_checkinsertonentrata() RETURNS trigger AS$BODY$DECLARE indexgiorno integer; engiorno character varying;BEGIN IF NEW.orauscita IS NOT NULL THEN SELECT INTO indexgiorno date_part(dow,NEW.data); IF indexgiorno=0 THEN engiorno=domenica; ELSEIF indexgiorno=1 THEN engiorno=lunedì; ELSEIF indexgiorno=2 THEN engiorno=martedì; ELSEIF indexgiorno=3 THEN engiorno=mercoledì; ELSEIF indexgiorno=4 THEN engiorno=giovedì;
  25. 25. ELSEIF indexgiorno=5 THEN engiorno=venerdì; ELSEIF indexgiorno=6 THEN engiorno=sabato; END IF; INSERT INTO relvuoleseguire(data,oraentrata,codf,codc) SELECT data, oraentrata,codf,codc as codcorso FROM corso c NATURAL JOIN reliscrittocorso ic NATURAL JOINentrata e NATURAL JOIN tessera t WHERE ( NEW.oraentrata<(c.ora+c.durata) AND NEW.orauscita>c.ora AND lower(c.giorno)=engiorno AND t.codf = NEW.codf AND NOT EXISTS(SELECT * FROMrelvuoleseguire rl WHERE rl.data=e.data AND rl.codf = t.codf AND rl.codc = c.codc)); END IF; RETURN NEW;END;$BODY$ LANGUAGE plpgsql VOLATILE COST 100;ALTER FUNCTION func_checkinsertonentrata() OWNER TO postgres;questo trigger si attiva prima dell’inserimento o dell’aggiornamento di una tupla nella tabella“entrata”; attiva la funzione che inserisce nella relazione “relvuoleseguire” i corsi che unutente ha seguito
  26. 26. Trigger:CREATE TRIGGER trig_ingressoconcorsi BEFORE INSERT OR UPDATE ON entrata FOR EACH ROW EXECUTE PROCEDURE func_ingressoconcorsi();Funzione:CREATE OR REPLACE FUNCTION func_ingressoconcorsi() RETURNS trigger AS$BODY$DECLARE tipoabb character varying; ngiorno int; gentrata character varying;BEGIN SELECT INTO tipoabb ab.tipoabb FROM abbonamento ab NATURAL JOIN tessera t WHERE t.codf=NEW.codf; IF tipoabb=corsi THEN SELECT INTO ngiorno date_part(dow,NEW.data); IF ngiorno=0 THEN gentrata=domenica;
  27. 27. ELSEIF ngiorno=1 THEN gentrata=lunedì; ELSEIF ngiorno=2 THEN gentrata=martedì; ELSEIF ngiorno=3 THEN gentrata=mercoledì; ELSEIF ngiorno=4 THEN gentrata=giovedì; ELSEIF ngiorno=5 THEN gentrata=venerdì; ELSEIF ngiorno=6 THEN gentrata=sabato; END IF; if(true) THEN PERFORM c.codc FROM corso c NATURAL JOIN reliscrittocorso ic NATURALJOIN tessera t WHERE c.giorno=gentrata AND ic.codc=c.codc ANDic.codt=t.codt AND t.codf=NEW.codf AND (NEW.oraentrata BETWEEN (c.ora-00:05:00) AND (c.ora+c.durata)); if not found then RAISE EXCEPTION Nessun corso a cui il cliente èiscritto a questo orario.; end if; return new; END IF; ELSE RETURN NEW; END IF;END;$BODY$ LANGUAGE plpgsql VOLATILE COST 100;ALTER FUNCTION func_ingressoconcorsi() OWNER TO postgres;questo trigger si attiva prima dell’inserimento o dell’aggiornamento di una tupla nella tabella“entrata”; attiva la funzione che se un cliente ha l’abbonamento solo corsi abbiaeffettivamente un corso.
  28. 28. Tabella “tessera”Trigger:CREATE TRIGGER trig_deleteonentrate AFTER UPDATE ON tessera FOR EACH ROW EXECUTE PROCEDURE func_deleteonentrate();Funzione:CREATE OR REPLACE FUNCTION func_deleteonentrate() RETURNS trigger AS$BODY$DECLARE tesseradel character varying;BEGIN IF(dataiscr IS NULL AND datascad IS NULL AND codabb IS NULL) THEN SELECT INTO tesseradel t.codt FROM cliente c NATURAL JOIN tessera t WHERE t.codt=OLD.codt; DELETE FROM entrata WHERE tessera=tesseradel; RETURN OLD; END IF;
  29. 29. END;$BODY$ LANGUAGE plpgsql VOLATILE COST 100;ALTER FUNCTION func_deleteonentrate() OWNER TO postgres;Questo trigger si attiva dopo l’aggiornamento di una tessera; attiva la funzione che cancella leentrate di un cliente quando si cancella la tessera dello stessoQuery richiesteDato un abbonato, restituire i dati relativi all’abbonamento attualmente in suo pos-sesso, indicando il prezzo dell’abbonamento e l’importo effettivamente pagatodall’abbonato.Questa query è visibile nell’applicativo php nel pannello di ogni utente abbonatoDato un abbonato, restituire i suoi ingressi alla palestra nellultimo mese.Questa query è visibile nelle statistiche di ogni utente abbonatoDato un abbonato con accesso alla sala pesi, restituire la storia delle schede a luiassegnate.Questa query è visibile nelle statistiche di ogni utente abbonatoRestituire tutti i corsi di un determinato tipo.Questa query è visibile nelle statistiche generali del sitoDato un tipo di corso restituire il numero di ore settimanali allocate per quel corso.Questa query è visibile nelle statistiche generali del sitoRestituire il codice di corso mediamente più frequentato.Questa query è visibile nelle statistiche generali del sito
  30. 30. Data una settimana restituire il corso che ha registrato il massimo numero dipresenze. Restituire, inoltre, tale numero di presenze.Questa query è visibile nelle statistiche generali del sitoRestituire le schede associate più frequentemente alle donne comprese fra i 25 e i 30anni.Questa query è visibile nelle statistiche generali del sitoRestituire per ogni tipo di abbonamento la percentuale di lavoratori che lo possiede.Questa query è visibile nelle statistiche generali del sitoRestituire le percentuali di abbonati alla palestra suddivisi in fasce di età (21-25, 26-30, ecc.), rispetto al totale di abbonati.Questa query è visibile nelle statistiche generali del sito

×