Informatica generale Un’associazione “Banca del Tempo” vuole realizzare una base di dati per registrare e gestire le attività dell’associazione. La “Banca del Tempo” (BdT) indica uno di quei sistemi organizzati di persone che si associano per scambiare servizi e/o saperi, attuando un aiuto reciproco. Attraverso la BdT le persone mettono a disposizione il proprio tempo per determinate prestazioni (effettuare una piccola riparazione in casa, preparare una torta, conversare in lingua straniera, ecc.) aspettando di ricevere prestazioni da altri. Non circola denaro, tutte le prestazioni sono valutate in tempo, anche le attività di segreteria. Le prestazioni sono suddivise in categorie (lavori manuali, tecnologie, servizi di trasporto, bambini, attività sportive, ecc.). Chi dà un’ora del suo tempo a qualunque socio, riceve un’ora di tempo da chiunque faccia parte della BdT. La base di dati dovrà mantenere le informazioni relative ad ogni prestazione (quale prestazione, da chi è stata erogata, quale socio ha ricevuto quella prestazione, per quante ore e in quale data) per consentire anche interrogazioni di tipo statistico. Il territorio di riferimento della BdT è limitato (un quartiere in una grande città o un piccolo comune) ed è suddiviso in zone; la base di dati dovrà contenere la mappa del territorio e delle singole zone, in forma grafica. Si consideri la realtà di riferimento sopra descritta e si realizzino: 1. la progettazione concettuale della realtà indicata attraverso la produzione di uno schema (ad esempio ER, Entity-Relationship) con gli attributi di ogni entità, il tipo di ogni relazione e i suoi eventuali attributi; 2. una traduzione dello schema concettuale realizzato in uno schema logico (ad esempio secondo uno schema relazionale); 3. le seguenti interrogazioni espresse in algebra relazionale e/o in linguaggio SQL: a. produrre l’elenco dei soci (con cognome, nome e telefono) che hanno un “debito” nella BdT (coloro che hanno usufruito di ore di prestazioni in numero superiore a quelle erogate); b. data una richiesta di prestazione, visualizzare la porzione di mappa del territorio nel quale si trova il socio richiedente e l’elenco di tutti i soci che si trovano in quella zona in grado di erogare quella prestazione, visualizzandone il nome, cognome, indirizzo e numero di telefono; c. visualizzare tutti i soci che fanno parte della segreteria e che offrono anche altri tipi di prestazione; d. produrre un elenco delle prestazioni ordinato in modo decrescente secondo il numero di ore erogate per ciascuna prestazione. 4. (Facoltativo) Sviluppare il problema posto scegliendo una delle due seguenti proposte descrivendone le problematiche e le soluzioni tecniche adottabili: 4.1 l’associazione BdT vuole realizzare un sito Web per rendere pubbliche le sue attività consentendo anche di effettuare on-line le interrogazioni della base di dati previste nel punto 3; 4.2 l’associazione BdT vuole realizzare un sito Web attraverso il quale possa raccogliere l’adesione on-line di altri associati, attraverso il riempimento di un modulo da inviare via Internet all’associazione. -------------------Soluzione La situazione prevista dal testo conduce facilmente alla determinazione delle seguenti entità: 1. ZONA caratterizzata da un codice e una mappa grafica 2. SOCIO caratterizzata da un codice, dati anagrafici, zona di appartenenza, elenco dei servizi offerti, ore complessive (valore positivo per crediti e negativo per debiti) 3. TIPO PRESTAZIONE caratterizzata da una sigla di riconoscimento, una descrizione e la categoria di appartenenza 4. PRESTAZIONE, caratterizzata da un numero progressivo di registrazione, il codice del socio che usufruisce della prestazione, il codice del socio che fornisce la prestazione, la durata in ore e la data. Il modello E/R che descrive le relazioni tra le entità assume la seguente forma: abita ZONA 1 offre n n SOCIO 1 m TIPO PRESTAZIONE 1 1 appartiene fornisce fruisce n n n PRESTAZIONE Dato che la maggior parte dei DBMS di tipo relazionale non offre la possibilità di implementare relazioni n a m e campi ripetuti, abbiamo introdotto una tabella intermedia, denominata Offerta, che lega le tabelle PRESTAZIONE e SOCIO. Inoltre, per semplificare la costruzione delle query richieste abbiamo aggiunto alla tabella SOCIO un campo booleano, che indica l’appartenenza alla segreteria. La trasposizione delle altre entità nelle relative tabelle è del tutto banale, in quanto la struttura E/R prevede già la presenza di chiavi esterne come attributi. Analisi delle queries a) Un valore negativo nel campo Ore complessive della tabella SOCIO indicherà debito. Nel database ogni volta che si fruisce di una prestazione la sua durata viene sottratta al valore del campo, mentre ogni volta che si fornisce la prestazione, la durata verrà sommata al valore del campo. SELECT socio.cognome, socio.nome, socio.telefono, socio.indirizzo, socio.[ore complessive] FROM socio WHERE (((socio.[ore complessive])<0)); b) Il metodo più semplice per ottenere la schermata richiesta è quello di predisporre due sottomaschere affiancate, associate alle query, che forniscono, rispettivamente, il grafico e i dati dei soci. Vista la complessità della richiesta riguardante l’elenco di coloro che offrono il servizio, per non appesantire il codice SQL abbiamo optato per una serie di query in cascata che selezionano, man mano, gli elementi necessari. Si tratta ovviamente di query parametriche che fanno riferimento ai valori inseriti dal richiedente. Query per la visualizzazione del grafico SELECT zona.grafico FROM zona INNER JOIN socio ON zona.[codice zona] = socio.[codice zona] WHERE (((socio.[codice socio])=[codice socio richiedente])); Query per l’individuazione della zona (Zona del richiedente) SELECT socio.[codice socio], socio.[codice zona] FROM socio WHERE (((socio.[codice socio])=[codice del richiedente])); Query per l’individuazione dei soci che offrono la prestazione richiesta (Disponibilità) SELECT socio.[codice socio], tipo.[sigla prestazione], tipo.descrizione FROM tipo INNER JOIN (socio INNER JOIN offerta ON socio.[codice socio] = offerta.[codice socio]) ON tipo.[sigla prestazione] = offerta.[sigla prestazione] WHERE (((tipo.descrizione)=[richiesta])); Query che fornisce i dati richiesti dal tema SELECT [zona del richiedente].[codice zona] AS [zona del richiedente].[codice zona], [disponibilita].[codice socio], [socio].[cognome], [socio].[nome], [socio].[telefono], [socio].[indirizzo], [socio].[codice zona] AS [socio_codice zona] FROM disponibilita INNER JOIN ([zona del richiedente] INNER JOIN socio ON [zona del richiedente].[codice zona]=[socio].[codice zona]) ON [disponibilita].[codice socio]=[socio].[codice socio]; b) Considerando tutti i servizi di segreteria come prestazione specifica, la query di selezione dovrà estrarre l’elenco dei soci aventi: il campo segreteria settato a “True” - il codice che compare più di una volta nella tabella Offerta (una per la segreteria e una o più per le altre prestazioni offerte). SELECT DISTINCTROW socio.[codice socio], socio.cognome, socio.nome, socio.segreteria FROM socio INNER JOIN offerta ON socio.[codice socio] = offerta.[codice socio] GROUP BY socio.[codice socio], socio.cognome, socio.nome, socio.segreteria HAVING (((socio.segreteria)=True) AND ((Count(*))>1)); d) Si tratta di una semplice query di aggregazione, con un campo per la somma delle ore. SELECT [prestazione].[sigla prestazione], [tipo].[descrizione], Sum([prestazione].[durata]) AS somma FROM prestazione INNER JOIN tipo ON [tipo].[sigla prestazione]=[prestazione].[sigla prestazione] GROUP BY [prestazione].[sigla prestazione] ORDER BY somma DESC; Parte facoltativa Le richieste del punto 4 risultano generiche. Ci limiteremo a considerazioni di carattere generale. Per entrambe le situazioni l’Associazione dovrà dotarsi di un dominio. Potrà scegliere la soluzione in “hosting” presso un provider ufficiale, con il vantaggio di delegare la gestione della sicurezza, oppure una soluzione “proprietaria”, che richiede un server (almeno uno), un indirizzo IP statico e connessioni adeguate al volume di traffico previsto. Il tutto sotto il controllo di adeguati dispositivi di sicurezza. Considerando nello specifico la richiesta 4.1 si arriva alla conclusione che bisogna consentire agli utenti, provvisti di un adeguato codice di accesso, la sola interrogazione del database. Questa operazione è gestibile con un link dinamico ad un “oggetto database”. Con queste premesse rimane da controllare la correttezza formale e la congruenza delle richieste dell’utente. A tal fine sarebbe comodo fissare le scelte possibili, associandole a pulsanti o zone sensibili delle varie pagine, collegati ai dati richiesti. Sono necessari per questa attività degli script di controllo sulla prestazione richiesta. La zona e le altre informazioni possono essere ricavate dal codice di accesso dell’associato. Nel caso 4.2 la situazione proposta è più complessa in quanto richiede form di input da compilare a cura dell’associato. Ovviamente i controlli di correttezza e congruenza risultano più complessi. Il passo successivo potrebbe essere lo sviluppo di un modulo software finalizzato all’aggiornamento dinamico del database con le informazioni contenute nei moduli. Considerazioni più specifiche sulla sicurezza e sull’ambiente (sistema operativo, server web, ...) sembrano andare oltre le richieste del testo e comunque richiederebbero approfondimenti più puntuali. (soluzione a cura di: prof. Domenico Capezzuto, docente di Sistemi presso Itis Lagrange di Milano prof. Antonio Garavaglia, docente di Informatica presso Itis Lagrange di Milano prof. Umberto Torelli, docente di Elettronica presso Itis Feltrinelli Milano)