3 parte prima Progettazione della base di dati Modellazione dei dati OBIETTIVI DI APPRENDIMENTO In questo capitolo potrai comprendere l’importanza della modellazione dei dati al livello concettuale. Imparerai a utilizzare nella pratica le tecniche per la definizione del modello di dati, individuando entità, attributi e associazioni. Sarai anche in grado di documentare l’analisi di un problema in modo efficace attraverso il modello entità/associazioni. © Istituto Italiano Edizioni Atlas Progettazione concettuale Livelli di modellazione Entità e associazioni Attributi Associazioni tra entità Regole di lettura Documentazione dell’analisi parte prima Progettazione della base di dati capitolo 3 Modellazione dei dati 1 Introduzione Nel precedente capitolo abbiamo descritto le tecniche per raccogliere le richieste degli utenti di un’applicazione informatica. Il passo successivo consiste nello sviluppare la base di dati dell’applicazione. Sviluppo che passa attraverso diverse fasi di progettazione dette progettazione concettuale, organizzazione logica e implementazione fisica. La progettazione concettuale è la sintesi tra la visione degli utenti e la visione dei progettisti dell’applicazione. Deve possedere due caratteristiche antitetiche: da una parte deve essere assolutamente precisa per non lasciare dubbi in merito alla caratteristiche della base di dati che si sta progettando, dall’altro deve essere espressa tramite formalismi sufficientemente semplici da permetterne la lettura e la comprensione anche da parte di utenti non tecnici. Gli utenti devono infatti essere certi che i progettisti abbiano compreso a fondo tutte le loro esigenze. Il modello Entità/Associazioni presenta tali caratteristiche e si concretizza in un documento con rappresentazioni grafiche, come quella in figura, che verranno spiegate nei paragrafi successivi. Fornitore CodFornitore {PK} Nominativo Via Città CAP 1 Fornire DataAcquisto Quantità N Prodotto CodProdotto {PK} Descrizione Prezzo Lo scopo di questo capitolo è di descrivere i concetti e i formalismi utilizzati nella costruzione del modello entità/associazioni. Il modello entità/associazioni, pur essendo di gran lunga il modello più utilizzato nella progettazione concettuale, non ha una rappresentazione standardizzata. Quando si parla di modello entità/associazioni tutti sono concordi nel ritenere che nel modello devono comparire entità, associazioni e attributi, e che cosa si intenda con tali termini: esistono però diversi modi di rappresentarli in un modello. In questo testo sarà utilizzata una forma di rappresentazione grafica basata sull’Unified Modeling Language (UML). L’UML (linguaggio unificato di modellazione), è un linguaggio grafico per visualizzare, definire, specificare e documentare tutte le costruzioni di sistemi software. L’UML è stato approvato da parte del comitato OMG (Object Management Group) ed è un linguaggio di modellazione e specifica molto diffuso per la descrizione di sistemi software object oriented. Nel presentare il modello entità/associazioni indicheremo anche quali sono gli altri formalismi maggiormente diffusi. Occorre osservare che il modello entità/associazioni è da molti indicato con il nome di modello entità/relazioni. Il termine relazione è utilizzato, in tal caso, come sinonimo di associazione, ossia per indicare un collegamento logico tra entità differenti. Ma il termine relazione è importante nell’ambito del modello relazionale dei dati, dove assume un significato completamente diverso. Per evitare ambiguità, in questo testo, viene utilizzato sempre il termine entità/ associazioni per indicare questo tipo di modello. 108 © Istituto Italiano Edizioni Atlas parte prima Progettazione della base di dati capitolo 3 Modellazione dei dati 2 Modellazione dei dati Modellare i dati significa costruire una rappresentazione semplificata della realtà osservata o di un problema aziendale, individuandone gli elementi caratterizzanti e i legami intercorrenti tra essi. La progettazione di un modello di dati avviene a livelli diversi: • il livello concettuale (o esterno) rappresenta la realtà dei dati e le relazioni tra essi attraverso uno schema. • il livello logico rappresenta il modo attraverso il quale i dati sono organizzati negli archivi: descrive quindi la composizione e il formato dei dati nel loro aspetto di struttura logica di dati. Il livello logico viene derivato dal livello concettuale applicando alcune semplici regole di trasformazione. • il livello fisico rappresenta l’effettiva installazione degli archivi su disco: esso indica l’ubicazione dei dati nelle memorie di massa. Il livello fisico è quindi l’implementazione del livello logico sui supporti per la registrazione fisica dei dati e si occupa di oggetti quali: partizioni, puntatori, blocchi fisici, cluster, indici. L’attività di progettazione consente prima di tutto di costruire una rappresentazione astratta della realtà in modo indipendente dalla struttura dei dati. Il modello concettuale viene definito attraverso lo schema dei dati, cioè una rappresentazione sintetica (di solito presentata in forma grafica) degli elementi fondamentali che caratterizzano la realtà osservata. Questa rappresentazione è indipendente da: • i valori che verranno assegnati ai dati; • le applicazioni degli utenti che utilizzano i dati; • le visioni parziali dei dati da parte degli utenti. Il modello concettuale rappresenta un patrimonio importante per le aziende, poiché descrive i dati esistenti in azienda: il suo valore informativo può essere utilizzato sia nel campo informatico sia nell’ambito gestionale e diventa un supporto per i diversi ruoli aziendali. © Istituto Italiano Edizioni Atlas 109 parte prima Progettazione della base di dati capitolo 3 Modellazione dei dati Con il passaggio al modello logico, l’insieme dei dati viene dotato di una struttura che deve facilitare: • la manipolazione o il trattamento dei dati, cioè la possibilità di inserire, modificare e cancellare i dati; • l’interrogazione, cioè la possibilità di ritrovare i dati, richiesti da un’applicazione, in modo semplice e veloce. Queste strutture di dati vengono poi implementate sulle memorie di massa, realizzando in pratica il modello fisico, rappresentato dai file registrati nei blocchi del disco. Riassumendo, a partire dalla realtà considerata, vengono individuati i dati che sono significativi, nel senso che sono caratterizzanti, e viene definito lo schema concettuale rappresentativo della realtà. Le strutture logiche dei dati, derivate dallo schema concettuale, vengono implementate e memorizzate negli archivi su un supporto fisico di registrazione (memorie di massa). Il modello entità/associazioni (in inglese Entity/Relationship), introdotto nel 1976 dal matematico Peter P. Chen, è uno strumento per analizzare le caratteristiche di una realtà in modo indipendente dagli eventi che in essa accadono, cioè per costruire un modello concettuale dei dati indipendente dalle applicazioni. Il risultato di questo lavoro è la definizione di una rappresentazione grafica, detta schema E/R (Entity/Relationship), che mette in evidenza gli aspetti fondamentali del modello concettuale, con i dati caratterizzanti e le associazioni tra essi. Esso diventa uno strumento molto utile nel realizzare la transizione dalla descrizione di un problema allo schema formale degli archivi. Il modello descrive lo schema concettuale di un problema o di una gestione aziendale e non si occupa dell’efficienza delle operazioni di manipolazione e ritrovamento dei dati sugli archivi fisici. Risulta di facile comprensione anche per persone che non si occupano di computer ed è sostenuto da alcuni concetti e regole che lo rendono preciso e rigoroso. Gli elementi di un modello entità/associazioni sono: • entità, • associazioni, • attributi. 3 Entità e associazioni L’entità è un oggetto (concreto o astratto) che ha un significato anche quando viene considerato in modo isolato ed è di interesse per la realtà che si vuole modellare. Esempi di entità sono: una persona, un modello di automobile, un movimento contabile, una prova sostenuta da uno studente. Le entità possono essere classificate secondo un certo criterio di omogeneità definendo il tipo di entità attraverso un nome. 110 © Istituto Italiano Edizioni Atlas parte prima Progettazione della base di dati capitolo 3 Modellazione dei dati Per esempio gli studenti di una scuola sono classificabili nel tipo entità Studente, i diversi modelli di automobile sono classificabili nel tipo entità Automobile. Ciascuno studente rappresenta un’istanza dell’entità Studente. Quindi l’istanza è un esemplare dell’entità. Nella rappresentazione grafica le entità sono identificate con un rettangolo contenente all’interno il nome dell’entità. Persona Automobile Studente L’associazione (in inglese relationship) è un legame che stabilisce un’interazione tra le entità. Nella figura sottostante sono rappresentate le due entità Persona e Automobile con le relative istanze e un insieme di archi per indicare l’associazione di possesso che si viene a stabilire tra le persone e le automobili. L’associazione ha nome Possedere e ha un verso che è specificato tramite le frecce che collegano l’entità Persona con l’entità Automobile. Persona P1 Automobile Possedere A1 P2 A2 P3 A3 Dalla figura si vede che P1 possiede le automobili A1 e A2, P2 non possiede alcuna automobile mentre P3 possiede l’automobile A3. Descriviamo questa situazione in linguaggio naturale con le seguenti frasi: una persona può possedere una o più automobili; un’automobile è posseduta da una sola persona. Possiamo dire che tra l’entità Persona e l’entità Automobile esiste l’associazione Possedere. La rappresentazione grafica convenzionalmente usata per indicare un’associazione è una linea che unisce le due entità interessate; il nome dell’associazione compare sulla linea con il simbolo della punta di una freccia per indicare il senso di lettura della associazione. Nome e verso di lettura dell’associazione Persona Possedere Automobile Di norma i nomi delle entità sono sostantivi mentre i nomi delle associazioni sono verbi, in questo modo si cerca di stabilire una corrispondenza tra rappresentazione delle associazioni e frasi del linguaggio naturale che le descrivono. © Istituto Italiano Edizioni Atlas 111 parte prima Progettazione della base di dati capitolo 3 Modellazione dei dati Tra l’entità Persona e l’entità Automobile esiste l’associazione Possedere; l’associazione tra l’entità Automobile e l’entità Persona può essere descritta mediante la forma passiva del verbo che rappresenta la precedente associazione. Quindi tra l’entità Automobile e l’entità Persona esiste l’associazione EsserePosseduta che non è rappresentata esplicitamente nel grafico. L’esempio mostra la tecnica adottata dal linguaggio UML per rappresentare le associazioni. Il nome dell’associazione rappresenta uno solo dei due versi dell’associazione, quello nel quale la lettura ha senso; il verso è precisato con il simbolo a forma di punta di freccia posto accanto al nome. Conveniamo che il nome del verso non rappresentato sia (nella maggior parte dei casi) lo stesso verbo posto nella forma passiva. Possedere Persona EsserePosseduta Automobile Nome dell’associazione non rappresentata Il modello entità/associazioni è diffuso a livello internazionale con diverse rappresentazioni formali. Un simbolismo differente è il seguente: Persona Possiede Posseduta da Automobile nel quale sono descritti con nomi opportuni entrambi i versi dell’associazione. Il verbo che descrive l’associazione è posto di fianco all’entità di partenza del verso. Un altro simbolismo usato per descrivere un’associazione è dato da una linea che unisce le due entità con l’aggiunta, a metà della linea, di un rombo che contiene la descrizione dell’associazione. Possiede Persona Automobile Le associazioni hanno un grado. Il grado è dato dal numero di entità che partecipano all’associazione. L’associazione tra Automobile e Persona è un’associazione di grado 2, detta associazione binaria ma, naturalmente, esistono associazioni di grado 1, 3 e di grado superiore. Nel seguito si parlerà di associazioni binarie che sono le associazioni più diffuse. Due entità possono essere collegate da più di un’associazione come nel caso delle entità Docente e Classe tra le quali esistono le due associazioni Insegnare e Coordinare. In questo caso nella rappresentazione si possono evidenziare, mediante un nome, i ruoli che le entità giocano nelle due associazioni. Nell’esempio si evidenzia che l’entità Docente si presenta nei ruoli di nome Insegnante e Coordinatore nelle due associazioni. Questo ci permette di affermare che: un insegnante può insegnare in una o più classi; un coordinatore può coordinare una classe. Insegnante Nome dei ruoli nelle due associazioni Docente Coordinatore 112 Insegnare Classe Coordinare © Istituto Italiano Edizioni Atlas parte prima Progettazione della base di dati capitolo 3 Modellazione dei dati LE ASSOCIAZIONI RICORSIVE Ci sono associazioni tra un’entità e se stessa: si consideri per esempio l’entità Persona e l’associazione di maternità (o paternità) che collega una madre con i propri figli (o un padre con i propri figli). In queste associazioni l’entità Persona partecipa con ruoli diversi all’associazione. Le associazioni di questo tipo si dicono associazioni ricorsive. L’associazione in figura è un altro esempio di associazione ricorsiva nella quale l’entità Dipendente partecipa all’associazione Coordinare nel duplice ruolo di Supervisore e di Collaboratore. Coordinare Supervisore Collaboratore Dipendente Utilizzando i nomi dei diversi ruoli che un dipendente assume nell’associazione Coordinare, la realtà descritta in figura può essere espressa in linguaggio naturale con le frasi: un supervisore può coordinare uno o più collaboratori; un collaboratore può essere coordinato da un supervisore. 4 Gli attributi Le proprietà delle entità e delle associazioni sono descritte attraverso gli attributi. Esempi di attributi per l’entità Automobile sono: Modello, Produttore, Cilindrata, Potenza, PrezzoListino. Le caratteristiche di ogni attributo sono il formato, la dimensione e l’opzionalità: • il formato di un attributo indica il tipo di valori che assume; i tre formati di base sono: carattere, numerico, data/ora. • la dimensione indica la quantità massima di caratteri o cifre inseribili. • l’opzionalità indica la possibilità di non essere sempre valorizzato: l’attributo è obbligatorio se deve avere valore non nullo (per esempio il nome di una persona in un’anagrafica), facoltativo se sono accettabili valori nulli (per esempio il titolo di studio di una persona). Il valore nullo, in inglese Null, (da non confondere con la stringa di caratteri blank o con un numero di valore zero) rappresenta un’informazione mancante in quanto inapplicabile (per esempio il numero del certificato elettorale di un/una quindicenne) o sconosciuta (la data effettiva di consegna di una merce ordinata e non ancora arrivata in magazzino). I diversi valori assunti dagli attributi determinano le diverse istanze dell’entità. L’insieme dei possibili valori assunti da un attributo si chiama dominio dell’attributo. I valori appartenenti al dominio sono omogenei tra loro, cioè sono dello stesso tipo. Gli attributi sono elencati nella parte inferiore del rettangolo che rappresenta l’entità, con una linea di demarcazione tra il nome dell’entità e la lista di attributi. La figura rappresenta l’entità Automobile con i relativi attributi. Automobile Modello Produttore Cilindrata Potenza PrezzoListino © Istituto Italiano Edizioni Atlas 113 parte prima Progettazione della base di dati capitolo 3 Modellazione dei dati Le associazioni possono avere attributi. Si consideri per esempio l’associazione di nome Acquistare che associa una persona all’automobile acquistata. L’acquisto avviene in una certa data (DataAcquisto) e a un certo prezzo (PrezzoAcquisto). Il prezzo di acquisto non è un attributo di Automobile (un automobile è caratterizzata da un prezzo di listino, ma potrebbe avere un prezzo di acquisto differente per ogni vettura venduta). Analogamente non è un attributo della persona. Un ragionamento analogo si può fare per l’attributo DataAcquisto. Si può dire che i due attributi sono caratteristici dell’abbinamento tra una persona e l’automobile acquistata, cioè dell’associazione Acquistare tra le entità Persona e Automobile. La rappresentazione UML di questa situazione è la seguente: Nome dell’associazione Persona CodiceFiscale Cognome Nome DataNascita Indirizzo Attributi dell’associazione Acquistare DataAcquisto PrezzoAcquisto Automobile Modello Produttore Cilindrata Potenza PrezzoListino Nella rappresentazione UML gli attributi dell’associazione compaiono nella parte inferiore di un riquadro identico a quello usato per rappresentare le entità, collegato alla linea che rappresenta l’associazione. Il nome dell’associazione è riportato sulla linea che collega le entità; lo spazio, che nel caso delle entità è occupato dal nome, rimane vuoto. Si osservi che la presenza di un’associazione con attributi potrebbe essere indicativa della presenza di un’altra entità oltre a quelle identificate. Per esempio, un progettista di dati potrebbe modellare la precedente situazione per mezzo delle entità Persona, Automobile, Acquisto e di due associazioni che collegano le tre entità: una tra Persona e Acquisto e una tra Acquisto e Automobile. Persona CodiceFiscale {PK} Cognome Nome DataNascita Indirizzo Trattare Acquisto DataAcquisto PrezzoAcquisto Acquistare Automobile Modello {PK} Produttore Cilindrata Potenza PrezzoListino È importante sottolineare che la differente visione del problema non porta a una rappresentazione corretta in un caso ed errata nell’altro. Non solo, come vedremo nel prossimo capitolo, applicando le regole di passaggio dal modello concettuale al modello logico, le due rappresentazioni portano alle stesse strutture di dati. Una regola molto importante richiede di definire solo gli attributi elementari e quindi di non definire gli attributi che si ottengono con le elaborazioni, cioè gli attributi derivati. Il mancato rispetto della regola provoca inefficienza dovuta alle elaborazioni necessarie per aggiornare questo tipo di attributi. Per esempio l’età di una persona è un attributo derivato dall’attributo elementare della data di nascita; il saldo di un conto corrente è derivato dalla somma algebrica degli importi dei movimenti effettuati sul conto. 114 © Istituto Italiano Edizioni Atlas parte prima Progettazione della base di dati capitolo 3 Modellazione dei dati Si indica con il termine chiave o chiave primaria (primary key) un insieme minimale di attributi che permettono di distinguere tra loro le istanze di una stessa entità. Esempi di chiavi sono il codice di un prodotto, la matricola di un dipendente, la chiave composta dal codice studente insieme alla data e al codice della materia per le prove scolastiche. Nel caso delle due entità Persona e Automobile gli attributi CodiceFiscale e Modello sono le chiavi primarie per le entità Persona e Automobile. La chiave primaria di un’entità viene riconosciuta dalla presenza dell’acronimo: {PK} (Primary Key), posto tra parentesi graffe, accanto all’attributo chiave. Nel caso di chiave formata da più attributi l’acronimo {PPK} (Partial Primary Key) è posto accanto a ognuno degli attributi che compongono la chiave. L’uso dei codici come chiave per identificare le istanze di un’entità è ormai abitudine consolidata nei moderni sistemi: ciò è dovuto anche al fatto che in modo sempre più esteso vengono previsti, nell’automazione dei sistemi informativi, strumenti di rilevazione dei dati diversi dalla tastiera (lettori di caratteri, scanner per codici a barre), più veloci e più affidabili nelle operazioni di input. Nelle altre rappresentazioni il simbolo grafico convenzionalmente usato per rappresentare l’attributo è la linea che parte dall’entità e termina con il nome e un piccolo cerchio. Nella descrizione grafica, gli attributi chiave vengono evidenziati sottolineandone il nome oppure colorando il cerchietto dell’attributo. Automobile PrezzoListino Cilindrata Produttore Modello Nel caso del formalismo con il rombo si possono rappresentare gli attributi dell’associazione collegando il simbolo dell’attributo al rombo che rappresenta l’associazione. Persona Acquista DataAcquisto Automobile PrezzoAcquisto ERIA EB W LIBR Nel caso del formalismo che non prevede l’uso del rombo non vi è modo di rappresentare gli attributi di un’associazione e bisogna ricorrere a una nuova entità posta tra quelle collegate dall’associazione, come abbiamo fatto nel caso dell’associazione Acquistare tra Persona e Automobile. Gli schemi entità/associazioni possono non contenere la rappresentazione grafica degli attributi per evitare un appesantimento nella lettura e nell’interpretazione di schemi complessi. In questi casi una prassi altrettanto diffusa è quella di rappresentare solo l’attributo chiave delle entità. 1. Entità deboli ed entità forti © Istituto Italiano Edizioni Atlas AUTOVERIFICA Domande da 1 a 12 pag. 130-131 Problemi da 1 a 6 pag. 133 115 parte prima Progettazione della base di dati capitolo 3 Modellazione dei dati 5 Le associazioni tra entità La molteplicità di un’associazione è il numero di possibili istanze di un’entità che viene messo in corrispondenza con un’istanza dell’altra entità che partecipa all’associazione. Il numero minimo e massimo di possibili istanze viene rappresentato mediante una coppia di valori separati da punti: 1..1, 0..1, 1..N. Al valore minimo e massimo sono associati gli importanti concetti di obbligatorietà e cardinalità dell’associazione: • Il valore minimo assume, in genere, uno dei due valori 0 e 1. Lo 0 indica che la partecipazione è facoltativa, mentre il valore 1 indica che la partecipazione è obbligatoria. • Il valore massimo definisce la cardinalità della partecipazione all’associazione. Esso assume, in genere uno dei due valori 1 oppure N per indicare una o molte partecipazioni all’associazione. La cardinalità può quindi essere a uno oppure a molti e pertanto le associazioni tra due entità si classificano nei seguenti tipi: • associazione uno a uno o biunivoca, indicata con 1 : 1; • associazione uno a molti, indicata con 1 : N; • associazione molti a molti, indicata con N : N. Non è sempre facile attribuire questi valori e solo un attento esame della specifica situazione permette di definirli con esattezza. Un metodo utile per risolvere i dubbi consiste nel rappresentare l’associazione con insiemi di istanze delle entità collegate con archi, come mostrato negli esempi successivi. a. Associazione 1:1 (uno a uno) o biunivoca Un’associazione si dice uno a uno, o biunivoca, e si indica con 1 : 1, quando ogni istanza della prima entità si deve associare a una sola istanza della seconda entità e viceversa. Per esempio l’associazione tra l’entità Studente e l’entità Diploma, in una scuola superiore, è biunivoca perché a ogni studente corrisponde un solo diploma e viceversa a un diploma corrisponde un solo studente. Consideriamo ora le entità Classe e Docente e l’associazione Coordinare che collega un docente con la classe di cui è coordinatore. L’associazione può essere descritta come nella figura seguente. Classe Docente D1 D2 Coordinare C1 C2 D3 D4 C3 D5 Molteplicità 0..1 116 Molteplicità 1..1 © Istituto Italiano Edizioni Atlas parte prima Progettazione della base di dati capitolo 3 Modellazione dei dati Notiamo che ci sono docenti, come D3 e D5 che non partecipano all’associazione (non tutti i docenti sono coordinatori) e che i docenti coordinano una sola classe. Il numero minimo di istanze è 0 (partecipazione facoltativa), mentre la cardinalità è a uno, per il fatto che un docente coordina una sola classe. Infatti per ogni elemento dell’insieme Docente non c’è nessun arco diretto verso Classe oppure c’è al più un solo arco. La molteplicità è 0..1 (minima 0, massima 1). Se analizziamo l’associazione nell’altro senso, notiamo che tutte le classi hanno un coordinatore e che a ogni classe è associato un solo coordinatore. Ogni classe partecipa all’associazione con almeno 1 istanza (partecipazione obbligatoria) e ogni classe partecipa al massimo una sola volta all’associazione: la cardinalità è a uno. Infatti anche dall’insieme Classe parte sempre un solo arco verso l’insieme Docente. La molteplicità è 1..1 (minima 1, massima 1). Possiamo riassumere queste considerazioni dicendo che ogni classe deve essere coordinata da un docente e che ogni docente può coordinare una sola classe. La figura seguente illustra il modello E/R del problema analizzato. 1:1 Docente 1 1 Coordinare Facoltativa per Docente Classe Obbligatoria per Classe Per rappresentare il fatto che una classe è coordinata da un solo docente, scriviamo 1 di fianco all’entità Docente e per rappresentare il fatto che un docente coordina una sola classe scriviamo 1 di fianco all’entità Classe. Questo sta a significare che l’associazione tra Docente e Classe ha cardinalità a uno e che anche l’associazione tra Classe e Docente ha cardinalità a uno. Inoltre la partecipazione di Classe è obbligatoria, mentre la partecipazione di Docente è facoltativa. Per ragioni di semplicità e di maggiore leggibilità, l’informazione in merito all’obbligatorietà o meno della partecipazione sarà rappresentata nel seguito utilizzando una linea continua o tratteggiata nel disegno dell’associazione. Una linea continua in partenza da un’entità indica la partecipazione obbligatoria all’associazione, mentre una linea tratteggiata indica la partecipazione facoltativa. La rappresentazione adottata per l’associazione Coordinare è illustrata in figura. Partecipazione facoltativa di Docente e obbligatoria di Classe Docente 1 1 Coordinare Classe b. Associazione 1:N (uno a molti) o semplice Un’associazione si dice uno a molti, o semplice, e si indica con 1 : N, quando ogni istanza della prima entità si può associare a una o più istanze della seconda entità, mentre a ogni istanza della seconda entità si deve associare una sola istanza della prima. © Istituto Italiano Edizioni Atlas 117 parte prima Progettazione della base di dati capitolo 3 Modellazione dei dati Per esempio nella gestione dei movimenti su un conto corrente, ogni conto può effettuare una o più operazioni, ma ogni movimento deve riferirsi a un solo conto corrente. Quindi l’associazione Effettuare tra l’entità ContoCorrente e l’entità Movimento è uno a molti. Analizziamo in dettaglio la situazione. ContoCorrente Movimento C1 M1 Effettuare C2 M2 C3 M3 Molteplicità 0..N Molteplicità 1..1 Osservando gli archi in partenza dalle istanze di ContoCorrente possiamo dire che il numero minimo di volte che il conto corrente viene associato ai movimenti è 0 (partecipazione facoltativa) e che la cardinalità è a molti. Infatti su un conto corrente si possono fare nessun movimento o molti movimenti. La molteplicità è 0..N (minima 0, massima N). Se osserviamo il diagramma dalla parte di Movimento, il numero minimo di istanze è 1, perché tutti i movimenti devono riferirsi a un conto corrente (partecipazione obbligatoria). La cardinalità è a uno, perché a un’ istanza di Movimento corrisponde una e una sola istanza di ContoCorrente. La molteplicità è 1..1 (minima 1, massima 1). Il diagramma E/R corrispondente è il seguente: 1:N ContoCorrente 1 N Effettuare Facoltativa per ContoCorrente Movimento Obbligatoria per Movimento Per rappresentare il fatto che un conto corrente può effettuare molti movimenti scriviamo N vicino a Movimento e scriviamo 1 accanto all’entità ContoCorrente per rappresentare il fatto che un movimento è associato a uno e un solo conto corrente. Questo sta a significare che l’associazione tra ContoCorrente e Movimento è a molti, mentre l’associazione tra Movimento e ContoCorrente è a uno. Inoltre la partecipazione di Movimento è obbligatoria, mentre la partecipazione di ContoCorrente è facoltativa. Ci sono naturalmente casi nei quali sono noti valori meno generici di uno, nessuno e molti per indicare la partecipazione di un’entità a una associazione. Consideriamo, per esempio, l’associazione Giocare che intercorre tra giocatori e squadre di calcio. Poiché una squadra di calcio deve avere almeno 11 giocatori, la partecipazione dell’entità che rappresenta le squadre sarà descritta con 11..N. Un altro esempio tratto dal mondo del calcio è dato dai guardalinee e dalle partite di calcio. Com’è noto, in ogni partita sono presenti esattamente 2 guardalinee. La molteplicità che ne deriva è: 2..2 (minimo 2, massimo 2). 118 © Istituto Italiano Edizioni Atlas parte prima Progettazione della base di dati capitolo 3 Modellazione dei dati La rappresentazione grafica adottata in questo testo per l’associazione uno a molti Effettuare è illustrata nella figura seguente. Si osservi la presenza di due ulteriori linee sulla linea che rappresenta l’associazione, che rafforza il simbolo N posto vicino alla parte molti dell’associazione (in gergo, zampa di corvo o crow’s foot). ContoCorrente 1 N Effettuare Movimento La rappresentazione dell’associazione uno a molti, attraverso una linea semplice vicino all’entità ContoCorrente e le tre linee vicino all’entità Movimento, può intuitivamente ricordare, in forma schematica, gli archi multipli che possono partire dagli elementi nell’insieme dei conti correnti verso l’insieme dei movimenti. c. Associazione N:N (molti a molti) o complessa Un’associazione si dice molti a molti, o complessa, e si indica con N:N, se a ogni istanza della prima entità si possono associare una o più istanze della seconda entità e a ogni istanza della seconda entità si possono associare una o più istanze della prima. Consideriamo per esempio le entità Docente e Classe e l’associazione Insegnare che associa i docenti di una scuola alle classi dove insegnano: Docente Classe D1 D2 Insegnare C1 D3 D4 C2 D5 Molteplicità 0..N Molteplicità ?..N Ogni docente insegna in più classi e in ogni classe insegnano più docenti. La situazione dalla parte docenti è chiara: un docente può insegnare in una o più classi ma potrebbe anche non insegnare in alcuna classe, avendo incarichi di altro tipo, come il docente D2. Il numero minimo di istanze è 0 (partecipazione facoltativa) e la cardinalità è a molti. Infatti a un’istanza di Docente corrispondono più istanze di Classe. La molteplicità è 0..N (minima 0, massima N). Se analizziamo l’associazione partendo dalle classi ci troviamo di fronte alla difficoltà di definire il numero minimo di docenti per una classe. Abbiamo indicato la situazione lasciando un “?” al posto del valore minimo di istanze. Per superare la difficoltà dobbiamo specificare meglio il contesto nel quale è collocata l’associazione. Supponiamo che il caso in esame sia quello di un complesso scolastico formato da una scuola media inferiore e da una scuola elementare. Di conseguenza non ci sono mai meno di 2 docenti per classe. Questo porta a definire il numero minimo di istanze a 2 con partecipazione obbligatoria. Inoltre la cardinalità è a molti, perché a ogni classe corrispondono più insegnanti. La molteplicità è 2..N (minima 2, massima N). © Istituto Italiano Edizioni Atlas 119 parte prima Progettazione della base di dati capitolo 3 Modellazione dei dati Il diagramma E/R del problema considerato è il seguente: N:N N Docente N Classe Insegnare Facoltativa per Docente Obbligatoria per Classe Accanto all’entità Docente scriviamo N e accanto all’entità Classe scriviamo N. Questo sta a significare che l’associazione tra Docente e Classe è a molti e anche l’associazione tra Classe e Docente è a molti. Inoltre la partecipazione di Docente è facoltativa, mentre la partecipazione di Classe è obbligatoria. Il diagramma E/R, nella forma adottata in questo testo per indicare l’associazione molti a molti è la seguente: N Docente N Classe Insegnare Facoltativa per Docente Obbligatoria per Classe Occorre osservare che nella modellazione dei dati con l’approccio E/R le associazioni 1:N sono molto più frequenti delle associazioni di tipo uno a uno e molti a molti. L’associazione molti a molti, inoltre, può essere facilmente scomposta in due associazioni uno a molti come nel seguente caso. Consideriamo le entità Studente e Materia e l’associazione Valutare con attributi la data della valutazione e il voto conseguito dallo studente in una data materia. Si tratta di un’associazione molti a molti, in quanto uno studente può essere valutato in una o più materie e ogni materia può essere oggetto di verifica per uno o più studenti. Introducendo una terza entità Prova, avente come attributi la data e il voto della verifica, si arriva al modello E/R in figura nel quale compaiono le due associazioni Svolgere e Assegnare di tipo uno a molti. 1:N Studente 1 N:1 N Svolgere Prova N 1 Assegnare Materia L’associazione tra Studente e Prova è di tipo 1:N, in quanto ogni studente può svolgere una o più prove e ogni prova deve essere svolta da un solo studente; l’associazione tra Materia e Prova è di tipo 1:N, perché ogni materia si può controllare con una o più prove e ogni prova deve essere assegnata a una sola materia. L’associazione molti a molti è stata trasformata in due associazioni uno a molti, con l’aggiunta di una terza entità. 120 © Istituto Italiano Edizioni Atlas parte prima Progettazione della base di dati capitolo 3 Modellazione dei dati 6 Regole di lettura Dopo aver definito lo schema E/R con le entità e le associazioni, con opzionalità, obbligatorietà e cardinalità, è opportuno effettuare un controllo del modello usando frasi del linguaggio naturale. Per entrambi i versi di ciascuna associazione si usano le seguenti regole di lettura. Ogni Nome dell’entità di partenza deve Nome dell’associazione può uno solo uno o più Nome dell’entità di arrivo Lo schema rappresenta graficamente la traccia per costruire correttamente una frase che rappresenta in linguaggio naturale l’associazione tra due entità. La frase risultante ha la seguente struttura sintattica. Ogni Nome dell’entità di partenza deve può Nome dell’associazione uno solo uno o più Nome dell’entità di arrivo La scelta alternativa delle parole deve piuttosto che può dipende dalla obbligatorietà o meno della partecipazione dell’entità di partenza dell’associazione. La scelta alternativa delle parole un solo piuttosto che uno o più dipende dalla presenza di un 1 o di una N vicino all’entità di arrivo (linea unica o multipla). Per migliorare la correttezza della lettura è opportuno convertire al plurale il nome dell’entità di arrivo nel caso in cui si utilizzino le parole uno o più. Le regole di lettura devono essere provate in entrambi i sensi dell’associazione. Il nome dell’associazione ha un verso. Quando si cambia verso di lettura bisogna trasformare il verbo che rappresenta l’associazione nella sua forma passiva. Per esempio l’associazione tra l’entità Fornitore e l’entità Prodotto rappresentata con lo schema E/R in figura: Fornitore 1 N Fornire Prodotto Viene letta nel seguente modo: Ogni fornitore può fornire uno o più prodotti Ogni prodotto deve essere fornito da un solo fornitore La correttezza sintattica delle frasi costruite dipende molto dal nome scelto per l’associazione. In alcuni casi può essere necessario trasformare il verbo che dà il nome all’associazione, portandolo in altra forma verbale, per rendere la frase più vicina al linguaggio naturale. Il controllo del modello E/R attraverso le regole di lettura diventa più efficace se le frasi del linguaggio naturale, ricavate dalla lettura del modello, vengono presentate a una persona diversa da quella che ha progettato lo schema E/R, meglio se esperta del problema trattato nel modello di dati. © Istituto Italiano Edizioni Atlas 121 parte prima Progettazione della base di dati capitolo 3 Modellazione dei dati Se le frasi risultano incomprensibili o prive di significato, significa che il modello contiene errori nella scelta delle entità, nei versi o nella molteplicità delle associazioni. Si provi, per esercizio, a modificare uno degli schemi E/R precedenti, inserendo entità errate o scambiando associazioni di molteplicità uno a molti in associazioni molti a uno: applicando le regole di lettura si otterranno frasi che non hanno significato o che non sono corrette se riferite al problema considerato. Per esempio, se pensiamo alle vetture che si trovano in un certo istante in una data via di una città e i passeggeri che occupano tali vetture, descriviamo questa situazione dicendo: “ogni vettura può essere occupata da uno o più passeggeri e un passeggero deve occupare una ed una sola vettura”. Supponiamo adesso di descrivere (erroneamente) questi fatti con il modello E/R in figura. Passeggero 1 N Occupare Vettura Applicando al modello le regole di lettura si ottengono le seguenti frasi: Ogni passeggero può occupare una o più vetture Ogni vettura deve essere occupata da un solo passeggero Esse non descrivono la situazione reale perché: oltre alle vetture in movimento ci possono essere vetture parcheggiate, e quindi senza passeggeri, ci possono essere vetture con più di un passeggero e, infine, in un dato istante un passeggero occupa una sola vettura. Si può invece verificare che, applicando le regole di lettura allo schema sottostante, si costruiscono frasi che descrivono correttamente la situazione ipotizzata. Vettura 1 N Occupare Passeggero AUTOVERIFICA Domande da 13 a 23 pag. 131-133 Problemi da 7 a 26 pag. 133-134 7 Esempi di modellazione di dati PROGETTO 1 Si devono raccogliere e organizzare le informazioni relative ai risultati nelle gare sportive di un campionato internazionale che si svolge in diverse località del mondo in date diverse nell’anno (per esempio la Coppa del mondo di sci o il motomondiale). In ogni gara i concorrenti possono guadagnare punti che, alla fine del campionato, determineranno il vincitore. Individuare le entità, gli attributi e le associazioni, motivando le scelte effettuate, disegnare il modello E/R e verificare lo schema con le regole di lettura. Riconoscere la chiave di ogni entità (se esiste). Per ogni attributo identificare il formato. ANALISI DEI DATI Le entità che possono essere individuate nel problema sono: • Concorrente, per rappresentare le informazioni riguardanti i concorrenti del campionato; • Gara, per le diverse gare che costituiscono l’insieme delle prove del campionato; • Risultato, per i risultati conseguiti dai concorrenti nelle diverse prove. 122 © Istituto Italiano Edizioni Atlas parte prima Progettazione della base di dati capitolo 3 Modellazione dei dati Gli attributi di Concorrente sono: codice concorrente, cognome, nome, nazionalità; tutti gli attributi sono di tipo carattere. Gli attributi di Gara sono: codice gara, descrizione, località, data di svolgimento; codice di gara è di tipo carattere, la data è di tipo data/ora, i due attributi rimanenti sono di tipo carattere. Gli attributi di Risultato sono: codice, punti, posizione in classifica per una specifica gara; tutti gli attributi sono di tipo numerico. Tra l’entità Concorrente e l’entità Risultato esiste un’associazione uno a molti, perché un concorrente può conseguire molti risultati e ciascun risultato si riferisce a un solo concorrente. Tra l’entità Gara e l’entità Risultato si può stabilire un’associazione uno a molti, perché ci possono essere tanti risultati per la stessa gara riferiti ai diversi concorrenti, ma un risultato riguarda una specifica gara del campionato. Si può osservare che il modello concettuale potrebbe essere rappresentato con due sole entità, Concorrente e Gara, e un’unica associazione Partecipare di tipo molti a molti: infatti ogni concorrente partecipa a più gare e ogni gara viene disputata da più concorrenti. In tale caso gli attributi di Partecipare sarebbero i punti ottenuti e la posizione in classifica per una specifica gara. Le due soluzioni sono sostanzialmente equivalenti. Optiamo per la soluzione che prevede l’inserimento di una terza entità Risultato per mostrare un esempio di associazione molti a molti che viene risolta con due associazioni di tipo uno a molti, ottenendo una rappresentazione del modello concettuale complessivamente più semplice. Le chiavi delle entità identificate sono: il codice del concorrente per l’entità Concorrente, il codice di gara per l’entità Gara e il codice per l’entità Risultato. Sulla base dell’analisi effettuata si può disegnare il modello entità/associazioni. MODELLO E/R Concorrente 1 N Ottenere Codice {PK} Cognome Nome Nazionalità Risultato CodRis {PK} Punti Posizione N 1 Determinare Gara CodGara {PK} Descrizione Località Data Nel modello E/R sono stati indicati i nomi delle associazioni con il verso di lettura e l’opzionalità delle partecipazioni all’associazione. Nel modello proposto tutte le partecipazioni possono essere considerate come obbligatorie. Si tratta della diretta conseguenza del fatto che un concorrente è colui che ha gareggiato almeno una volta e che le gare considerate sono solo quelle effettuate; inoltre tutti i concorrenti di una gara ottengono un risultato (compreso quello di ritirato). Se invece si ritiene che sia da considerarsi concorrente anche chi non ha mai gareggiato, la partecipazione dell’entità Concorrente all’associazione Ottenere è da considerarsi facoltativa (linea tratteggiata in uscita da Concorrente) come illustrato nello schema precedente. Analogamente, se si considerano anche le gare previste ma non effettuate, la partecipazione dell’entità Gara all’associazione Determinare è da ritenersi facoltativa (linea tratteggiata in uscita da Gara). © Istituto Italiano Edizioni Atlas 123 parte prima Progettazione della base di dati capitolo 3 Modellazione dei dati Il modello viene verificato utilizzando le regole di lettura presentate nel paragrafo precedente: Ogni concorrente può ottenere uno o più risultati, ogni risultato deve essere ottenuto da un solo concorrente. Ogni gara può determinare uno o più risultati, ogni risultato deve essere determinato da una sola gara. PROGETTO 2 Le informazioni sulle opere d’arte di molti artisti di epoche diverse, conservate nei musei delle nazioni di tutto il mondo, devono essere catalogate e registrate in un archivio. In una stessa città ci possono essere più musei. Le opere possono essere di tipo diverso: tele, sculture, ecc. Uno stesso artista può avere opere in tanti musei, così come in un museo, in genere, ci sono opere di artisti diversi. Per sapere l’epoca di riferimento dell’artista si potrebbe registrare la data di nascita e la data di morte (quest’ultima è nulla se l’artista è vivente). L’opera inserita nell’archivio può assumere un’identificazione numerica, come una specie di numerazione del catalogo delle opere. Individuare le entità, gli attributi e le associazioni, motivando le scelte effettuate, disegnare il modello E/R con il verso delle associazioni e verificare lo schema con le regole di lettura. Riconoscere la chiave di ogni entità (se esiste). Per ogni attributo identificare il formato. ANALISI DEI DATI Le entità che possono essere individuate nel problema sono: • Artista, per rappresentare le informazioni riguardanti gli autori delle opere da catalogare; • Museo, per i diversi musei dove si trovano le opere catalogate; • Città, per le informazioni sulle località che sono sedi dei musei; • Opera, per le informazioni riguardanti le opere degli artisti. Gli attributi di Artista sono: codice artista, cognome, nome, data nascita, data morte, nazionalità; a eccezione delle date tutti gli attributi sono di tipo carattere. Gli attributi di Museo sono: codice museo, denominazione; tutti di tipo carattere. Gli attributi di Città sono: codice città, descrizione, nazione; tutti di tipo carattere. Gli attributi di Opera sono: numero di catalogo, titolo, tipo (tela, scultura, ecc.), anno di realizzazione; numero di catalogo e anno di realizzazione sono di tipo numerico, gli altri attributi sono di tipo carattere. Tra l’entità Artista e l’entità Opera esiste l’associazione uno a molti, perché ogni artista può eseguire una o più opere e ciascuna opera è eseguita da un solo artista. Si considerano anche artisti che non hanno opere esposte presso musei. Tra l’entità Museo e l’entità Opera si può stabilire un’associazione uno a molti, perché ci possono essere tante opere nello stesso museo, ma un’opera è collocata in un solo museo (ci sono anche musei in fase di costituzione, senza opere esposte). Tra l’entità Città e l’entità Museo esiste un’associazione uno a molti, perché una città può ospitare uno o più musei, ma ogni museo deve risiedere in una sola città. Le chiavi delle entità identificate sono: il codice artista per l’entità Artista, il codice museo per l’entità Museo, il codice città per l’entità Città e il numero di catalogo per l’entità Opera. 124 © Istituto Italiano Edizioni Atlas parte prima Progettazione della base di dati capitolo 3 Modellazione dei dati Sulla base dell’analisi effettuata si può disegnare il modello entità/associazioni: 1 Museo N Esporre CodiceMuseo {PK} Denominazione N Opera NumeroCatalogo {PK} Titolo Tipo Anno N Ospitare Eseguire 1 1 Città CodiceCittà Descrizione Nazione Artista {PK} CodiceArtista {PK} Cognome Nome Nascita Morte Nazionalità Nel modello E/R sono stati indicati i nomi dei versi delle associazioni e l’opzionalità od obbligatorietà delle partecipazioni alle associazioni (indicate rispettivamente con linea tratteggiata o continua). Il modello viene verificato utilizzando le regole di lettura presentate nel paragrafo precedente: Ogni città può ospitare uno o più musei, ogni museo deve essere ospitato in una sola città. Ogni museo può esporre una o più opere, ogni opera deve essere esposta in un solo museo. Ogni artista può eseguire una o più opere, ogni opera deve essere eseguita da un solo artista. PROGETTO 3 Produrre il modello dei dati per la costruzione di un archivio anagrafico. ANALISI DEI DATI Esempi di archivi anagrafici sono: • soci di un circolo culturale • cittadini di un comune • clienti di un’azienda • fornitori di un’azienda • agenti di vendita. Per delimitare il campo di applicazione, si supponga di operare sull’archivio anagrafico dei clienti di un’azienda. © Istituto Italiano Edizioni Atlas 125 parte prima Progettazione della base di dati capitolo 3 Modellazione dei dati Le principali informazioni, registrate per ogni cliente, sono: • ragione sociale • indirizzo • CAP • località • provincia • telefono • partita IVA. Queste sono necessarie per le intestazioni delle fatture, delle tratte e per la stampa di elenchi e di indirizzari. Per facilitare la gestione su un archivio anagrafico è opportuno associare a ogni cliente un Codice che può essere un numero progressivo che viene assegnato a ogni nuovo cliente. Informazioni aggiuntive utili per la gestione del cliente sono: • il codice dell’agente che abitualmente tiene i contatti con il cliente • il fido accordato al cliente. Per la definizione dell’entità Cliente si possono indicare, quindi, i seguenti attributi: codice cliente, ragione sociale, CAP, indirizzo, località, provincia, telefono, partita IVA, codice agente, fido, con chiave codice cliente. Al posto degli attributi CAP, località, provincia è opportuno inserire una nuova entità Località descritta dai seguenti attributi: codice località, CAP, nome località, sigla della provincia. Tale scelta permette di ottenere un’indicazione univoca per descrizioni diverse della medesima località: per esempio “Mte Nero”, “M.te Nero” e “M. Nero” si riducono all’unica dizione “Monte Nero”. In particolare va notato che ogni Cliente deve essere residente in una Località, vale a dire che per ogni cliente non può mancare l’indicazione della località in cui risiede. Inoltre ogni località può essere residenza di uno o più clienti, ma non necessariamente tutte le località hanno al loro interno un cliente. Le chiavi delle entità identificate sono: il codice cliente per l’entità Cliente e il codice località per l’entità Località. MODELLO E/R Località Codice {PK} CAP Nome SiglaProvincia 1 N Risiedere Cliente CodiceCliente RagioneSociale Indirizzo NumTelefono PartitaIVA CodiceAgente Fido {PK} Il modello viene verificato utilizzando le regole di lettura: Ogni località può essere residenza di uno o più clienti, ogni cliente deve risiedere in una località. 126 © Istituto Italiano Edizioni Atlas parte prima Progettazione della base di dati capitolo 3 Modellazione dei dati PROGETTO 4 I pazienti di un reparto di chirurgia sono ricoverati in stanze singole con differenti dotazioni (telefono, televisore, aria condizionata). I pazienti vengono operati da un chirurgo. Si devono registrare anche data, ora e sala operatoria nella quale il paziente viene operato. Bisogna inoltre tenere conto delle date di inizio e fine del ricovero. Per semplicità si ipotizzi che un paziente possa essere ricoverato una sola volta nel periodo di tempo considerato e che durante il ricovero non cambi la stanza. Individuare le entità, gli attributi e le associazioni, motivando le scelte effettuate, disegnare il modello E/R con il verso delle associazioni e verificare lo schema con le regole di lettura. Riconoscere la chiave di ogni entità (se esiste). Per ogni attributo identificare il formato. ANALISI DEI DATI Le entità che possono essere individuate nel problema sono: • Paziente, per rappresentare le informazioni riguardanti i pazienti; • Chirurgo, per i chirurghi del reparto; • Stanza, per le stanze che accolgono i pazienti. Gli attributi di Paziente sono: codice, cognome, nome, indirizzo, numero di telefono; tutti gli attributi sono di tipo carattere. Gli attributi di Chirurgo sono: codice, cognome, nome e specialità; tutti di tipo carattere. Gli attributi di Stanza sono: numero, e una serie di attributi per indicare la presenza o meno di telefono, televisore, aria condizionata; numero è di tipo numerico, gli altri attributi sono di tipo logico (vero, falso). Le chiavi delle entità sono: il codice del paziente per l’entità Paziente, il codice del chirurgo per l’entità Chirurgo e il numero di stanza per l’entità Stanza. Tra l’entità Stanza e l’entità Paziente esiste l’associazione uno a molti, di nome Accogliere, perché una stanza può accogliere uno o più pazienti e un paziente è accolto in una sola stanza. Accogliere è un’associazione che ha come attributi le due date, di inizio e fine ricovero, di tipo data. Tra l’entità Chirurgo e l’entità Paziente si può stabilire un’associazione uno a molti, Operare, perché un chirurgo opera molti pazienti, mentre un paziente è operato da un solo chirurgo. L’associazione Operare ha come attributi data e ora dell’intervento, oltre a un identificatore della sala operatoria utilizzata. Sulla base dell’analisi effettuata si può disegnare il modello entità/associazioni: MODELLO E/R Stanza Numero {PK} Telefono Televisore AriaCond 1 Accogliere InizioRicovero FineRicovero © Istituto Italiano Edizioni Atlas N Paziente Codice Cognome Nome Indirizzo NumTelef N Operare {PK} DataIntervento OraIntervento SalaOperatoria 1 Chirurgo Codice Cognome Nome Specialità {PK} 127 parte prima Progettazione della base di dati capitolo 3 Modellazione dei dati ERIA EB W LIBR Nel modello E/R sono stati indicati i nomi delle associazioni con il verso di lettura e l’opzionalità delle partecipazioni. La partecipazione opzionale a un’associazione è indicata con il tratteggio vicino all’entità che partecipa opzionalmente all’associazione. Nella costruzione del modello si è ipotizzato che un paziente possa essere dimesso senza subire alcun intervento e che ci siano chirurghi che non effettuano interventi. Le ipotesi sono assolutamente ragionevoli in un caso reale. Il modello viene verificato utilizzando le regole di lettura presentate nel paragrafo precedente: Ogni stanza può accogliere uno o più pazienti, ogni paziente deve essere accolto in una sola stanza. Ogni chirurgo può operare uno o più pazienti, ogni paziente può essere operato da un solo chirurgo. 2. Sviluppo di progetti informatici MODELLO CON ASSOCIAZIONE RICORSIVA PROGETTO 5 Consideriamo una catena di negozi distribuiti sul territorio nazionale. Ogni negozio ha un responsabile che coordina gli altri addetti al negozio. Il responsabile di un negozio è unico ed è responsabile di un solo negozio. Si limitano le considerazioni ai soli dipendenti della catena che lavorano nei negozi. Individuare le entità, gli attributi e le associazioni, motivando le scelte effettuate, disegnare il modello E/R con il verso di lettura delle associazioni e verificare lo schema con le regole di lettura. Riconoscere la chiave di ogni entità (se esiste). Per ogni attributo identificare il formato. ANALISI DEI DATI Le entità che possono essere individuate nel problema sono due: • Addetto, per rappresentare le informazioni sui dipendenti che lavorano nei negozi; • Negozio, per i negozi della catena. Gli attributi di Addetto sono: matricola, cognome, nome, indirizzo, numero di telefono; matricola è di tipo numerico, tutti gli altri attributi sono di tipo carattere. Gli attributi di Negozio sono: codice, indirizzo, telefono; tutti di tipo carattere. Tra l’entità Addetto e l’entità Negozio esistono due associazioni. La prima, di tipo uno a uno, di nome Dirigere, riguarda un addetto visto nel ruolo di manager del negozio. L’associazione Dirigere è uno a uno in quanto ogni negozio ha un solo manager e viceversa un manager è responsabile di un solo negozio. La seconda, che riguarda l’addetto generico, ha nome FarFunzionare, ed è di tipo molti a uno, perché ci sono più addetti per negozio e ogni addetto lavora in un solo negozio. Esiste poi un’associazione ricorsiva, di nome Coordinare, tra Addetto e se stesso. È un’associazione uno a molti tra un addetto nel ruolo di manager e addetto nel ruolo di collaboratore: un manager coordina molti collaboratori, ogni collaboratore ha un solo manager. 128 © Istituto Italiano Edizioni Atlas parte prima Progettazione della base di dati capitolo 3 Modellazione dei dati Le chiavi delle entità identificate sono: la matricola per l’entità Addetto, il codice del negozio per l’entità Negozio. Sulla base dell’analisi effettuata si può disegnare il modello entità/associazioni: MODELLO E/R Coordinare 1 Manager N Collaboratore 1 Dirigere 1 Addetto Matricola Cognome Nome Indirizzo Telefono {PK} Negozio N FarFunzionare 1 Codice Indirizzo Telefono {PK} Nel modello E/R sono stati indicati i nomi delle associazioni con il verso di lettura e l’opzionalità delle partecipazioni. La partecipazione opzionale a un’associazione è indicata con il tratteggio vicino all’entità che partecipa opzionalmente all’associazione. La partecipazione di Addetto all’associazione Coordinare è opzionale in entrambi i ruoli perché ci sono addetti (i collaboratori) che non coordinano nessuno e ci sono addetti (i manager) che non sono coordinati da nessuno. Il modello viene verificato utilizzando le regole di lettura presentate nel paragrafo precedente: Ogni negozio deve essere diretto da un solo addetto, ogni addetto può dirigere un solo negozio. Ogni negozio deve essere fatto funzionare da uno o più addetti, ogni addetto deve far funzionare un solo negozio. Ogni addetto può coordinare uno o più addetti, ogni addetto può essere coordinato da un solo addetto. AUTOVERIFICA Problemi da 27 a 36 pag. 134-135 © Istituto Italiano Edizioni Atlas 129 parte prima Progettazione della base di dati capitolo 3 Modellazione dei dati DOMANDE ATTIVITÀ DI AUTOVERIFICA Entità, attributi e associazioni 130 1 Completa le frasi seguenti utilizzando una tra le parole elencate alla fine della domanda a) Il livello ........ rappresenta l’effettiva installazione degli archivi elettronici b) Il livello ........ rappresenta la realtà dei dati e le relazioni tra essi attraverso uno schema c) Il livello ....... rappresenta il modo attraverso il quale i dati sono organizzati negli archivi elettronici. opzionale, fisico, schematico, uno a uno, uno a molti, logico, molti a molti, obbligatorio, concettuale 2 La a) b) c) d) 3 Quale tra le seguenti frasi esprime meglio il significato di schema Entity/Relationship? a) rappresentazione grafica del modello logico b) rappresentazione grafica del modello concettuale c) rappresentazione grafica del modello fisico d) rappresentazione grafica del modello sequenziale 4 Quali sono gli elementi di un modello Entity/Relationship? a) associazioni b) entità, archivi, dati c) attributi, archivi, grafici d) entità, associazioni, attributi 5 Quali delle seguenti definizioni esprime meglio la definizione di associazione? a) un legame che definisce una corrispondenza tra attributi della stessa entità b) un legame che definisce una corrispondenza tra attributi di entità differenti c) una correlazione tra domini di entità d) un legame che stabilisce un’interazione tra entità 6 Si consideri l’associazione EssereGenitore definita sull’entità Persona. Quali delle seguenti affermazioni sono vere? a) EssereGenitore è un’associazione ricorsiva b) Essere Genitore è un’associazione binaria c) La partecipazione di persona è obbligatoria in entrambe le direzioni d) Persona partecipa all’associazione nei due ruoli di Genitore e Figlio 7 Si consideri l’associazione EssereMadre definita sull’entità Persona nei due ruoli di Madre e Figlio. Quale delle seguenti affermazioni è vera? a) Essere Madre è un’associazione binaria tra Madre e Figlio b) Essere Madre è un’associazione ricorsiva su Persona c) La partecipazione di persona nel ruolo di Madre è obbligatoria struttura di dati nel modello logico deve facilitare la progettazione del modello concettuale la scelta della chiave tra gli attributi di un’entità le operazioni di manipolazione e di interrogazione le operazioni di derivazione del modello fisico © Istituto Italiano Edizioni Atlas parte prima Progettazione della base di dati 8 9 capitolo 3 Modellazione dei dati Quali delle seguenti affermazioni sono vere (V) e quali false (F)? a) L’entità è un oggetto che ha un significato solo quando viene considerato in relazione ad altri oggetti b) Un’istanza è uno specifico esemplare di una entità c) L’associazione è un legame che stabilisce un’interazione tra gli attributi di un’entità d) Gli attributi possono essere proprietà delle entità o delle associazioni V F V F V F V F Quali dei seguenti termini esprimono le caratteristiche di un attributo? a) istanza b) formato c) dimensione d) grado e) opzionalità ATTIVITÀ DI AUTOVERIFICA 10 Quali dei seguenti attributi possono svolgere la funzione di chiave primaria dell’entità? a) b) c) d) e) data di svolgimento della prova di uno studente numero di registrazione di una fattura codice dell’abbonato a una rivista città di residenza di una persona cognome di una persona 11 Quale delle seguenti definizioni esprime meglio la definizione di chiave primaria? a) b) c) d) un attributo o un insieme di attributi che permettono di distinguere tra le istanze di un’entità uno solo tra gli attributi di un’entità il primo attributo riprodotto nello schema E/R un attributo qualsiasi scelto dal progettista 12 Associa a ciascun termine della colonna di sinistra la definizione corretta tra quelle elencate a destra: a) attributi derivati b) chiave primaria c) dominio dell’attributo d) valore nullo 1) informazione mancante, inapplicabile o sconosciuta 2) un attributo che consente di distinguere un’istanza dall’altra per la stessa entità 3) gli attributi che si ottengono con le elaborazioni 4) insieme dei possibili valori assunti da un attributo Tipi di associazioni 13 Quali dei seguenti elementi caratterizzano un’associazione? a) b) c) d) e) il dominio il formato il nome il verso di lettura la molteplicità 14 Quali delle seguenti affermazioni sono vere (V) e quali false (F)? a) b) c) d) e) Le Le Le Le Le associazioni associazioni associazioni associazioni associazioni molti a molti sono scomponibili in due associazioni uno a uno molti a molti non sono mai scomponibili molti a molti sono scomponibili in due associazioni uno a molti uno a uno sono raggruppabili in associazioni uno a molti uno a molti sono scomponibili in più associazioni uno a uno © Istituto Italiano Edizioni Atlas V F V F V F V F V F 131 parte prima Progettazione della base di dati capitolo 3 Modellazione dei dati 15 Per stabilire la natura dell’associazione tra le entità E1 ed E2, si rappresentano E1 ed E2 come insiemi e si collegano con archi. I collegamenti uscenti da E1 sono 0..1 e quelli uscenti da E2 sono 1..N. Quale delle seguenti affermazioni è vera? a) Si tratta di un’associazione 1:1 tra E1 ed E2 b) Si tratta di un’associazione 1:N tra E1 ed E2 c) Si tratta di un’associazione N:1 tra E1 ed E2 d) Si tratta di un’associazione N:N tra E1 ed E2 16 Per stabilire la natura dell’associazione tra le entità E1 ed E2, si rappresentano E1 ed E2 come insiemi e si collegano con archi. I collegamenti uscenti da E1 sono 0..N e quelli uscenti da E2 sono 2..N. Quali delle seguenti affermazioni sono vere? a) La partecipazione di E1 all’associazione è obbligatoria b) La partecipazione di E1 all’associazione è facoltativa c) La partecipazione di E2 all’associazione è obbligatoria d) La partecipazione di E2 all’associazione è facoltativa ATTIVITÀ DI AUTOVERIFICA 17 Per stabilire la natura dell’associazione tra le entità E1 ed E2, si rappresentano E1 ed E2 come insiemi e si collegano con archi. I collegamenti uscenti da E1 sono 1..1 e quelli uscenti da E2 sono 0..1. Quale delle seguenti affermazioni è vera? a) Si tratta di un’associazione 1:1 tra E1 ed E2 b) Si tratta di un’associazione 1: N tra E1 ed E2 c) Si tratta di un’associazione N:1 tra E1 ed E2 d) Si tratta di un’associazione N:N tra E1 ed E2 18 Per stabilire la natura dell’associazione tra le entità E1 ed E2, si rappresentano E1 ed E2 come insiemi e si collegano con archi. I collegamenti uscenti da E1 sono 1..N e quelli uscenti da E2 sono 0..1. Quali delle seguenti affermazioni sono vere? a) Si tratta di un’associazione 1:1 tra E1 ed E2 b) Si tratta di un’associazione 1: N tra E1 ed E2 c) La partecipazione di E1 all’associazione è obbligatoria d) La partecipazione di E1 all’associazione è facoltativa 19 In quale tipo di associazione ogni istanza della prima entità si può associare a una o più istanze della seconda entità e viceversa? a) uno a uno b) uno a molti c) molti a molti 20 In quale tipo di associazione ogni istanza della prima entità si può associare a una o più istanze della seconda entità, mentre ogni istanza della seconda entità si deve associare a una sola istanza della prima? a) uno a uno b) uno a molti c) molti a molti 21 Tra E1 ed E2 esiste un’associazione di nome Leggere, di tipo uno a molti, con partecipazione obbligatoria per E1, facoltativa per E2. Come si può verificare l’associazione applicando le regole di lettura? (scegliere le due risposte corrette) a) Ogni E1 può leggere uno o più E2 b) Ogni E1 deve leggere uno e un solo E2 c) Ogni E1 deve leggere uno o più E2 d) Ogni E2 può essere letto da uno e un solo E1 132 © Istituto Italiano Edizioni Atlas parte prima Progettazione della base di dati capitolo 3 Modellazione dei dati 22 Tra E1 ed E2 esiste un’associazione di nome Leggere, di tipo uno a uno, con partecipazione facoltativa per E1, obbligatoria per E2. Come si può verificare l’associazione applicando le regole di lettura? (scegliere le due risposte corrette) a) Ogni E1 può leggere uno o più E2 b) Ogni E1 può leggere uno e un solo E2 c) Ogni E1 deve leggere uno e un solo E2 d) Ogni E2 deve essere letto da uno e un solo E1 23 Tra E1 ed E2 esiste un’associazione di nome Leggere, di tipo molti a molti, con partecipa- ATTIVITÀ DI AUTOVERIFICA zione facoltativa per E1, facoltativa per E2. Come si può verificare l’associazione applicando le regole di lettura? (scegliere le due risposte corrette) a) Ogni E1 può leggere uno o più E2 b) Ogni E1 deve leggere uno e un solo E2 c) Ogni E1 deve leggere uno o più E2 d) Ogni E2 può essere letto da uno o più E1 PROBLEMI Entità, attributi e associazioni Determinare gli attributi delle seguenti entità e stabilire quale tra essi può svolgere la funzione di chiave primaria: 1 Veicolo immatricolato. 2 Cittadino contribuente per il sistema fiscale. 3 Movimento di magazzino per il carico o lo scarico di merce. 4 Figura geometrica piana. 5 Film. 6 Prodotto venduto in un centro commerciale. Tipi di associazioni Rappresentare con uno schema E/R le seguenti frasi, indicando la molteplicità delle associazioni individuate e l’obbligatorietà od opzionalità delle partecipazioni alle associazioni: 7 Una materia può essere insegnata da più docenti, un docente deve insegnare una sola materia. 8 Un Comune appartiene a una sola Regione, ogni Regione può comprendere più Comuni. 9 Un attore può fare molti film, ogni film ha come interpreti molti attori. 10 Un reparto vende più prodotti, ogni prodotto è venduto in un solo reparto. 11 Uno studente può fare molte assenze, ogni assenza registrata fa riferimento a un solo studente. 12 Ai clienti di un bar piacciono molti tipi di birra, un tipo di birra viene scelto da molti clienti. 13 Un elettore può votare per un solo partito, ogni partito può essere scelto da più elettori. © Istituto Italiano Edizioni Atlas 133 parte prima Progettazione della base di dati capitolo 3 Modellazione dei dati 14 Una spedizione evade uno o più ordini, un ordine viene evaso con una sola spedizione. 15 Un ordine è abbinato a una fattura, una fattura è relativa a un solo ordine. 16 Una spedizione causa l’emissione di una o più fatture, una fattura è inviata per effetto di una e una sola spedizione. 17 Una classe è composta da almeno 15 studenti, uno studente partecipa alle attività di una sola classe. 18 Un passeggero (in un viaggio aereo qualsiasi) viaggia su uno o più voli, un volo può essere scelto dai passeggeri. 19 Uno studente deve essere iscritto a una sola facoltà, una facoltà può essere scelta da uno o più studenti. 20 Uno studente universitario deve scegliere 4 o più corsi, un corso può essere scelto da uno o ATTIVITÀ DI AUTOVERIFICA più studenti. 21 Un corso universitario è tenuto da un solo docente, un docente può insegnare in uno o più corsi. Dopo aver rappresentato lo schema E/R con le entità e le associazioni, indicando anche l’obbligatorietà od opzionalità della partecipazione all’associazione, verificare il modello con le regole di lettura: 22 Uno studente viene esaminato in relazione ai contenuti dei corsi che ha frequentato. Le regole per la registrazione degli esami prevedono che venga tenuta traccia del voto e della data dell’esame. Inoltre vengono registrati sia i voti positivi che quelli negativi. (Suggerimento: usare un’associazione con attributi). 23 In una scuola superiore ogni materia viene insegnata da molti docenti e ogni docente può insegnare una o più materie. In una data classe una materia è insegnata da un solo docente. (Suggerimento: usare un’associazione con attributi). 24 Un articolo di una catena di supermercati si trova in uno o più magazzini, un magazzino contiene uno o più articoli. (Suggerimento: usare un’associazione con attributi). 25 Un articolo di una catena di supermercati è fornito da un solo fornitore, un fornitore fornisce uno o più articoli. 26 Ogni formazione di una squadra di calcio è composta da 11 giocatori e 5 riserve, i giocatori entrano a far parte di diverse formazioni, nel corso del campionato. (Suggerimento: usare un’associazione con attributi). Analisi dei dati di un problema Individuare le entità, gli attributi e le associazioni, motivando le scelte effettuate, disegnare il modello E/R con i versi delle associazioni e verificare lo schema con le regole di lettura. Utilizzare come riferimento lo svolgimento dei problemi proposto nel Paragrafo 7. 27 Si deve realizzare la gestione automatizzata delle prestazioni specialistiche del Servizio Sanitario, per consentire le prenotazioni agli sportelli, con controllo della disponibilità e registrazione della prenotazione. I dati da organizzare riguardano i medici che operano presso il Servizio Sanitario, i diversi tipi di visite specialistiche, le informazioni anagrafiche dei pazienti che richiedono le visite, le prenotazioni delle visite da parte dei pazienti. 134 © Istituto Italiano Edizioni Atlas parte prima Progettazione della base di dati capitolo 3 Modellazione dei dati 28 Si vuole automatizzare la gestione del magazzino di una ditta di ricambi. Oltre ai dati degli articoli di magazzino, si devono organizzare nel modello di dati anche le informazioni relative ai clienti dell’azienda e ai fornitori dei ricambi. 29 Si vogliono archiviare i dati relativi agli articoli pubblicati sulle riviste specializzate in un determinato settore, organizzandoli per rivista, per argomento e per autore. 30 Si vuole gestire un magazzino di prodotti organizzato per reparti, tenendo sotto controllo anche la situazione dei fornitori; in particolare si vuole poi rispondere alle seguenti esigenze: • produrre listini di prodotti con descrizione, prezzi e sconti; • produrre elenchi di prodotti con i relativi fornitori; • controllare i prodotti sotto scorta. 31 Progettare un modello di dati per la gestione delle informazioni sugli spettacoli teatrali e ATTIVITÀ DI AUTOVERIFICA cinematografici che si svolgono nelle diverse città di una Regione, in modo da fornire alla cittadinanza informazioni su: • date nelle quali si svolgono gli spettacoli; • prezzo dei biglietti; • tipologia di spettacoli tra i quali scegliere; • opportunità di scelta tra spettacoli diversi in una città; • sale e indirizzo delle sedi degli spettacoli. 32 Costruire il modello di dati per la gestione delle informazioni riguardanti gli immobili e i loro proprietari; un immobile può essere intestato anche a più proprietari e naturalmente una persona può possedere uno o più immobili. Gli immobili sono di diverse tipologie: abitazioni, uffici, negozi. La gestione deve poter ottenere: • le informazioni anagrafiche dei proprietari di un determinato immobile; • l’elenco degli immobili con i relativi proprietari di una via prefissata della città; • le caratteristiche degli immobili di una certa tipologia con metratura, piano, numero locali. Rappresentare con uno schema E/R le seguenti frasi, indicando la molteplicità delle associazioni individuate e l’obbligatorietà od opzionalità delle partecipazioni alle associazioni: 33 Nell’insieme delle persone: ogni persona ha genitori, i genitori hanno uno o più figli. 34 Nell’insieme delle persone: ogni persona ha una madre, le madri hanno uno o più figli. 35 Nell’insieme dei pezzi che compongono un certo prodotto: ogni pezzo è composto da parti, ogni parte viene utilizzata per comporre pezzi. 36 Le ricette hanno ingredienti, ma spesso nelle ricette si fa riferimento a altre ricette: per esempio per preparare la pasta con sugo di tonno alla Carloforte si utilizzano diversi ingredienti e si richiede a un certo punto di aggiungere il pesto alla genovese che deve essere preparato sfruttando un’altra ricetta. © Istituto Italiano Edizioni Atlas 135 parte prima Progettazione della base di dati capitolo 3 Modellazione dei dati SCHEDA DI AUTOVALUTAZIONE CONOSCENZE Modellazione dei dati Il modello E/R L’entità L’associazione Gli attributi Le associazioni tra entità Regole di lettura Associazione ricorsiva ABILITÀ Individuare le entità, gli attributi della realtà osservata Classificare le associazioni tra entità Disegnare il modello E/R di un problema Verificare la correttezza del modello attraverso le regole di lettura Sviluppare i passi dell’analisi di un problema Individuare problemi nei quali si usano associazioni ricorsive Rappresentare nel modello E/R le associazioni ricorsive DOMANDE PER LA PREPARAZIONE ALLA PROVA ORALE p. 531-532 SOLUZIONI AI QUESITI DI AUTOVERIFICA p. 536 136 © Istituto Italiano Edizioni Atlas 4 parte prima Progettazione della base di dati Modello relazionale OBIETTIVI DI APPRENDIMENTO In questo capitolo conoscerai i concetti base del modello relazionale e imparerai le regole di derivazione del modello logico a partire dal modello entità/associazioni. Sarai in grado di applicare le operazioni relazionali per interrogare una base di dati. Imparerai anche l’importanza della normalizzazione e del controllo sull’integrità dei dati. © Istituto Italiano Edizioni Atlas I concetti fondamentali del modello relazionale La derivazione delle relazioni dal modello E/R Le operazioni relazionali Interrogazioni con più operatori La normalizzazione delle relazioni L’integrità referenziale parte prima Progettazione della base di dati capitolo 4 Modello relazionale 1 I concetti fondamentali del modello relazionale Lo sviluppo di una base di dati di un sistema informativo passa, come abbiamo visto nel precedente capitolo, attraverso diverse fasi progettuali, o livelli: livello concettuale, livello logico e livello fisico. Questo capitolo si occupa del livello logico e, specificatamente, del modello relazionale dei dati. In questo modello una base di dati è vista come un insieme di tabelle sulle quali possono essere eseguite opportune operazioni. Il modello relazionale si chiama così perché è fondato sul concetto matematico di relazione tra insiemi di oggetti. Per comprendere il concetto di relazione e vedere come questo porti naturalmente alla rappresentazione di relazioni mediante tabelle, esaminiamo un semplice esempio. Consideriamo i due insiemi A1 = {4, 9, 16} e A2 = {2,3}. Si dice prodotto cartesiano di A1 e A2, e si indica con A1×A2, l’insieme delle coppie (x,y) dove x appartiene ad A1 e y appartiene ad A2. Ne segue che: A1 = { 4, 9, 16 } A2 = { 2, 3 } A1xA2 = { (x,y) | x ∈ A1, y ∈ A2 } = { (4,2), (4,3), (9,2), (9,3), (16,2), (16,3) } Alcune delle coppie che compongono il prodotto cartesiano sembrano essere più significative di altre; in particolare il sottoinsieme Q, composto dalle coppie di valori (x, y) dove x è il quadrato di y: Q = { (4,2), (9,3) } ⊆ A1xA2 rappresenta la relazione tra coppie (x, y) che può essere descritta con la frase: “x è il quadrato di y”. Si può quindi definire una relazione sui due insiemi A1 e A2 come un sottoinsieme del prodotto cartesiano. A1 x A2 (4,3) (9,2) (16,2) (4,2) (9,3) Q (16,3) Sia A1xA2 che la relazione Q, che ora indicheremo con QuadratoDi, possono essere rappresentati con tabelle. Ogni tabella è composta da tante righe quante sono gli elementi del prodotto cartesiano oppure di QuadratoDi e da due colonne, per rappresentare, ordinatamente, il valore del primo e del secondo elemento delle coppie (x,y). Per evitare ambiguità si può porre in testa a ogni colonna il nome dell’insieme considerato. A1×A2 A1 4 4 9 9 16 16 138 QuadratoDi A2 2 3 2 3 2 3 A1 4 9 A2 2 3 © Istituto Italiano Edizioni Atlas parte prima Progettazione della base di dati capitolo 4 Modello relazionale Riferendoci ora al mondo dell’automobile, consideriamo gli insiemi Modello e Costruttore, così definiti: Modello = { Panda, Idea, C2, C3 }, Costruttore ={ Citroen, Fiat } Il prodotto cartesiano, Modello×Costruttore è formato dalle 8 coppie ottenute componendo un elemento di Modello con un elemento di Costruttore in tutti i modi possibili: { (Panda, Citroen), (Idea, Citroen), (C2, Citroen), (C3, Citroen), (Panda, Fiat), (Idea, Fiat), (C2, Fiat), (C3, Fiat) } Consideriamo ora il sottoinsieme di Modello×Costruttore formato dai quattro elementi: { (C2, Citroen), (C3, Citroen), (Panda, Fiat), (Idea, Fiat) } che indichiamo, in modo significativo, con il nome ProdottoDa. Il prodotto cartesiano ModelloxCostruttore e la relazione ProdottoDa possono essere rappresentate con le seguenti tabelle. Modello x Costruttore Modello C1 C1 C3 Panda Panda Cinquecento Cinquecento Costruttore Citroen Fiat Citroen Fiat Citroen Fiat Citroen ProdottoDa Modello C1 C3 Panda Cinquecento Costruttore Citroen Citroen Fiat Fiat Più in generale: Una relazione su n insiemi A1, A2, ..., An è un sottoinsieme dell’insieme di tutte le n-uple a1, a2, ..., an che si possono costruire prendendo nell’ordine un elemento a1 dal primo insieme A1, a2 dal secondo insieme A2, e così via. Una relazione con n-colonne si indica come una relazione di grado n, il nome con il quale si identifica una colonna si chiama attributo, l’insieme dei valori che possono essere assunti da un attributo definisce il dominio di quell’attributo, e il numero delle n-uple che compongono la tabella (indicate anche con il termine tuple) si chiama cardinalità della relazione. La relazione ProdottoDa è una relazione di grado 2 e cardinalità 4. La coppia (Panda, Fiat) è una delle 4 tuple della relazione. La relazione ha due attributi Modello e Costruttore che assumono valori nei due domini, formati, rispettivamente, dall’insieme dei modelli di automobili prodotte e dall’insieme dei costruttori di automobili. Esaminiamo ora una relazione più complessa, la relazione Automobili. La relazione è rappresentata con una tabella, avente tante colonne quanti sono i domini (grado della relazione) e tante righe quante sono le n-uple (cardinalità della relazione). I nomi dei domini sono i nomi delle colonne, i valori che compaiono in una colonna sono omogenei tra loro, cioè appartengono a uno stesso dominio. La relazione è quindi una collezione di n-uple, ciascuna delle quali contiene i valori di un numero prefissato di colonne. © Istituto Italiano Edizioni Atlas 139 parte prima Progettazione della base di dati capitolo 4 Modello relazionale Automobili Modello Serie 3 Panda Giulietta Bravo Punto C1 C3 Delta Costruttore BMW Fiat Alfa Romeo Fiat Fiat Citroen Citroen Lancia Segmento Porte D Dominio4 di Segmento B 5 C 5 C 5 B 3 B 3 C 5 C 5 Posti 5 5 5 5 5 4 5 5 Cardinalità Grado La relazione rappresenta un’entità, ogni n-upla rappresenta un’istanza dell’entità, le colonne contengono i valori assunti dagli attributi dell’entità. La chiave della relazione è un attributo o una combinazione minimale di attributi che identificano univocamente le n-uple all’interno della relazione, cioè ogni riga della tabella possiede valori diversi per l’attributo (o gli attributi) chiave. La chiave di Automobili è rappresentata dall’attributo Modello. Seguendo una notazione ormai consolidata, si rappresenta una tabella mediante il suo schema, secondo una scrittura del tipo: Automobili (Modello, Costruttore, Segmento, Porte, Posti) indicando tra parentesi, dopo il nome della relazione, i nomi degli attributi separati dalla virgola e sottolineando l’attributo chiave. Si noti la somiglianza con la struttura di un file, formato da record, corrispondenti alle righe della tabella; a sua volta il record è formato dai campi che sono gli attributi della relazione. Per questo motivo, nella terminologia corrente dei database relazionali, si usano spesso anche i termini record e campo al posto di tupla e attributo. Il termine tabella viene inoltre usato come sinonimo di relazione. Il modello relazionale di un database è un insieme di tabelle sulle quali si possono effettuare operazioni, e tra le quali possono essere stabilite associazioni, come vedremo nel seguito. Le tabelle seguenti mostrano le relazioni del database definito dallo schema: Reparti (CodReparto, NomeReparto) Prodotti (CodProdotto, Descrizione, Prezzo, CodReparto) Vendite (Numero, Data, Quantità, CodProdotto) Prodotti Reparti 140 CodReparto NomeReparto CodProdotto Descrizione Prezzo CodReparto AlimFr Alimentari Freschi Anan Ananas sciroppato 1,13 AlimSca AlimSca Alimentari Scatola Can1 Mangime misto 0,55 Can AlimSur Alimenti Surgelati Cing Bocconcini di cinghiale 5,00 Can Cibo per cani Fag Fagioli borlotti 0,60 AlimSca Gat Cibo per gatti FarBia Farina 00 0,90 AlimSca AlimSur FarGia Farina bramata 0,99 AlimSca Gatto1 Patè di salmone 0,65 Gat © Istituto Italiano Edizioni Atlas parte prima Progettazione della base di dati capitolo 4 Modello relazionale Vendite Numero Data Quantità CodProdotto 1 05/09/2011 2 Anan 2 05/09/2011 1 Cing 3 05/09/2011 2 FarGia 4 06/09/2011 1 Gatto1 5 12/09/2011 1 Fag 6 12/09/2011 2 Can1 7 12/09/2011 2 Anan 8 12/09/2011 5 FarBia 9 12/09/2011 1 Can1 I requisiti fondamentali che caratterizzano il modello relazionale sono: a. tutte le righe della tabella contengono lo stesso numero di colonne, corrispondenti agli attributi. b. gli attributi rappresentano informazioni elementari (o atomiche), non scomponibili ulteriormente, cioè non ci sono campi di gruppo che contengono per ogni riga un insieme di valori anziché un solo valore. c. i valori assunti da un campo appartengono al dominio dei valori possibili per quel campo, e quindi sono valori omogenei tra loro, cioè sono dello stesso tipo; d. in una relazione, ogni riga è diversa da tutte le altre, cioè non ci possono essere due righe con gli stessi valori dei campi: questo significa che esiste un attributo o una combinazione di più attributi che identificano univocamente la n-upla, e che assumono perciò la funzione di chiave primaria della relazione. e. le n-uple compaiono nella tabella secondo un ordine non prefissato, cioè non è rilevante il criterio con il quale le righe sono sistemate nella tabella. La chiave (formata da uno o più attributi) identifica la n-upla all’interno della tabella: ogni dato elementare contenuto nel modello relazionale deve essere accessibile attraverso la combinazione di: nome della tabella, nome e valore della chiave, nome della colonna contenente il dato. Per questo motivo il modello relazionale fissa una regola di integrità sui dati, detta integrità sull’entità (entity integrity), secondo la quale la chiave primaria non può avere valore nullo. 2 La derivazione delle relazioni dal modello E//R Dal modello concettuale dei dati è possibile ottenere il modello logico dei dati: in altre parole si può definire la struttura degli archivi adatti per organizzare i dati. Nel caso del modello relazionale le tabelle, che costituiscono il modello logico dei dati vengono ricavate dal modello E/R mediante alcune semplici regole di derivazione: 1. ogni entità diventa una relazione; 2. ogni attributo di un’entità diventa un attributo della relazione, cioè il nome di una colonna della tabella; 3. ogni attributo della relazione eredita le caratteristiche dell’attributo dell’entità da cui deriva; 4. l’identificatore univoco di un’entità diventa la chiave primaria della relazione derivata; 5. l’associazione uno a uno diventa un’unica relazione che contiene gli attributi della prima e della seconda entità; © Istituto Italiano Edizioni Atlas 141 parte prima Progettazione della base di dati capitolo 4 Modello relazionale 6. l’associazione uno a molti viene rappresentata aggiungendo, agli attributi dell’entità che svolge il ruolo a molti, l’identificatore univoco dell’entità che svolge il ruolo a uno nell’associazione. Questo identificatore, che prende il nome di chiave esterna (foreign key) dell’entità associata, è costituito dall’insieme di attributi che compongono la chiave dell’entità a uno dell’associazione. Gli eventuali attributi dell’associazione vengono inseriti nella relazione che rappresenta l’entità a molti, assieme alla chiave esterna. 7. l’associazione molti a molti diventa una nuova relazione (in aggiunta alle relazioni derivate dalle entità) composta dagli identificatori univoci delle due entità e dagli eventuali attributi dell’associazione. La chiave della nuova relazione è formata dall’insieme di attributi che compongo le chiavi delle due entità, oltre agli attributi dell’associazione necessari a garantire l’unicità delle tuple nella relazione ottenuta. Gli esempi seguenti mostrano come si possa passare dallo schema E/R alle corrispondenti tabelle del modello logico. La struttura delle relazioni viene rappresentata mediante il corrispondente schema, facendo seguire al nome della tabella, tra parentesi tonde, l’elenco dei campi corrispondenti agli attributi, separati da virgola. Gli attributi sottolineati indicano la chiave della tabella. La chiave esterna viene evidenziata in corsivo. Inoltre nel passaggio dall’entità alla relazione il nome sarà convertito al plurale, per rappresentare il fatto che la relazione contiene l’insieme delle n-uple che sono le istanze dell’entità. • Associazioni 1:1 Si consideri l’associazione tra l’entità Cittadino e l’entità CodiceSSN: è un’associazione uno a uno in quanto a ogni cittadino è assegnato uno e un solo codice del Servizio Sanitario Nazionale. Lo schema E/R è il seguente: Cittadino 1 1 EssereAssegnato CodiceFiscale {PK} Cognome Nome DataNascita LuogoNascita CodiceSSN CodiceSanitario {PK} NumeroAsl CodRegione da cui si deriva la relazione Anagrafe con gli attributi dell’una e dell’altra entità: Anagrafe (CodiceFiscale, Cognome, Nome, DataNascita, LuogoNascita, CodiceSanitario, NumeroASL, CodRegione) Il campo CodiceFiscale è stato scelto come chiave primaria della relazione. Relazione Attributo Anagrafe CodiceFiscale Cognome Nome DataNascita LuogoNascita CodiceSanitario NumeroASL CodRegione Chiave Formato Dimensione PK carattere carattere carattere data/ora carattere carattere carattere carattere 16 30 30 8 20 8 4 2 Si consideri però l’associazione tra Dipendente e Auto Aziendale nel caso di un’azienda dove, come avviene nella maggior parte dei casi, solo a una piccola parte dei dipendenti è assegnata un’auto aziendale. 142 © Istituto Italiano Edizioni Atlas parte prima Progettazione della base di dati capitolo 4 Modello relazionale Si tratta, in pratica, di un’associazione 1:1 con partecipazione facoltativa di Dipendente. Dipendente 1 1 EssereAssegnata Matricola {PK} Cognome Nome DataNascita LuogoNascita AutoAziendale Targa Modello Costruttore Cilindrata {PK} Se, seguendo la regola generale in casi come questo, dal modello E/R si deriva una sola relazione, si progetta una tabella con il seguente schema: Dipendenti (Matricola, Cognome, Nome, DataNascita, LuogoNascita, Targa, Modello, Costruttore, Cilindrata) Si otterrà una tabella con molte righe con valori nulli nei campi Targa, Modello, Costruttore, Cilindrata, in corrispondenza di tutti i dipendenti che non hanno un’auto aziendale assegnata. In questi casi si preferisce modellare queste situazioni con due tabelle separate, in corrispondenza delle due entità Dipendente e AutoAziendale , e rappresentare l’associazione EssereAssegnata aggiungendo agli attributi di AutoAziendale la chiave primaria della tabella Dipendenti. Dipendenti (Matricola, Cognome, Nome, DataNascita, LuogoNascita) AutoAziendali (Targa, Modello, Costruttore, Cilindrata, Matricola) Si noti che, in pratica, l’associazione 1:1 è stata modellata come se si trattasse di un’associazione 1:N, con l’entità Dipendente vista come entità a uno nell’associazione. Si veda al riguardo la regola di derivazione 6 alla pagina precedente. Alla luce di questa osservazione la regola di derivazione di 5 diventa: L’associazione uno a uno del modello concettuale viene tradotta, salvo alcune opportune eccezioni, in un’unica relazione che contiene gli attributi della prima e della seconda entità. L’argomento è ripreso in dettaglio nel riquadro a fine paragrafo. • Associazioni 1:N Nel seguente schema E/R, l’associazione tra l’entità Contratto e l’entità Dipendente è di tipo uno a molti, in quanto ogni contratto può essere applicato a uno o più dipendenti, e ogni dipendente deve essere regolato da un solo contratto di lavoro. Contratto Codice {PK} Descrizione StipendioBase DataScadenza 1 N Applicare Dipendente Matricola Cognome Nome Indirizzo Qualifica {PK} Si costruiscono due relazioni Contratti e Dipendenti con gli attributi delle corrispondenti entità. Viene aggiunta una chiave esterna alla tabella Dipendenti, costituita dalla chiave primaria di Contratti. Contratti (Codice, Descrizione, StipendioBase, DataScadenza) Dipendenti (Matricola, Cognome, Nome, Indirizzo, Qualifica, CodiceContratto) © Istituto Italiano Edizioni Atlas 143 parte prima Progettazione della base di dati Relazione Attributo Contratti Dipendenti capitolo 4 Modello relazionale Chiave Formato Dimensione Codice Descrizione StipendioBase DataScadenza PK numerico carattere numerico data/ora 3 30 10 8 Matricola Cognome Nome Indirizzo Qualifica CodiceContratto PK carattere carattere carattere carattere carattere numerico 7 30 25 30 10 3 FK Agli attributi della relazione Dipendenti (a molti) è stata aggiunta come chiave esterna (FK, Foreign Key) CodiceContratto, cioè la chiave primaria della relazione Contratti (a uno). Esaminiamo ora il caso di un’associazione con attributi. Il diagramma E/R in figura rappresenta l’associazione uno a molti di nome Acquistare che intercorre tra Persona e Automobile. 1 Persona CodiceFiscale Cognome Nome DataNascita Indirizzo Acquistare N {PK} Automobile Targa {PK} Modello Produttore Cilindrata PrezzoListino DataAcquisto PrezzoAcquisto Una persona può acquistare una o più automobili, mentre un’automobile deve essere acquistata da una sola persona. Applicando le regole di derivazione si ottengono le relazioni: Persone (CodiceFiscale, Cognome, Nome, DataNascita, Indirizzo) Automobili (Targa, Modello, Produttore, Cilindrata, PrezzoListino, CodiceFiscale, DataAcquisto, PrezzoAcquisto) dove, agli attributi propri di Automobile, è stata aggiunta la chiave esterna CodiceFiscale e i due attributi dell’associazione Acquistare. In generale dal modello concettuale vengono derivate le relazioni che rappresentano le entità e l’associazione uno a molti viene tradotta aggiungendo agli attributi dell’entità a molti la chiave dell’entità a uno e gli attributi dell’associazione. • Associazioni N:N Si considerino le entità Docente e Classe nel contesto di un complesso scolastico formato da classi di scuole elementari e medie inferiori: tra le due entità si può stabilire un’associazione molti a molti, in quanto ogni docente può insegnare in una o più classi, e ogni classe deve avere due o più docenti. Docente CodiceDocente {PK} Cognome Nome Qualifica Materia 144 N Insegnare NumeroOre N Classe SiglaClasse {PK} NumeroAlunni Aula © Istituto Italiano Edizioni Atlas parte prima Progettazione della base di dati capitolo 4 Modello relazionale Accanto alle tabelle Docenti e Classi viene creata una nuova relazione, chiamata Insegnare, il cui record contiene gli attributi chiave delle due entità considerate. Poiché l’associazione è caratterizzata dalla presenza di un attributo, la nuova tabella contiene, oltre alle chiavi delle due entità correlate, anche l’attributo NumeroOre che indica le ore di insegnamento del docente in una classe. NumeroOre non è attributo né di Docenti, né di Classi, ma dell’associazione: esso diventa un campo di Insegnare. Docenti (CodiceDocente, Cognome, Nome, Qualifica, Materia) Classi (SiglaClasse, NumeroAlunni, Aula) Insegnare (CodiceDocente, SiglaClasse, NumeroOre) Bisogna porre molta attenzione nell’identificare la chiave primaria della nuova relazione: nel caso in esame la coppia di attributi CodiceDocente, SiglaClasse è sufficiente per identificare univocamente una riga di Insegnare, in quanto nella tabella un docente compare una sola volta per una data classe. Ma non è sempre così, come si può osservare nel seguente esempio. Consideriamo le entità Studente, Materia e l’associazione Valutare di tipo molti a molti. Il diagramma E/R, riportato sotto, evidenzia gli attributi delle due entità e dell’associazione. Per fissare le idee inquadriamo il problema nel contesto di una specifica classe e di un solo anno scolastico. Studente Matricola Cognome Nome Indirizzo Telefono N Valutare {PK} Data Voto N Materia CodiceMateria {PK} NomeMateria NumeroOre Applicando le regole di derivazione si ottengono le relazioni definite dai seguenti schemi: Studenti (Matricola, Cognome, Nome, Indirizzo, Telefono) Materie (CodiceMateria, NomeMateria, NumeroOre) Valutazioni (Matricola, CodiceMateria, Data, Voto) Resta da stabilire quale sia l’insieme minimo di attributi che permette di distinguere tra le n-uple di Valutazioni. La coppia di attributi Matricola, CodiceMateria non risponde a questa esigenza in quanto, nel corso dell’anno, uno studente viene valutato più di una volta nella medesima materia. Nell’ipotesi che uno studente non possa essere valutato nella medesima materia nello stesso giorno, la chiave primaria di Valutazioni è formata dall’insieme di tre attributi: Matricola, CodiceMateria, Data. In generale, nel caso dell’associazione molti a molti, vengono derivate le relazioni corrispondenti alle entità e l’associazione viene tradotta con una terza relazione contenente le chiavi delle due entità e gli eventuali attributi dell’associazione. ASSOCIAZIONI 1:1 CON PARTECIPAZIONE FACOLTATIVA E ASSOCIAZIONI RICORSIVE Nello schema E/R nella figura seguente è descritta l’associazione uno a uno di nome Coordinare che esiste tra i docenti e le classi di una scuola: ogni classe deve avere uno e un solo coordinatore, un docente coordina una sola classe, ma vi sono docenti che non sono coordinatori. Come si è osservato in precedenza, in casi come questo la scelta di creare una sola relazione, composta da tutti gli attributi delle entità partecipanti all’associazione, appare inadeguata. In questo caso, infatti, comparirebbero molte righe con valori nulli in corrispondenza degli attributi di Classe per i docenti che non sono coordinatori. © Istituto Italiano Edizioni Atlas 145 parte prima Progettazione della base di dati Docente capitolo 4 Modello relazionale 1 1 Coordinare CodiceDocente {PK} Cognome Nome Qualifica Materia Classe SiglaClasse {PK} NumeroAlunni Aula Una soluzione migliore consiste nel trattare questa associazione come un’associazione uno a molti. Si costruiscono due relazioni con gli attributi che caratterizzano le due entità, e l’associazione viene modellata aggiungendo la chiave dell’entità con partecipazione facoltativa all’associazione (Docente) in coda agli attributi dell’entità con partecipazione obbligatoria (Classe). Docenti (CodiceDocente, Cognome, Nome, Qualifica, Materia) Classi (SiglaClasse, NumeroAlunni, Aula, Coordinatore) Nel caso di partecipazione facoltativa di entrambe le entità, per esempio nel caso in cui anche la partecipazione di Classe sia facoltativa, non ci sono indicazioni per la scelta dell’entità che fornisce la chiave destinata a diventare chiave esterna. In questa situazione è possibile aggiungere CodiceDocente in coda agli attributi di Classe o, viceversa, arricchire gli attributi di Docente con la chiave di Classe. Si osservi che questa regola è tanto più utile quanto meno frequenti sono le partecipazioni all’associazione. Si pensi a casi limite quale, per esempio, quello delle due entità CittadinoItaliano e Senatore. Poiché ogni cittadino italiano può essere senatore e un senatore deve essere un cittadino italiano, tra le due entità sussiste un’associazione uno a uno con partecipazione “molto facoltativa” di cittadino, in quanto i cittadini italiani sono circa 60.000.000 mentre, secondo la Costituzione italiana, il numero dei senatori è fissato in 315, oltre a un limitato numero di senatori a vita. Si noti infine che mantenere due tabelle distinte per le due entità, anche quando esse sono in associazione uno a uno, può essere una scelta importante. Se la fase di analisi del problema reale ha portato ad individuare due entità distinte può significare che ogni entità descrive realtà specifiche che è bene rimangano separate. Per esempio, gli attributi che descrivono un senatore della Repubblica, quali: data dell’elezione, collegio nel quale è stato eletto, gruppo parlamentare di appartenenza, sono molto specifici e ben distinti da quelli che servono a descrivere un cittadino italiano. Le associazioni ricorsive sono state presentate nel precedente capitolo. In figura è mostrata un’associazione ricorsiva uno a molti tra i dipendenti di un’impresa: alcuni dipendenti sono anche supervisori e coordinano un certo numero di persone; i dipendenti coordinati (collaboratori) dipendono da un solo supervisore, ma vi sono dipendenti che non dipendono da alcun supervisore. Coordinare 1 Supervisore Dipendente N Collaboratore 146 Matricola Cognome Nome DataNascita Indirizzo {PK} © Istituto Italiano Edizioni Atlas parte prima Progettazione della base di dati capitolo 4 Modello relazionale L’associazione viene rappresentata come le normali associazioni uno a molti, aggiungendo agli attributi dell’entità a molti la chiave della entità a uno. In questo caso, poiché compare la medesima entità sia dalla parte a uno che dalla parte a molti dell’associazione, la chiave di Dipendente apparirà sia come chiave primaria della relazione, sia come chiave esterna per individuare il supervisore (se esiste) di un dipendente. Se gli attributi di Dipendente sono: Matricola, Cognome, Nome, DataNascita, Indirizzo, si ottiene lo schema: Dipendenti (Matricola, Cognome, Nome, DataNascita, Indirizzo, Supervisore) dove l’attributo Supervisore assume il valore della matricola del supervisore del dipendente descritto nella n-upla. Volendo evitare la presenza di righe con valori nulli nel campo Supervisore di dipendente, si può adottare una soluzione differente. L’entità Dipendente viene rappresentata con gli attributi che le competono e l’associazione diventa una nuova relazione che abbina dipendenti e supervisori mediante le rispettive matricole: Dipendenti (Matricola, Cognome, Nome, DataNascita, Indirizzo) Coordinamenti (Matricola, Supervisore) Nella relazione Coordinamenti sono presenti le sole n-uple dei dipendenti che hanno un supervisore e non si hanno attributi con valori nulli. Considerazioni simili si possono fare anche per le associazioni uno a uno ricorsive. AUTOVERIFICA Domande da 1 a 13 pag. 177-179 Problemi da 1 a 5 pag. 182-183 3 Le operazioni relazionali In generale gli operatori relazionali agiscono su una o più relazioni per ottenere una nuova relazione. In sostanza le operazioni relazionali consentono di effettuare le interrogazioni alla base di dati per ottenere le informazioni desiderate estraendo da una tabella una sottotabella, oppure combinando tra loro due o più tabelle e generando così nuove relazioni. Per illustrare le operazioni relazionali faremo riferimento al seguente esempio. Si consideri il modello E/R, molto semplificato, con le entità Agente e Cliente, per rappresentare la distribuzione commerciale di un’azienda. Tra le due entità esiste un’associazione uno a molti, perché ogni agente può contattare uno o più clienti, mentre ogni cliente deve essere contattato da un solo agente. La partecipazione di Cliente è obbligatoria mentre la partecipazione di Agente è facoltativa. 1 Agente IDAgente Nome Zona N Contattare {PK} Cliente IDCliente {PK} RagioneSociale PartitaIVA Provincia La struttura delle tabelle derivate è descritta dal seguente schema: Agenti (IDAgente, Nome, Zona) Clienti (IDCliente, RagioneSociale, PartitaIVA, Provincia, IDAgente) Il modello relazionale è quindi formato dalle due relazioni Agenti e Clienti; l’associazione uno a molti viene rappresentata aggiungendo agli attributi della relazione Clienti il campo IDAgente come chiave esterna. © Istituto Italiano Edizioni Atlas 147 parte prima Progettazione della base di dati capitolo 4 Modello relazionale Per distinguere tra il campo IDAgente di Agenti e il campo omonimo di Clienti si fa uso della notazione con il punto (dot-notation), secondo la quale il nome di un attributo è completamente specificato dal nome della tabella seguito da un punto e dal nome del campo: NomeTabella.NomeAttributo I due campi sono referenziati con Agenti.IDAgente e Clienti.IDAgente. Questa notazione deve essere utilizzata obbligatoriamente solo in caso di omonimie per evitare riferimenti ambigui agli attributi. Il database composto dalle due relazioni Agenti e Clienti, con alcune righe di esempio, è mostrato in figura. Clienti Agenti IDCliente RagioneSociale PartitaIVA Lami 04357839912 Lamiere per Auto Provincia IDAgente IDAgente Nome Zona TO Bia Bia Nord Bianchi Levi Levigatoria Toscana 01528120155 FI Ner Bru Bruni Centro Luci Lucidatura Metalli 01572800164 RM Ner Ner Neri Centro Meta Metallurgica Emiliana 01583315265 BO Ner Ros Rossi Sud Metb Metalli Rari 01642877201 NA Ros Ver Verdi Isole Otto Ottonificio Pugliese 04687990657 BA Ros Prome Prodotti Metallici 05332518672 BG Gia Rame Rame & Metalli 03568168943 PA Ver Tond Tondini metallici 05467833808 BS Bia Vite Viteria Lombarda 05567389302 MI Bia Vitp Viteria di Precisione 06443652006 MI Bia Le principali operazioni relazionali sono: la Selezione, la Proiezione e la Congiunzione. Selezione e proiezione sono operazioni che agiscono su una sola tabella, mentre la congiunzione è un’operazione che agisce su due tabelle. La selezione è un’operazione che estrae da una tabella solo alcune righe, mentre la proiezione è un’operazione che estrae solo alcune colonne di una tabella. La figura mostra un esempio di selezione e un esempio di proiezione sulla tabella Agenti. Agenti IDAgente Nome Zona Bia Bianchi Nord Bru Bruni Centro Ner Neri Centro Ros Rossi Sud Ver Verdi Isole IDAgente Nome Selezione Zona Bru Bruni Centro Ner Neri Centro Le righe di Agenti dove: Zona = “Centro” Proiezione 148 Nome Zona Bianchi Nord Bruni Centro Neri Centro Rossi Sud Verdi Isole Le colonne Nome e Zona di Agenti © Istituto Italiano Edizioni Atlas parte prima Progettazione della base di dati capitolo 4 Modello relazionale 1. La selezione genera una nuova relazione costituita solo dalle n-uple della relazione di partenza che soddisfano a una determinata condizione; vengono cioè selezionate le righe con i valori degli attributi corrispondenti alla condizione prefissata. • Grado: la relazione ottenuta possiede tutte le colonne della relazione di partenza, e quindi ha lo stesso grado. • Cardinalità: nella nuova relazione la cardinalità può essere minore o uguale alla tabella di partenza, ma è ragionevole pensare che sia solitamente minore. La cardinalità è uguale quando tutte le righe soddisfano alla condizione. L’operazione di selezione viene indicata mediante il simbolo σ seguito dal nome della tabella T sulla quale viene operata la selezione. La proprietà P, che caratterizza l’operazione di selezione sulle righe di T, viene scritta come indice di σ. La scrittura: σPT indica un’operazione su T che estrae le sole righe per le quali la proprietà P è vera. Per esempio, se si vuole l’elenco dei clienti della provincia di Milano, si effettua sulla relazione Clienti una selezione per ricercare quelle righe che soddisfano la proprietà Provincia = “MI”, selezionando dalla tabella tutte le righe che hanno valore “MI” per l’attributo Provincia. Si ottiene una nuova tabella, che costituisce la relazione generata a partire da quella iniziale. Nell’esempio in esame si ottiene la tabella: IDCliente RagioneSociale PartitaIVA Provincia IDAgente Vite Viteria Lombarda 05567389302 MI Bia Vitp Viteria di Precisione 06443652006 MI Bia Utilizzando un linguaggio di progetto (o di pseudocodifica), cioè con parole del linguaggio naturale, l’operazione di selezione può essere descritta in questo modo: σP Clienti Selezione di Clienti per Provincia = “MI” 2. La proiezione genera una nuova relazione estraendo dalla tabella iniziale solo alcune colonne. • Grado: nella relazione risultante il grado è minore o uguale al grado della relazione di partenza. Il grado è uguale a quello di partenza nel caso di una proiezione effettuata allo scopo di produrre una tabella con le colonne riordinate. • Cardinalità: nella relazione risultante la cardinalità è minore o uguale a quella di partenza. La cardinalità nella maggior parte dei casi è uguale a quella di partenza. È minore se, per effetto della proiezione su un numero di colonne minore di quello originale, si ottiene una tabella con righe uguali (per esempio se tra le colonne estratte non è compresa la colonna della chiave): in questo caso le righe duplicate diventano una sola perché il modello relazionale richiede, come è stato detto in precedenza, che le n-uple di una relazione siano tutte distinte. Questa caratteristica è valida solo in teoria: la maggior parte dei DBMS commerciali, per ragioni di efficienza, non effettua alcun controllo in merito all’unicità delle righe di una tabella, a meno che questo non venga esplicitamente richiesto dall’utente con un apposito comando. Riprenderemo l’argomento nei prossimi capitoli. L’operazione di proiezione viene indicata mediante il simbolo Π seguito dal nome della tabella T sulla quale viene operata la proiezione. La lista L che elenca le colonne da estrarre da T, viene riportata come indice di Π. La scrittura: ΠLT indica un’operazione su T che estrae le colonne elencate in L. Per esempio, se si vuole l’elenco dei codici dei clienti con la ragione sociale e il codice dell’agente, occorre applicare alla relazione Clienti l’operazione di proiezione secondo la lista degli attributi IDCliente, RagioneSociale e IDAgente. © Istituto Italiano Edizioni Atlas 149 parte prima Progettazione della base di dati capitolo 4 Modello relazionale In pseudocodifica si scrive: ΠL Clienti Proiezione di Clienti su IDCliente, RagioneSociale, IDAgente La proiezione dell’esempio produce la tabella in figura. IDCliente RagioneSociale IDAgente Lami Lamiere per Auto Bia Levi Levigatoria Toscana Ner Luci Lucidatura Metalli Ner Meta Metallurgica Emiliana Ner Metb Metalli Rari Ros Otto Ottonificio Pugliese Ros Prome Prodotti Metallici Gia Rame Rame & Metalli Ver Tond Tondini metallici Bia Vite Viteria Lombarda Bia Vitp Viteria di Precisione Bia Nella figura sottostante è mostrata la tabella ∏ ottenuta con la proiezione ∏ IDAgente Clienti, cioè per effetto della proiezione di Clienti sul solo attributo IDAgente. Si osservi, dal confronto con la tabella T, che rappresenta l’intera colonna IDAgente di Clienti, che ∏ è formata da sole quattro righe per effetto della riduzione a una delle righe duplicate di T, evidenziate in colore. T ∏ IDAgente IDAgente Bia Ner Ner Ner Ros Ros Gia Ver Bia Bia Bia Bia Ner Ros Gia Ver 3. La congiunzione (join) tra due tabelle R e S, di schema: R(A1, A2, … Am) S(B1, B2, … Bn) combina due relazioni generando una nuova relazione le cui righe contengono tutti gli attributi di R e quelli di S abbinando le sole righe di R e di S che soddisfano una data proprietà P. In pratica, nella quasi totalità delle congiunzioni, la proprietà P consiste in una o più condizioni di uguaglianza tra attributi di R e attributi di S, cioè P è una condizione del tipo: R.A1 = S.B1 and R.A2 = S.B2. Questo tipo di congiunzioni sono indicate con il nome di equi-join. La relazione risultante è caratterizzata da: • Grado: se il grado (cioè il numero delle colonne) delle relazioni R ed S è m e, rispettivamente, n, il grado della relazione generata è uguale a m+n. 150 © Istituto Italiano Edizioni Atlas parte prima Progettazione della base di dati capitolo 4 Modello relazionale • Cardinalità: nel caso di join generici la cardinalità della relazione risultante non è prevedibile a priori e si può solo dire che il numero di righe della relazione risultante è minore o uguale (in genere minore) al prodotto del numero di righe di R e quelle di S. Nel caso di equi-join che coinvolgano una chiave esterna di B con la corrispondente chiave primaria della tabella associata A, la cardinalità della congiunzione ha valore minore od uguale alla cardinalità di B. In questo tipo di congiunzione, infatti, ogni riga di B (cioè della relazione che svolge il ruolo a molti) è combinata con una sola riga di A (la relazione che svolge il ruolo a uno) e ci possono essere righe di B con un valore per la chiave esterna che non trova corrispondenti nella chiave primaria di A. Per esempio, la congiunzione tra Clienti e Agenti per valori identici dei campi Clienti.IDAgente ed Agente.IDAgente genera la tabella in figura. IDCliente Ragione Sociale PartitaIVA Lami Lamiere per Auto 04357839912 Provincia Clienti. Agenti. IDAgente IDAgente Nome Zona TO Bia Bia Bianchi Nord Levi Levigatoria Toscana 01528120155 FI Ner Ner Neri Centro Luci Lucidatura Metalli 01572800164 RM Ner Ner Neri Centro Meta Metallurgica Emiliana 01583315265 BO Ner Ner Neri Centro Metb Metalli Rari 01642877201 NA Ros Ros Rossi Sud Otto Ottonificio Pugliese 04687990657 BA Ros Ros Rossi Sud Rame Rame & Metalli 03568168943 PA Ver Ver Verdi Isole Tond Tondini metallici 05467833808 BS Bia Bia Bianchi Nord Vite Viteria Lombarda 05567389302 MI Bia Bia Bianchi Nord Vitp Viteria di Precisione 06443652006 MI Bia Bia Bianchi Nord Nell’operare la congiunzione secondo le regole dell’equi-join, ogni riga di Clienti viene confrontata con le righe di Agenti e vengono selezionate le sole righe per le quali l’attributo IDAgente di Clienti ha il medesimo valore dell’attributo IDAgente di Agenti: Clienti.IDAgente = Agenti.IDAgente Grazie alla congiunzione si riescono a correlare informazioni in tabelle differenti: dall’esempio in figura si nota che, dopo avere congiunto le tabelle Clienti e Agenti, per ogni cliente è possibile conoscere, oltre al codice dell’agente, anche il nome e la zona dove opera l’agente a lui assegnato. Si può controllare che la congiunzione tra Clienti e Agenti ha 10 righe, ovvero il numero di righe di Clienti diminuito di 1. Questo succede perché nella tabella Clienti è presente la riga con chiave ‘Prome’ che ha la chiave esterna di valore ‘Gia’ e non c’è alcun record di Agenti con questo valore per la chiave primaria. L’esempio mostra anche che l’equi-join produce una relazione con informazioni ridondanti, in quanto la colonna (o le colonne) che sono confrontate per ricercare valori identici sono duplicate. Nel caso delle relazioni Agenti e Clienti si tratta della colonna IDAgente che compare due volte. Si deve quindi realizzare una congiunzione che eviti questa ridondanza per gli attributi comuni. Questo tipo di congiunzione prende il nome di join naturale. Nel join naturale sono combinate le sole righe delle due tabelle con valori identici negli attributi comuni che sono presenti una sola volta nelle righe della congiunzione. Il join naturale tra R ed S è caratterizzato da: • Grado: se il grado delle relazioni R ed S è m ed n e le due tabelle hanno k attributi comuni, allora R join S ha grado uguale a m+n-k. • Cardinalità: per la cardinalità di R join S valgono le considerazioni già svolte per l’equi-join. © Istituto Italiano Edizioni Atlas 151 parte prima Progettazione della base di dati capitolo 4 Modello relazionale Il join naturale viene indicato con il simbolo posto tra le due relazioni R e S che sono combinate. L’attributo A, comune alle due tabelle, è riportato come indice dei nomi delle tabelle. Nel caso della relazione Clienti, per esempio, l’elenco dei clienti e dei relativi agenti si ottiene applicando l’operazione di congiunzione tra la relazione Clienti e la relazione Agenti secondo l’attributo comune IDAgente, selezionando quindi solo le righe per le quali vale la proprietà: Agenti.IDAgente = Clienti.IDAgente Questa operazione si rappresenta in pseudocodifica nel seguente modo: RA SA Congiunzione di Clienti e Agenti su IDAgente Il join naturale genera la tabella in figura. Per effetto della congiunzione si ottiene un’unica tabella dove le righe di Clienti sono state completate con tutti gli attributi di Agenti. Si noti anche che il campo IDAgente, presente in entrambe le tabelle, non è stato duplicato. IDCliente RagioneSociale PartitaIVA Provincia IDAgente Nome Zona Lami Lamiere per Auto 04357839912 TO Bia Bianchi Nord Levi Levigatoria Toscana 01528120155 FI Ner Neri Centro Luci Lucidatura Metalli 01572800164 RM Ner Neri Centro Meta Metallurgica Emiliana 01583315265 BO Ner Neri Centro Metb Metalli Rari 01642877201 NA Ros Rossi Sud Otto Ottonificio Pugliese 04687990657 BA Ros Rossi Sud Rame Rame & Metalli 03568168943 PA Ver Verdi Isole Tond Tondini metallici 05467833808 BS Bia Bianchi Nord Vite Viteria Lombarda 05567389302 MI Bia Bianchi Nord Vitp Viteria di Precisione 06443652006 MI Bia Bianchi Nord La congiunzione è realizzata facendo corrispondere valori uguali per attributi comuni nelle due tabelle: per questo motivo il join naturale è anche un equi-join. L’equi-join è però un join di caratteristiche più generali del join naturale e permette di congiungere tabelle confrontando attributi che hanno nomi diversi, ma valore uguale, nelle due relazioni che vengono combinate. Supponiamo, per esempio, che le relazioni Clienti e Agenti siano state definite per mezzo del seguente schema: Agenti (IDAgente, Nome, CodiceZona) Clienti (IDCliente, RagioneSociale, PartitaIVA, Provincia, AgenteDiZona) Questo schema differisce da quello adottato in precedenza solo per il nome della chiave esterna che si chiama AgenteDiZona e non IDAgente. In questo caso le due tabelle non hanno, almeno formalmente, attributi comuni perché non ci sono attributi con lo stesso nome nelle due tabelle, ma, di fatto, IDAgente e AgenteDiZona sono attributi comuni. Per trattare questa situazione adotteremo la seguente forma di pseudocodifica: RA SB Congiunzione di Agenti su IDAgente e Clienti su AgenteDiZona oppure RPK SFK Congiunzione di Agente su CodiceID e Cliente su AgenteDiZona per evidenziare la chiave primaria (PK) e la chiave esterna (FK) delle due tabelle. 152 © Istituto Italiano Edizioni Atlas parte prima Progettazione della base di dati capitolo 4 Modello relazionale 4. Oltre alle operazioni di proiezione, selezione e congiunzione, sulle tabelle si possono eseguire le operazioni insiemistiche di unione, intersezione e differenza che permettono di combinare due relazioni R ed S, di identico schema, (attributi uguali in nome e numero), costruendo le relazioni: • R ∪ S: l’unione di R ed S è formata dalle righe presenti in R oppure in S; • R ∩ S: l’intersezione di R ed S è formata dalle righe comuni ad R ed S; • R – S : la differenza tra R ed S è formata dalle righe di R che non sono presenti in S. JOIN ESTERNO Il join esterno (outer join) è una congiunzione che restituisce le righe dell’una e dell’altra tabella anche se non sono presenti valori uguali per gli attributi comuni; nel join naturale e nell’equi-join, indicati come join interni, sono combinate, infatti, solo le righe per le quali, per ogni attributo comune tra le tabelle, il valore dell’attributo nella prima tabella trova un valore uguale nel corrispondente attributo nella seconda tabella. Per esempio, nel caso della congiunzione Clienti join Agenti si osserva, per confronto con le tabelle Clienti e Agenti, che, nella congiunzione, non compare il cliente di codice “Prome” e nemmeno l’agente di codice “Bru”. Questo succede perché nel record del cliente l’attributo IDAgente vale “Gia” e non c’è alcun record di Agenti con questo valore della chiave. L’agente di codice “Bru” non è presente nella congiunzione perché non c’è alcun cliente al quale è stato assegnato quell’agente. Nel primo caso a un cliente è stato attribuito, presumibilmente per errore, un codice agente non corretto; nel secondo caso c’è un agente senza clienti. I join esterni permettono di includere anche queste righe nella congiunzione e, come si vedrà, di individuare eventuali situazioni anomale. Il join esterno può essere left join quando elenca comunque tutte le righe della prima tabella congiungendo, tra le righe della seconda, solo quelle per le quali si trovano valori corrispondenti per gli attributi comuni. Nella congiunzione le righe senza corrispondenti nella seconda tabella sono completate con valori nulli. Congiungendo con un left join le tabelle Clienti e Agenti sul campo IDAgente si ottiene la tabella in figura. Clienti Left Join Agenti IDCliente Ragione Sociale PartitaIVA Nome Zona Lami Lamiere per Auto 04357839912 TO Bia Bia Bianchi Nord Levi Levigatoria Toscana 01528120155 FI Ner Ner Neri Centro Luci Lucidatura Metalli 01572800164 RM Ner Ner Neri Centro Meta Metallurgica Emiliana 01583315265 BO Ner Ner Neri Centro Metb Metalli Rari 01642877201 NA Ros Ros Rossi Sud Otto Ottonificio Pugliese 04687990657 BA Ros Ros Rossi Sud Prome Prodotti Metallici 05332518672 BG Gia Rame Rame & Metalli 03568168943 PA Ver Tond Tondini metallici 05467833808 BS Vite Viteria Lombarda 05567389302 MI valori corrispondenti sono completate Bia Bia Bianchi con valori nulli Vitp Viteria di Precisione 06443652006 MI Bia © Istituto Italiano Edizioni Atlas Provincia Clienti. Agenti. IDAgente IDAgente Ver Verdi LeBia righe di Clienti Bia senza Bianchi Bia Bianchi Isole Nord Nord Nord 153 parte prima Progettazione della base di dati capitolo 4 Modello relazionale Se su questa tabella si opera una selezione per considerare le sole righe con valori nulli nel campo Agenti.IDAgente si ottiene l’elenco dei clienti ai quali è stato attribuito un codice agente non corretto. Il risultato della selezione è mostrato in figura. IDCliente Ragione Sociale PartitaIVA Prome Prodotti Metallici 05332518672 Provincia BG Clienti. Agenti. IDAgente IDAgente Nome Zona Gia Il right join restituisce comunque tutte le righe della seconda tabella e di queste congiunge, con le righe della prima tabella, solo quelle per le quali si possono trovare valori corrispondenti per gli attributi comuni. Nella congiunzione con il right join le righe senza corrispondenti nella prima tabella sono completate con valori nulli. Congiungendo con un right join le tabelle Clienti e Agenti sul campo IDAgente si ottiene la tabella in figura. Clienti Right Join Agenti IDCliente Ragione Sociale PartitaIVA Lami Lamiere per Auto 04357839912 Levi Levigatoria Toscana 01528120155 Provincia TO FI Clienti. Agenti. IDAgente IDAgente Bia Ner Nome Zona Bia Bianchi Nord Bru Bruni Centro Ner Neri Centro Ner Neri Centro Ner Neri Centro Meta Le righe di Agenti senza Lucidatura Metalli 01572800164 RM Ner valori corrispondenti sono completate Metallurgica Emiliana 01583315265con valori BO nulli Ner Metb Metalli Rari 01642877201 NA Ros Ros Rossi Sud Otto Ottonificio Pugliese 04687990657 BA Ros Ros Rossi Sud Rame Rame & Metalli 03568168943 PA Ver Ver Verdi Isole Tond Tondini metallici 05467833808 BS Bia Bia Bianchi Nord Vite Viteria Lombarda 05567389302 MI Bia Bia Bianchi Nord Vitp Viteria di Precisione 06443652006 MI Bia Bia Bianchi Nord Luci Ricercando nel right join le righe con valori nulli nel campo Clienti.IDAgente è possibile identificare gli agenti ai quali non è associato alcun cliente, come succede, nell’esempio, per l’agente di nome Bruni. IDCliente Ragione Sociale PartitaIVA Provincia Clienti. Agenti. IDAgente IDAgente Bru Nome Zona Bruni Centro I due esempi mostrano l’importanza di left join e right join per risolvere i problemi di assenza, cioè problemi nei quali bisogna saper rispondere a quesiti del tipo: “chi sono gli agenti senza clienti?”, “chi sono i clienti che non hanno effettuato alcun acquisto?”, “chi sono gli studenti senza voti?”. Vi è anche un join esterno di nome full join che combina le caratteristiche del left join con quelle del right join includendo tutte le n-uple di entrambe le relazioni. Il full join di Clienti e Agenti è mostrato nella figura seguente. 154 © Istituto Italiano Edizioni Atlas parte prima Progettazione della base di dati capitolo 4 Modello relazionale Clienti Full Join Agenti IDCliente Ragione Sociale PartitaIVA Provincia Lami Lamiere per Auto 04357839912 TO Clienti. Agenti. IDAgente IDAgente Bia Nome Zona Bia Bianchi Nord Bru Bruni Centro Levi Levigatoria Toscana 01528120155 FI Ner Ner Neri Centro Luci Lucidatura Metalli 01572800164 RM Ner Ner Neri Centro Meta Metallurgica Emiliana 01583315265 BO Ner Ner Neri Centro Metb Metalli Rari 01642877201 NA Ros Ros Rossi Sud Otto Ottonificio Pugliese 04687990657 BA Ros Ros Rossi Sud Prome Prodotti Metallici 05332518672 BG Gia Rame Rame & Metalli 03568168943 PA Ver Ver Verdi Isole Tond Tondini metallici 05467833808 BS Bia Bia Bianchi Nord Vite Viteria Lombarda 05567389302 MI Bia Bia Bianchi Nord Vitp Viteria di Precisione 06443652006 MI Bia Bia Bianchi Nord Il self join è una congiunzione con la quale vengono combinate righe di una tabella con righe della stessa tabella quando sono presenti valori corrispondenti tra attributi, cioè due attributi con lo stesso dominio. La tabella della figura seguente, di nome Impiegati, elenca i dati di alcuni dipendenti con l’indicazione del codice del rispettivo dirigente. Dalla tabella si vede, per esempio, che Bianchi ha come dirigente Gatti che, a sua volta, dipende da Leoni. Volendo ottenere una tabella dei dipendenti comprendente anche i dati anagrafici dei rispettivi dirigenti, si deve congiungere la tabella Impiegati con una copia di se stessa. Le due tabelle vanno congiunte sul campo Dir della prima e Codice della seconda. Per poter distinguere nella condizione di congiunzione tra gli attributi di Impiegati e quelli della copia è necessario cambiare il nome agli attributi di una delle due. Impiegati Codice Cognome Stipendio 1 Bianchi 26000 5 2 Neri 24000 5 3 Rossi 28000 5 4 Viola 30000 5 5 Gatti 40000 6 6 Leoni 45000 7 Mori 24000 © Istituto Italiano Edizioni Atlas Dir 6 155 parte prima Progettazione della base di dati capitolo 4 Modello relazionale Il risultato della congiunzione è mostrato in figura. Si osservi come agli attributi della seconda tabella è stato cambiato nome, semplificando la lettura dei dati e, soprattutto, rendendo possibile la scrittura della condizione di congiunzione. ERIA Cognome Stipendio Dir CognomeDir StipendioDir DirDelDir 1 Bianchi 26000 5 Gatti 40000 6 2 Neri 24000 5 Gatti 40000 6 3 Rossi 28000 5 Gatti 40000 6 4 Viola 30000 5 Gatti 40000 6 5 Gatti 40000 6 Leoni 45000 7 Mori 24000 6 Leoni 45000 EB W LIBR Codice 1. Operazioni insiemistiche 2. Prodotto cartesiano e theta join 4 Interrogazioni con più operatori Le operazioni di selezione e di proiezione hanno come operando una sola tabella, mentre l’operazione di congiunzione agisce su due o più tabelle. Naturalmente gli operatori descritti possono essere applicati alle tabelle anche in successione, combinando una selezione con una proiezione oppure una proiezione e una congiunzione: in questo modo vengono effettuate interrogazioni sulle relazioni ottenute come risultato di un’interrogazione precedente. Per esempio, per ottenere l’elenco delle ragioni sociali e degli agenti per i clienti della provincia di Milano, occorre applicare la seguente sequenza di operatori: 1. σP Clienti 2. Temp1A 3. ΠL Temp2 Temp1 = Selezione di Clienti per Provincia = “MI” AgentiA Temp2 = Congiunzione di Temp1 e Agenti su IDAgente Proiezione di Temp2 su RagioneSociale, Nome. Questa sequenza di operazioni attuata sulle tabelle Clienti e Agenti usate nei precedenti esempi produce le tabelle riportate in figura. 1. Selezione di Clienti per Provincia = “MI” 156 IDCliente RagioneSociale PartitaIVA Provincia IDAgente Vite Viteria Lombarda 05567389302 MI Bia Vitp Viteria di Precisione 06443652006 MI Bia © Istituto Italiano Edizioni Atlas parte prima Progettazione della base di dati capitolo 4 Modello relazionale 2. Congiunzione di 1. con Agenti su IDAgente IDCliente Ragione Sociale PartitaIVA Provincia Clienti. Agenti. IDAgente IDAgente Vite Viteria Lombarda 05567389302 MI Bia Vitp Viteria di Precisione 06443652006 MI Bia Nome Zona Bia Bianchi Nord Bia Bianchi Nord 3. Proiezione di 2. su RagioneSociale, Nome RagioneSociale Nome Viteria Lombarda Bianchi Viteria di Precisione Bianchi Volendo ottenere ragione sociale e partita IVA dei clienti della provincia di Bari, si può operare nel seguente modo: 1. σP Clienti 2. ΠL Temp1 Temp1 = Selezione di Clienti per Provincia = “BA” Proiezione di Temp1 su RagioneSociale, PartitaIVA Nella costruzione delle precedenti interrogazioni, ottenute combinando più operatori, si è fatto uso delle tabelle di nome Temp1 e Temp2 per indicare tabelle fittizie, risultato di operazioni parziali. Gli stessi nomi, scelti per indicare queste tabelle fittizie, vogliono suggerire l’idea che si tratta di risultati temporanei ed evidenziare che tali tabelle non hanno esistenza nel database e visibilità reale: è infatti il sistema di interrogazione del database che decide come eseguire l’interrogazione per ottenere il risultato finale richiesto. Si tratta di una semplificazione sintattica per indicare che una certa operazione viene eseguita partendo dai risultati di operazioni precedenti. La situazione è analoga a quella di una espressione aritmetica quale: (3 + 4) × (5 + 6) che potrebbe essere espressa in forma equivalente: T1 = 3 + 4; T2 = 5 + 6; T1 × T2 La sintassi adottata permette di scrivere espressioni complesse in modo relativamente semplice e di immediata lettura. Per esempio l’interrogazione per ottenere ragione sociale e partita IVA dei clienti di Bari scritta in forma compatta, senza indicare risultati parziali fittizi, diventerebbe: ΠRagioneSociale, PartitaIVA (σ σProvincia=”BA” Clienti) con il significato di: Proiezione di (Selezione di Clienti per Provincia = “BA”) su RagioneSociale, PartitaIVA © Istituto Italiano Edizioni Atlas 157 parte prima Progettazione della base di dati capitolo 4 Modello relazionale 5 Esempi con modello E//R, tabelle e operazioni relazionali PROGETTO 1 Un’organizzazione internazionale raggruppa gli iscritti di diverse nazioni. Gli iscritti possono aderire con ruoli diversi: socio ordinario, sostenitore, affiliato, ecc.; l’importo della quota di iscrizione è libero e viene versato con pagamenti che possono essere fatti in date diverse (anche più versamenti nello stesso anno senza controlli di scadenze). Costruire il modello E/R, definendo entità, attributi e associazioni e motivando le scelte effettuate su entità e tipo di associazioni. Definire la procedura per la gestione dei dati. Produrre poi la pseudocodifica per le seguenti interrogazioni: • iscritti con cognome, nome, telefono • elenco degli iscritti (cognome, nome, tipo socio) di una nazione • tutti i dati degli iscritti di un determinato tipo • pagamenti con cognome, data, importo • tutti i dati dei pagamenti effettuati nell’anno in corso con cognome e nome degli iscritti che hanno effettuato i pagamenti • pagamenti effettuati da un iscritto. ANALISI DEI DATI Le entità che possono essere individuate nel problema sono: • Iscritto, per rappresentare le informazioni riguardanti i soci dell’organizzazione; • Nazione, per gli Stati di appartenenza degli iscritti, essendo l’organizzazione di tipo internazionale; • TipoAdesione, per i diversi tipi di ruoli con i quali i soci aderiscono (socio ordinario, sostenitore, affiliato); • Pagamento, per i versamenti delle quote di iscrizione. Gli Gli Gli Gli attributi di Iscritto sono: codice dell’iscritto, cognome, nome, indirizzo, telefono. attributi di Nazione sono: codice della nazione, descrizione. attributi di TipoAdesione sono: codice del tipo, descrizione. attributi di Pagamento sono: numero, importo, data del versamento. Tra l’entità Nazione e l’entità Iscritto esiste un’associazione uno a molti, perché una Nazione può avere molti iscritti e ciascun iscritto appartiene a una sola Nazione. Tra l’entità TipoAdesione e l’entità Iscritto si può stabilire un’associazione uno a molti, perché ci possono essere tanti iscritti per lo stesso tipo, ma un iscritto aderisce all’organizzazione secondo uno specifico ruolo. Tra l’entità Iscritto e l’entità Pagamento si stabilisce un’associazione uno a molti, perché nel testo del problema si prevede che un iscritto possa fare più versamenti, ma ogni pagamento si riferisce a un solo iscritto. 158 © Istituto Italiano Edizioni Atlas parte prima Progettazione della base di dati capitolo 4 Modello relazionale Sulla base dell’analisi effettuata si può disegnare il modello Entità/Associazioni: MODELLO E/R Pagamento N 1 Effettuare Numero {PK} Data Importo Iscritto ChiaveIscritto {PK} Cognome Nome Indirizzo Telefono N 1 Risiedere Nazione ChiaveNazione {PK} DescrNazione N Aderire 1 TipoAdesione ChiaveTipo {PK} DescrTipo Nel modello E/R sono stati indicati i nomi dei versi delle associazioni e l’opzionalità od obbligatorietà delle associazioni (indicate rispettivamente con linea tratteggiata o continua). Il modello viene verificato utilizzando le regole di lettura: Ogni tipo di adesione può essere riferito a uno o più iscritti, ogni iscritto deve aderire con un solo tipo di adesione. Ogni nazione può essere la residenza di uno o più iscritti, ogni iscritto deve risiedere in una sola nazione. Ogni iscritto può effettuare uno o più pagamenti, ogni pagamento deve essere effettuato da un solo iscritto. Utilizzando le regole di derivazione, si passa dal modello concettuale al modello logico, cioè alle tabelle, introducendo le chiavi esterne per rappresentare le associazioni (le chiavi primarie sono sottolineate, le chiavi esterne sono in corsivo). TABELLE TipiAdesione (ChiaveTipo, DescrTipo) Nazioni (ChiaveNazione, DescrNazione) Iscritti (ChiaveIscritto, Cognome, Nome, Indirizzo, Telefono, CodiceTipo, CodiceNazione) Pagamenti (Numero, Data, Importo, CodiceIscritto). L’associazione uno a molti tra TipoAdesione e Iscritto è stata rappresentata aggiungendo agli attributi dell’entità a molti (Iscritto) la chiave esterna corrispondente alla chiave primaria dell’entità a uno (TipoAdesione). La chiave esterna CodiceTipo corrisponde alla chiave primaria ChiaveTipo. © Istituto Italiano Edizioni Atlas 159 parte prima Progettazione della base di dati capitolo 4 Modello relazionale In modo analogo la chiave esterna CodiceNazione in Iscritti è associata alla chiave primaria ChiaveNazione e la chiave esterna CodiceIscritto in Pagamenti è associata alla chiave primaria ChiaveIscritto, per rappresentare le associazioni uno a molti rispettivamente tra Nazione e Iscritto e tra Iscritto e Pagamento. Lo schema seguente illustra le caratteristiche degli attributi delle tabelle. Tabella Campo Chiave Formato Dimensione TipiAdesione ChiaveTipo PK (Primaria) Carattere 4 Carattere 15 Carattere 3 Carattere 20 Carattere 5 Cognome Carattere 40 Nome Carattere 30 Indirizzo Carattere 30 Telefono Carattere 12 DescrTipo Nazioni ChiaveNazione PK (Primaria) DescrNazione Iscritti Pagamenti ChiaveIscritto PK (Primaria) CodiceTipo FK (Esterna) Carattere 4 CodiceNazione FK (Esterna) Carattere 3 Numero PK (Primaria) Numerico 6 Data Data/ora 8 Importo Numerico 12 Carattere 5 CodiceIscritto FK (Esterna) ANALISI DEL PROBLEMA Il problema comprende la gestione di quattro tabelle, individuate dalle quattro entità definite nel modello E/R. Le tabelle relative alle nazioni e ai tipi di adesione possono essere definite come tabelle di controllo che vengono create nella fase iniziale per l’avviamento del database e che, nel tempo, subiranno poche modifiche. Il programma di creazione di tali tabelle deve, comunque, prevedere la possibilità di aggiornamento dei dati. La gestione della tabella Iscritti, invece, può essere realizzata attraverso un tipico programma di aggiornamento che prevede le funzioni di inserimento, cancellazione e modifica dei record contenuti nella tabella. Per la tabella dei pagamenti la funzione di registrazione è realizzata principalmente da operazioni di accodamento di nuovi record, anche se devono, comunque, essere previste operazioni di modifica e di cancellazione. Le stampe di controllo del contenuto delle tabelle Iscritti e Pagamenti sono demandate alle fasi di interrogazione del database. Per quanto concerne le interrogazioni, ciascuna di esse può essere considerata una funzione; per semplificare il funzionigramma le interrogazioni sono state raggruppate in due categorie: la prima (Stampare iscritti) comprende le interrogazioni sui dati di tipo descrittivo degli iscritti, la seconda (Controllare pagamenti) riguarda le interrogazioni che coinvolgono anche i dati dei pagamenti. 160 © Istituto Italiano Edizioni Atlas parte prima Progettazione della base di dati capitolo 4 Modello relazionale GERARCHIA DELLE FUNZIONI GESTIRE ISCRITTI Creare tabelle di gestione Creare Tipi Adesione Aggiornare dati Creare Nazioni Aggiornare Iscritti Registrare Pagamenti Interrogare dati Stampare Iscritti Controllare Pagamenti INPUT E OUTPUT DELLE FUNZIONI Per le funzioni Creare Tipi Adesione, Creare Nazioni, Aggiornare Iscritti, Registrare Pagamenti, l’input è costituito dai dati digitati dall’utente e l’output è definito dalla corrispondente tabella aggiornata. Per le interrogazioni l’input è definito dalle tabelle che contengono i dati coinvolti nelle interrogazioni; l’output, per i database relazionali, è costituito ancora da una tabella, tale tabella può essere, a sua volta, oggetto di interrogazioni oppure, come in questo caso, può essere visualizzata su video o stampata. SCHEMA DELLE RISORSE DI SISTEMA Creare Tipi Adesione Creare Nazioni TipiAdesione Nazioni Aggiornare Iscritti Registrare Pagamenti Iscritti Pagamenti Stampare Iscritti © Istituto Italiano Edizioni Atlas Controllare Pagamenti 161 parte prima Progettazione della base di dati capitolo 4 Modello relazionale INTERROGAZIONI (le costanti utilizzate nelle condizioni di ricerca sono indicate tra parentesi quadre) Iscritti con cognome, nome, telefono ΠL Iscritti Proiezione di Iscritti su Cognome, Nome, Telefono Elenco degli iscritti (cognome, nome, tipo socio) di una Nazione 1. σP Nazioni 2. Temp1PK IscrittiFK 3. Temp2FK TipiAdesionePK 4. ΠL Temp3 Temp1 = Selezione di Nazioni per DescrNazione = [nazione scelta] Temp2 = Congiunzione di Temp1 su ChiaveNazione e Iscritti su CodiceNazione Temp3 = Congiunzione di Temp2 su CodiceTipo e TipiAdesione su ChiaveTipo Proiezione di Temp3 su Cognome, Nome, DescrTipo Tutti i dati degli iscritti di un determinato tipo 1. σP TipiAdesione 2. Temp1PK IscrittiFK Temp1 = Selezione di TipiAdesione per DescrTipo = [tipo scelto] Congiunzione di Temp1 su ChiaveTipo e Iscritti su CodiceTipo Pagamenti con cognome, data, importo 1. IscrittiPK PagamentiFK 2. ΠL Temp1 Temp1 = Congiunzione di Iscritti su ChiaveIscritto e Pagamenti su CodiceIscritto Proiezione di Temp1 su Cognome, Data, Importo I dati dei pagamenti effettuati nell’anno in corso con cognome e nome degli iscritti che hanno effettuato i pagamenti 1. σP Pagamenti 2. ΠL Iscritti 3. Temp1FK Temp2PK Temp1 = Selezione di Pagamenti per Data compresa tra 1 gennaio e 31 dicembre dell’anno in corso Temp2 = Proiezione di Iscritti su ChiaveIscritto, Cognome, Nome Congiunzione di Temp1 su CodiceIscritto e Temp2 su ChiaveIscritto Pagamenti effettuati da un iscritto 1. σP Iscritti 2. ΠL Temp1 3. Temp2PK PagamentiFK Temp1 = Selezione di Iscritti per Cognome = [cognome scelto] Temp2 = Proiezione di Temp1 su ChiaveIscritto Congiunzione di Temp2 su ChiaveIscritto e Pagamenti su CodiceIscritto PROGETTO 2 I pazienti di un reparto di chirurgia sono ricoverati in stanze con differenti dotazioni (telefono, televisore, aria condizionata). I pazienti vengono operati da un chirurgo; si devono registrare anche data, ora e sala operatoria nella quale il paziente viene operato. Derivare dal modello E/R il corrispondente modello relazionale dei dati e produrre la pseudocodifica per le seguenti interrogazioni: • pazienti operati da un dato chirurgo con cognome, nome, indirizzo • pazienti che hanno scelto una stanza con televisore (con cognome, nome, e data di inizio del ricovero) • pazienti ricoverati in un certo mese (con cognome e nome). Il modello E/R del problema è stato discusso negli esempi del Paragrafo 7 nel Capitolo 3. Completiamo l’esempio con la derivazione del modello logico e la codifica delle interrogazioni. Applicando le regole di derivazione del modello logico, si definiscono tre relazioni in corrispondenza delle tre entità Stanza, Paziente, Chirurgo. 162 © Istituto Italiano Edizioni Atlas parte prima Progettazione della base di dati capitolo 4 Modello relazionale L’associazione Operare, di tipo 1:N, tra Chirurgo e Paziente viene modellata aggiungendo agli attributi dell’entità che sta dalla parte N, ossia Paziente, la chiave di Chirurgo che sta dalla parte 1 dell’associazione, oltre agli attributi dell’associazione stessa. L’associazione tra Stanza e Paziente, di tipo 1:N viene rappresentata aggiungendo agli attributi di Paziente la chiave di Stanza e gli attributi dell’associazione. Lo schema relazionale derivato è il seguente: Stanze (Numero, Telefono, Televisore, AriaCond) Chirurghi (Codice, Cognome, Nome, Specialità) Pazienti (Codice, Cognome, Nome, Indirizzo, NumTelef, CodiceChirurgo, DataIntervento, OraIntervento, SalaOperatoria, NumeroStanza, InizioRicovero, FineRicovero) Le chiavi primarie delle due relazioni sono sottolineate, mentre le chiavi esterne sono indicate in corsivo. Si osservi che la tabella Pazienti, sulla base delle ipotesi di semplificazione del problema, non rappresenta una tabella anagrafica, ma i dati relativi alla degenza e all’intervento dei diversi pazienti. Lo schema seguente illustra le caratteristiche degli attributi delle tabelle. Gli attributi Telefono, Televisore, AriaCond, che caratterizzano alcune opzioni della stanza dove il paziente è ricoverato, sono attributi di tipo logico (valore vero o falso). Rappresentiamo i valori di questo attributo con un carattere “S” oppure “N” (sì o no). Relazione Stanze Chirurghi Pazienti Attributo Numero Telefono Televisore AriaCond Codice Cognome Nome Specialità Codice Cognome Nome Indirizzo NumTelef CodiceChirurgo DataIntervento OraIntervento SalaOperatoria NumeroStanza InizioRicovero FineRicovero Chiave PK (Primaria) PK (Primaria) PK (Primaria) FK (Esterna) FK (Esterna) Formato numerico carattere carattere carattere numerico carattere carattere carattere numerico carattere carattere carattere carattere numerico data/ora data/ora numerico numerico data/ora data/ora Dimensione 4 1 1 1 4 30 20 10 4 30 20 40 12 4 8 8 4 4 8 8 ANALISI DEL PROBLEMA Il problema comprende la gestione di tre tabelle, individuate dalle tre entità definite nel modello E/R. Le tabelle relative alle stanze e ai chirurghi vengono create nella fase iniziale per l’avviamento del database e, nel tempo, subiranno poche modifiche. La gestione di tali tabelle deve, comunque, prevedere la possibilità di aggiornamento dei dati. © Istituto Italiano Edizioni Atlas 163 parte prima Progettazione della base di dati capitolo 4 Modello relazionale La gestione della tabella Pazienti è, invece, di tipo dinamico, in quanto deve registrare gli interventi e i ricoveri con le date di inizio e di fine: può essere realizzata attraverso una tipica procedura di aggiornamento che prevede le funzioni di inserimento, cancellazione e modifica dei record contenuti nella tabella. Per semplificare il funzionigramma, le interrogazioni richieste dal problema sono state raggruppate sotto la funzione Gestire ricoveri. GERARCHIA DELLE FUNZIONI GESTIRE REPARTO Creare tabelle di gestione Gestire pazienti Gestire ricoveri Creare tabella stanze Inserire nuovo paziente Elenco pazienti operati Creare tabella chirurghi Cancellare paziente Scelte della stanza Aggiornare dati paziente Ricoveri di un mese INPUT E OUTPUT DELLE FUNZIONI Per le funzioni Creare tabella stanze, Creare tabella chirurghi e Gestire pazienti l’input è costituito dai dati digitati dall’utente e l’output è definito dalla corrispondente tabella aggiornata. Per le interrogazioni l’input è definito dalle tabelle che contengono i dati coinvolti nelle interrogazioni; l’output può essere visualizzato su video o sulla carta della stampante. SCHEMA DELLE RISORSE DI SISTEMA Creare tabella stanze Gestire pazienti Stanze Pazienti Chirurghi Gestire ricoveri Creare tabella chirurghi 164 © Istituto Italiano Edizioni Atlas parte prima Progettazione della base di dati capitolo 4 Modello relazionale INTERROGAZIONI (le costanti utilizzate nelle condizioni di ricerca sono indicate tra parentesi quadre) Elenco dei pazienti operati da un dato chirurgo, con nome, cognome, indirizzo 1. σP Chirurghi 2. PazientiFK 3. ΠL Temp2 Temp1PK Temp1 = Selezione di Chirurghi per Cognome = [cognome scelto] e Nome = [nome scelto] Temp2 = Congiunzione di Pazienti su CodiceChirurgo e Temp1 su Codice Proiezione di Temp2 su Paziente.Nome, Paziente.Cognome, Indirizzo Pazienti che hanno scelto una stanza con televisore (con nome, cognome, e data inizio ricovero) 1. σP Stanze 2. PazientiFK 3. ΠL Temp2 Temp1 = Selezione di Stanze per Televisore = “S” Temp1PK Temp2 = Congiunzione di Pazienti su NumeroStanza e Temp1 su Numero Proiezione di Temp2 su Paziente.Nome, Paziente.Cognome, InizioRicovero Pazienti ricoverati in un certo mese (con nome e cognome) Temp1 = Selezione di Pazienti per InizioRicovero = [mese scelto] Proiezione di Temp1 su Paziente.Nome, Paziente.Cognome ERIA EB W LIBR 1. σP Pazienti 2. ΠL Temp1 3. Esempio con modello E/R, tabelle e operazioni: Gestione ordini AUTOVERIFICA Domande da 14 a 25 pag. 179-181 Problemi da 6 a 15 pag. 183-185 6 La normalizzazione delle relazioni La tabella Inventario contiene informazioni sulle merci presenti nei diversi negozi di una catena di supermercati distribuiti sul territorio nazionale. Dall’esame della prima riga di inventario si vede che ci sono 800 pezzi del prodotto di codice 545 nel magazzino CA1, situato in via Tonale 12, l’ultima riga evidenzia 720 unità del prodotto 100 posti in Calle Corta, sede del magazzino VE1. Inventario Prodotto Magazzino Quantità IndirizzoMagazzino 545 CA1 800 Via Tonale, 12 545 PA2 700 Via Mazzini, 25 545 VE1 356 Calle Corta, 5 100 CA1 245 Via Tonale, 12 200 VE1 230 Calle Corta, 5 545 PA1 370 Via Garibaldi, 38 100 PA2 350 Via Mazzini, 25 100 VE1 720 Calle Corta, 5 La tabella Inventario non è una tabella ben organizzata: l’indirizzo di un certo magazzino viene ripetuto ogni volta che quel magazzino è referenziato tramite il codice e, pertanto, i dati nel campo IndirizzoMagazzino sono ridondanti. © Istituto Italiano Edizioni Atlas 165 parte prima Progettazione della base di dati capitolo 4 Modello relazionale La ridondanza va evitata, non solo perché viene sprecato spazio su disco ma, soprattutto, per le possibili anomalie che si possono presentare nel corso delle diverse fasi del trattamento dei dati: • anomalia di aggiornamento: se il magazzino CA1 cambia indirizzo bisogna modificare il valore di IndirizzoMagazzino in tutte le occorrenze di CA1 di Inventario; se, per qualsiasi ragione, l’aggiornamento avviene solo in alcune delle righe interessate, i dati memorizzati diventano inconsistenti; • anomalia di cancellazione: se un magazzino si svuota vengono perse le informazioni sul suo indirizzo; • anomalia di inserimento: quando viene aperto un nuovo magazzino, in mancanza di merci a magazzino, mancano le informazioni sul suo indirizzo. Per evitare la ridondanza di IndirizzoMagazzino possiamo pensare di sostituire alla tabella Inventario una coppia di tabelle: Inventario e Negozi, descritte dagli schemi: Inventario (Prodotto, Magazzino, Quantità) Negozi (CodiceMagazzino, IndirizzoMagazzino) La chiave di Inventario è formata dagli attributi Prodotto e Magazzino, in quanto il solo codice del prodotto non identifica la merce, che può essere presente in magazzini diversi. È poi evidente che la scomposizione nelle due tabelle non causa perdita di informazione, in quanto la tabella di partenza potrà essere ricostruita mediante congiunzione di Inventario su Magazzino e Negozi su CodiceMagazzino. Sono state definiti opportuni criteri che devono essere soddisfatti dalle relazioni per evitare la ridondanza dei dati e le possibili anomalie che ne conseguono. Tali criteri definiscono le caratteristiche che devono essere soddisfatte da una relazione ben strutturata e prendono il nome di forme normali: sono di livello crescente, e sono accompagnate da algoritmi per la trasformazione di una tabella, che viola una forma normale, in un insieme di tabelle che rispettano il criterio violato. Il processo di trasformazione prende il nome di normalizzazione ed è garantita la conservazione dell’informazione. La normalizzazione completa il processo di progettazione di un database relazionale. Dopo avere progettato il database a livello concettuale, mediante la costruzione del modello E/R dei dati, e avere derivato le conseguenti relazioni in base alle regole viste in questo capitolo, la normalizzazione esamina le tabelle alla ricerca di possibili incongruenze nella loro definizione. In sostanza la normalizzazione consente di creare tabelle ben definite, che facilitano le operazioni di aggiunta, modifica e cancellazione delle informazioni, e che rendono possibili i cambiamenti nella struttura del modello con l’evolvere delle esigenze aziendali e degli utenti del database. Nel seguito della trattazione saranno utilizzati alcuni termini di cui si forniscono le definizioni: • la chiave o chiave primaria è l’insieme di uno o più attributi che identificano in modo univoco una n-upla (riga della tabella); • la chiave candidata è un insieme minimale di uno o più attributi che possono svolgere la funzione di chiave (ci possono essere molte chiavi candidate, ma una sola chiave primaria); • l’attributo non-chiave è un campo che non fa parte della chiave primaria. Consideriamo il seguente schema relazionale che descrive la relazione Inventario, modificata rispetto alla tabella discussa in precedenza, con l’aggiunta dell’attributo NumeroInventario, che identifica univocamente ogni riga della tabella. Inventario (NumeroInventario, Prodotto, Magazzino, Quantità, IndirizzoMagazzino) 166 © Istituto Italiano Edizioni Atlas parte prima Progettazione della base di dati capitolo 4 Modello relazionale Per le osservazioni fatte all’inizio di questo paragrafo possiamo dire che: - NumeroInventario è una chiave candidata, - Prodotto non è una chiave candidata e così non lo può essere Magazzino, - l’insieme {Prodotto, Magazzino} è una chiave candidata, - l’insieme {Prodotto, Magazzino, Quantità} non è una chiave candidata, perché contiene un sottoinsieme {Prodotto, Magazzino} che è una chiave candidata. Il progettista della base di dati può scegliere la chiave primaria, tra le due possibili chiavi candidate, in base alle specifiche esigenze del sistema informativo che sta progettando. Si ha dipendenza funzionale tra attributi quando il valore di un insieme di attributi A determina un singolo valore dell’attributo B e si indica con: A → B. Si dice anche che B dipende funzionalmente da A, o che A è un determinante per B. Se un attributo è chiave candidata di una relazione, allora è un determinante per ogni attributo della relazione e, viceversa, un attributo, che sia un determinante per ogni attributo di una relazione, è chiave candidata per la relazione stessa. Nel caso della relazione Inventario: NumeroInventario è determinante per ogni attributo di Inventario essendo una chiave candidata: NumeroInventario → (Prodotto, Magazzino, Quantità, IndirizzoMagazzino) {Prodotto, Magazzino} è determinante per ogni attributo di Inventario, in quanto chiave candidata: {Prodotto, Magazzino} → (NumeroInventario, Quantità, IndirizzoMagazzino) Magazzino è determinante per Indirizzo Magazzino: Magazzino → IndirizzoMagazzino Si ha dipendenza transitiva tra attributi quando un attributo A determina B e B determina C; si dice allora che C dipende transitivamente da A: se A → B e B → C, allora A → C transitivamente. Vengono esaminate ora le principali forme normali nel modello relazionale. Prima forma normale Una relazione è in prima forma normale (1FN) quando rispetta i requisiti fondamentali del modello relazionale (già visti in precedenza), che sono: • tutte le righe della tabella contengono lo stesso numero di colonne; • gli attributi rappresentano informazioni elementari; • i valori che compaiono in una colonna sono dello stesso tipo, cioè appartengono allo stesso dominio; • ogni riga è diversa da tutte le altre, cioè non ci possono essere due righe con gli stessi valori nelle colonne; • l’ordine con il quale le righe compaiono nella tabella è irrilevante. In particolare gli attributi devono essere informazioni non ulteriormente scomponibili, cioè non devono avere sottoattributi, né essere gruppi di attributi ripetuti. © Istituto Italiano Edizioni Atlas 167 parte prima Progettazione della base di dati capitolo 4 Modello relazionale Per esempio, nella relazione: Dipendenti (Matricola, Cognome, Nome, Città, FamiliariACarico) l’attributo FamiliariACarico non è elementare, in quanto è costituito da un gruppo di attributi ripetuti dello stesso tipo (i nomi dei familiari). La relazione non è in prima forma normale. La relazione può essere opportunamente convertita in due tabelle: Dipendenti (Matricola, Cognome, Nome, Città) Familiari (CodiceFam, CognomeFam, NomeFam, MatricolaDip) Dipendenti Matricola Cognome Nome Città Familiari a Carico Rossi Alice 12001 Rossi Antonio Milano Rossi Marco Antonini Marcella 14007 18009 Dipendenti Familiari Matricola Cognome Nome Indirizzo CodiceFam CognomeFam NomeFam MatricolaDip 12001 Antonio Milano 50001 Rossi Alice 12001 14007 50002 Rossi Marco 12001 18009 50003 Antonini Marcella 12001 Rossi In questo modo vengono individuati due oggetti distinti, Dipendente e Familiare, fornendo una rappresentazione più precisa della realtà: inoltre risulta più facile aggiungere eventuali nuovi attributi (per esempio, età, sesso, grado di parentela alla relazione Familiari). Anche l’inserimento di un nuovo figlio a carico del dipendente diventa semplice, in quanto viene aggiunta una riga alla tabella Familiari, senza modificare la struttura delle relazioni; inoltre possiamo comunque ritrovare le informazioni sul capofamiglia attraverso un’operazione di congiunzione tra la relazione Dipendenti e la relazione Familiari sull’attributo comune matricola del dipendente. Le forme normali superiori alla prima vengono introdotte per eliminare problemi durante le operazioni di aggiornamento o di cancellazione, evitando l’inconsistenza o la perdita indesiderata di dati. Seconda forma normale Una relazione è in seconda forma normale (2FN) quando è in prima forma normale e tutti i suoi attributi non-chiave dipendono dall’intera chiave, cioè non possiede attributi che dipendono soltanto da una parte della chiave. La seconda forma normale elimina la dipendenza parziale degli attributi dalla chiave e riguarda il caso di relazioni con chiavi composte, cioè formate da più attributi. 168 © Istituto Italiano Edizioni Atlas parte prima Progettazione della base di dati capitolo 4 Modello relazionale La relazione Inventario definita dallo schema: Inventario (Prodotto, Magazzino, Quantità, IndirizzoMagazzino) non è in seconda forma normale; infatti l’attributo IndirizzoMagazzino dipende funzionalmente dall’attributo Magazzino, che rappresenta una porzione di chiave e non l’intera chiave. La soluzione, come abbiamo visto, consiste nel costruire nuove relazioni, togliendo dalla relazione di partenza gli attributi che dipendono solo parzialmente dalla chiave primaria. La scomposizione inizia costruendo uno schema di relazione che comprende tutti gli attributi presenti nella dipendenza funzionale che viola la seconda forma normale, il determinante della dipendenza funzionale diventa quindi la chiave della nuova relazione: Magazzino → IndirizzoMagazzino R1 (Magazzino, IndirizzoMagazzino) Il passo successivo consiste nel costruire una seconda relazione R2 composta dagli attributi dello schema di partenza privato dell’attributo che dipende parzialmente dalla chiave. R2 (Prodotto, Magazzino, Quantità) Il procedimento viene iterato sino a che tutte le relazioni sono in seconda forma normale (2FN), cioè non ci sono attributi non-chiave che dipendono funzionalmente solo da una parte della chiave. Nel caso discusso in precedenza sono state costruite le due nuove relazioni Inventario e Negozi, ottenute con la proiezione della relazione di partenza sugli attributi degli schemi R2 (Inventario) e, rispettivamente, R1 (Negozi). Inventario Negozi Prodotto Magazzino Quantità Magazzino IndirizzoMagazzino 545 CA1 800 CA1 Via Tonale, 12 545 PA2 700 PA1 Via Garibaldi, 38 545 VE1 356 PA2 Via Mazzini, 25 100 CA1 245 VE1 Calle Corta, 5 200 VE1 230 545 PA1 370 100 PA2 350 100 VE1 720 Si consideri la relazione R il cui schema è una variante di quello di Inventario: R (Prodotto, Magazzino, Qta, NomeProdotto, IndirizzoMagazzino) In R valgono le seguenti dipendenze funzionali: 1. {Prodotto, Magazzino} → (Qta, NomeProdotto, IndirizzoMagazzino) 2. Prodotto → NomeProdotto 3. Magazzino → IndirizzoMagazzino © Istituto Italiano Edizioni Atlas 169 parte prima Progettazione della base di dati capitolo 4 Modello relazionale Si osserva che: { Prodotto, Magazzino } è una chiave di R in quanto, per effetto della dipendenza funzionale 1, è un determinate per tutti gli attributi di R e che, inoltre, R non è in 2FN a causa della dipendenza funzionale 2, in quanto NomeProdotto dipende solo parzialmente dalla chiave e non dall’intera chiave. Si osserva che anche la dipendenza funzionale 3 rappresenta una violazione alla 2FN, perché l’attributo Magazzino, che non è l’intera chiave di R, è determinante di IndirizzoMagazzino. Il processo di normalizzazione inizia considerando una delle dipendenze funzionali che violano le regole della normalizzazione: scegliamo la dipendenza funzionale 2. Si costruisce una tabella R1 con tutti gli attributi della dipendenza funzionale 2, secondo la quale Prodotto è chiave per R1. Da R si rimuovono poi tutti gli attributi che sono determinati funzionalmente da Prodotto, cioè il solo attributo NomeProdotto. Si ottengono così le relazioni: R1 (Prodotto, NomeProdotto) R (Prodotto, Magazzino, Qta, IndirizzoMagazzino) Il processo di normalizzazione prosegue considerando la dipendenza funzionale 3, per effetto della quale R non è in 2FN. Procedendo come al passo precedente R si scompone in: R2 (Magazzino, IndirizzoMagazzino) R (Prodotto, Magazzino, Qta) Complessivamente la relazione di partenza: R (Prodotto, Magazzino, Qta, NomeProdotto, IndirizzoMagazzino ) è stata scomposta in: R1 (Prodotto, NomeProdotto ) R2 (Magazzino, IndirizzoMagazzino) R (Prodotto, Magazzino, Qta) Sulla base dei due esempi appena discussi formalizziamo il processo di normalizzazione di una relazione mediante il seguente algoritmo di scomposizione. Algoritmo di scomposizione di una relazione T 1. Si identifichino tutte le dipendenze funzionali e le chiavi candidate in T. 2. Se esiste una dipendenza funzionale che viola le regole di normalizzazione: a. si costruisca una nuova relazione con tutti gli attributi della dipendenza funzionale considerata; b. il determinante della dipendenza funzionale è la chiave primaria della tabella definita in a; c. si costruisca una seconda relazione rimuovendo dalla tabella di partenza tutti gli attributi che sono determinati dalla dipendenza funzionale in esame. 3. Si ripeta il passo 2. finché non ci sono altre violazioni alle regole di normalizzazione. La normalizzazione è un procedimento algoritmico definito con precisione e quindi, almeno in apparenza, di semplice attuazione. In realtà nasconde un aspetto che richiede molta attenzione. L’algoritmo di scomposizione è eseguibile in modo automatico solo dopo avere completato il punto 1 del processo, ovvero dopo avere individuato tutte le dipendenze funzionali nella tabella da normalizzare. Questo passo, che non è automatizzabile, richiede una precisa conoscenza della realtà che la tabella vuole modellare e rappresenta un problema di complessità paragonabile a quella che si incontra nella costruzione del modello concettuale dei dati. 170 © Istituto Italiano Edizioni Atlas parte prima Progettazione della base di dati capitolo 4 Modello relazionale Terza forma normale Una relazione è in terza forma normale (3FN) quando è in seconda forma normale e tutti gli attributi non-chiave dipendono direttamente dalla chiave, cioè non possiede attributi non-chiave che dipendono da altri attributi non-chiave. La terza forma normale elimina la dipendenza transitiva degli attributi dalla chiave. Per esempio si consideri la gestione anagrafica di un’associazione di studenti di scuole diverse. Le informazioni più importanti sono rappresentate con la seguente relazione: Studenti (Cognome, Scuola, TelefonoScuola) Studenti Cognome Scuola TelefonoScuola Bianchi ITC Paleari 02-2538469 Leoni Liceo Dante 06-3845287 Galli ITIS Leonardo 011-3377659 Negri Liceo Dante 06-3845287 Rossi ITC Paleari 02-2538469 Lorenzini ITIS Galvani 081-5416875 Verdi Liceo Dante 06-3845287 Bedoni Liceo Fermi 045-2345613 Nella tabella in esame valgono le seguenti dipendenze funzionali: 1. Cognome → (Scuola, TelefonoScuola) 2. Scuola → TelefonoScuola La dipendenza funzionale 2 è evidente: nota la scuola, è definito il valore dell’attributo con il numero di telefono. La dipendenza funzionale 1 è basata sul fatto che, partendo dal nominativo di uno studente, se ne conosce la scuola di appartenenza e quindi (transitivamente) anche il relativo numero di telefono. La dipendenza funzionale 1 conferma il fatto che l’attributo Cognome sia una chiave per Studenti. La relazione Studenti non è in terza forma normale a causa della seconda dipendenza funzionale, perché l’attributo TelefonoScuola dipende transitivamente (e non direttamente) da una chiave (Cognome). Come si è visto per la seconda forma normale, anche in questo caso si possono avere anomalie nell’aggiornamento e inconsistenza dei dati per il fatto che il telefono della scuola è ripetuto per ogni studente appartenente a quella scuola. La normalizzazione in 3FN si ottiene applicando l’algoritmo di scomposizione. Identificata la dipendenza funzionale che viola le regole di normalizzazione, si costruisce una relazione con tutti gli attributi della dipendenza funzionale in esame, cioè della dipendenza funzionale 2, e con chiave Scuola: Istituti (Scuola, TelefonoScuola) Una seconda relazione è ottenuta eliminando da Studenti l’unico attributo determinato da Scuola, cioè TelefonoScuola. Studenti (Cognome, Scuola) © Istituto Italiano Edizioni Atlas 171 parte prima Progettazione della base di dati capitolo 4 Modello relazionale Il procedimento termina perchè non ci sono altre dipendenze funzionali che violano le regole di normalizzazione. Si osservi che, nella tabella Studenti normalizzata, l’attributo Scuola è una chiave esterna associata alla chiave primaria di Istituti. Sulla base di questa osservazione è possibile descrivere l’algoritmo di scomposizione in modo differente: costruito uno schema di relazione con tutti gli attributi della dipendenza funzionale che viola le regole di normalizzazione, si costruisce un secondo schema di tabella eliminando dallo schema di partenza tutti gli attributi della dipendenza funzionale, ma aggiungendo agli attributi rimasti, come chiave esterna, il determinante della dipendenza funzionale. In ogni caso si è scomposto lo schema della relazione di partenza nella coppia di relazioni: Studenti (Cognome, Scuola) Istituti (Scuola, TelefonoScuola) La proiezione della relazione di partenza sugli attributi di questi due schemi produce le tabelle: Studenti Istituti Cognome Scuola Scuola TelefonoScuola Bianchi ITC Paleari ITC Paleari 02-2538469 Leoni Liceo Dante ITIS Leonardo 011-3377659 Galli ITIS Leonardo ITIS Galvani 081-5416875 Negri Liceo Dante Liceo Dante 06-3845287 Rossi ITC Paleari Liceo Fermi 045-2345613 Lorenzini ITIS Galvani Verdi Liceo Dante Bedoni Liceo Fermi Le relazioni Studenti e Istituti, dove non ci sono attributi non-chiave che dipendono funzionalmente da un altro attributo non-chiave (cioè che dipendono in modo transitivo dalla chiave), si dicono in terza forma normale (3FN). Come ulteriore esempio si consideri la tabella Dipendenti di schema: Dipendenti (Matricola, Cognome, Nome, CodReparto, NomeReparto, CodiceCittà, NomeCittà) dove si suppongono valide le seguenti dipendenze funzionali: 1. Matricola → (Cognome, Nome, CodReparto, NomeReparto, CodiceCittà, NomeCittà) 2. CodReparto → NomeReparto 3. CodiceCittà → NomeCittà In base alla dipendenza funzionale 1 si può affermare che Matricola è una chiave per Dipendenti, mentre le dipendenze funzionali 2 e 3 sono indicative di due violazioni alla 3FN perché sia NomeReparto che NomeCittà dipendono transitivamente, e non direttamente, da una chiave. Applichiamo l’algoritmo di scomposizione alla relazione Dipendenti partendo dalla dipendenza funzionale 2, ottenendo: Reparti (CodReparto, Nome Reparto) Dipendenti (Matricola, Cognome, Nome, CodReparto, CodiceCittà, NomeCittà) 172 © Istituto Italiano Edizioni Atlas parte prima Progettazione della base di dati capitolo 4 Modello relazionale Il nuovo schema di Dipendenti non è ancora in 3FN a causa delle dipendenza funzionale 3. L’ulteriore scomposizione di Dipendenti produce uno schema di relazione di nome Città e la versione finale dello schema di Dipendenti: Reparti (CodReparto, Nome Reparto) Città (CodiceCittà, NomeCittà) Dipendenti (Matricola, Cognome, Nome, CodReparto, CodiceCittà) ERIA EB W LIBR Il procedimento termina perché non ci sono più dipendenze funzionali che violano le regole di normalizzazione. Gli esempi considerati descrivono come si attua la normalizzazione scomponendo, ove necessario, lo schema di una relazione di partenza in due o più schemi più semplici, allo scopo di ridurre la ridondanza dei dati e di conseguenza la possibilità di inconsistenza. Si osservi però che la normalizzazione rende più complesse le operazioni di ritrovamento dei dati. Si supponga, riferendoci all’ultimo esempio, di voler conoscere il nome del reparto dove lavora un dipendente di cui si conosce la matricola. È immediato osservare che prima della normalizzazione l’informazione era recuperabile accedendo alla sola tabella Dipendenti, mentre, dopo la normalizzazione, per recuperare questa informazione bisogna unire le relazioni Dipendenti e Reparti con un join sul campo CodReparto. La normalizzazione è comunque importante nel modello di un database perché l’integrità e la consistenza dei dati sono prioritarie rispetto alla velocità di ritrovamento dei dati. Tutto questo è vero in particolare nei database operativi dove i dati sono continuamente aggiornati e, di conseguenza, la ridondanza delle informazioni e il rischio di inconsistenza dei dati è reale. Ci sono però particolari database dove la ridondanza delle informazioni è tollerata e, anzi, è addirittura voluta: si tratta dei database di sola lettura, ovvero di basi di dati che non sono mai modificate, ma accedute solamente in lettura, per analizzare dati a scopo informativo. Questo avviene, per esempio, nei database per applicazioni direzionali dove i dati operativi sono elaborati e sintetizzati e successivamente analizzati per estrarre informazioni a supporto delle strategie elaborate dai manager. In questi casi i dati, una volta prodotti, non sono mai modificati e diventa importante solo la velocità con la quale si riesce ad accedere a queste informazioni. Volendo sintetizzare i contenuti di questo paragrafo diciamo che, attraverso la normalizzazione una relazione iniziale viene scomposta in più relazioni, che complessivamente forniscono le stesse informazioni di partenza e mantengono le dipendenze tra gli attributi: in ciascuna di esse ogni attributo dipende direttamente dalla chiave; vengono inoltre evitati problemi di ridondanza e di inconsistenza dei dati. Nella scomposizione non c’è perdita complessiva delle informazioni, perché i dati possono essere ritrovati attraverso operazioni di congiunzione tra le relazioni sugli attributi comuni, senza aggiunta di nuove n-uple nelle relazioni. 4. Forma normale di Boyce-Codd 7 L’integrità referenziale Nella definizione dei concetti fondamentali del modello relazionale è già stata presentata una regola di integrità sui dati, l’integrità sull’entità o vincolo di chiave, che non consente valori nulli e valori duplicati per la chiave. Il modello relazionale possiede altre regole di integrità dei dati e, in particolare, sussistono vincoli di tupla e vincoli d’integrità referenziale. Le tabelle in figura raccolgono le informazioni su alcuni studenti di un distretto scolastico che raggruppa diverse scuole. Gli studenti del distretto sono identificati per mezzo dell’attributo Matricola e le diverse scuole dal valore dei rispettivi codici. © Istituto Italiano Edizioni Atlas 173 parte prima Progettazione della base di dati capitolo 4 Modello relazionale Studenti Scuole Matricola Cognome Nome DataNascita CodScuola Codice NomeScuola 545 Rossi Maria NULL 125 125 ITC Manzoni 653 Neri Anna 20-set-94 125 180 Liceo Dante 768 Verdi Giuseppe 30-ott-96 NULL 190 Liceo Fermi 653 Rossi Franco 32-ott-94 180 NULL ITIS Galvani 314 Bruni Enrico 27-ott-95 185 Osserviamo le due tabelle Studenti e Scuole; in esse sono stati evidenziati alcuni dati che invalidano i corrispondenti record. Non è nota la scuola frequentata dallo studente di matricola 768, la data di nascita di Rossi è assurda, lo studente Bruni frequenta una scuola di codice inesistente nella tabella Scuole. All’istituto Galvani non è abbinato alcun valore della chiave e, di conseguenza, non è possibile collegarlo con gli studenti che lo frequentano. Per prevenire situazioni di questo tipo sono state definite opportune regole di integrità sui dati tra le quali ricordiamo la già citata integrità di chiave che impedisce la presenza di una riga con valore nullo della chiave. Si noti che è proprio questa la regola d’integrità violata in Scuole. I vincoli di tupla esprimono condizioni che devono essere soddisfatte dai valori di ciascuna n-upla della relazione, indipendentemente dalle altre. La data di nascita di Rossi è un esempio di violazione di un vincolo di dominio, in quanto il valore 32-ott-94 non ricade nell’insieme delle date ammissibili. La natura del problema analizzato porta a definire i vincoli ai quali devono sottostare i dati. Per esempio, l’attributo CodScuola di Studenti, porta a concludere che tale attributo non possa assumere valori nulli per prevenire situazioni quali quella dello studente di matricola 768. L’integrità referenziale (referential integrity) è un insieme di regole del modello relazionale che garantiscono l’integrità dei dati quando si hanno relazioni associate tra loro attraverso la chiave esterna: queste regole servono per rendere valide le associazioni tra le tabelle e per eliminare gli errori di inserimento, cancellazione o modifica di dati collegati tra loro. L’integrità referenziale richiede che per ogni valore non nullo della chiave esterna, esista un valore corrispondente della chiave primaria nella tabella associata. Per esempio, nel database relazionale formato dalle tabelle Studenti e Scuole il codice della scuola della tabella Studenti è associato alla chiave primaria della tabella Scuole. Scuole (Codice, NomeScuola) Studenti (Matricola, Cognome, Nome, DataNascita, CodScuola) Applicare l’integrità referenziale al database significa garantire che un valore presente nella tabella Studenti per la chiave esterna CodScuola abbia un corrispondente valore di Codice in una delle righe della tabella Scuole. Bisogna inoltre impedire la cancellazione di una scuola dalla tabella Scuole se ci sono righe nella tabella Studenti che si riferiscono ad essa. L’integrità referenziale, se applicata, non permette che si presentino situazioni come quella dello studente Bruni che è associato ad una scuola inesistente, di cancellare la riga relativa alla scuola di codice 125 per la presenza di studenti collegati, oppure di modificare il valore della chiave del liceo Dante per la medesima ragione. Si osservi che la presenza di un valore nullo per CodScuola, come nel caso dello studente Verdi, non rappresenta una violazione all’integrità referenziale. L’integrità referenziale si limita infatti a richiedere che, se c’è un valore nella chiave esterna CodScuola, esso debba anche comparire in Codice di Scuole. 174 © Istituto Italiano Edizioni Atlas parte prima Progettazione della base di dati capitolo 4 Modello relazionale La mancanza di un valore in CodScuola può essere un fatto non desiderato ma per nulla strano: significa semplicemente che non si conosce la scuola alla quale è iscritto un dato studente. Volendo evitare questa situazione bisogna richiedere che in CodScuola venga obbligatoriamente immesso un valore. A questo punto, se sono stati imposti i vincoli di integrità referenziale, in CodScuola ci deve essere un valore che compare anche nel campo Codice della tabella Scuole. In generale, data la Relazione1 avente come chiave l’attributo K1 e la Relazione2 con chiave esterna FK1 associata a K1, le regole dell’integrità referenziale impongono che: Ogni valore di FK1 deve avere un valore uguale di K1 in una delle righe di Relazione1 oppure, in alternativa, il valore di FK1 è nullo. Ogni valore non nullo di FK1 deve comparire in K1 Relazione2 Relazione1 Chiave B1 B2 FK1 K1 A1 A2 A3 A4 ——— ——— ——— xxxx xxxx —— —— —— —— ——— ——— ——— xxxx xxxx —— —— —— —— ——— ——— ——— xxxx xxxx —— —— —— —— ——— ——— ——— xxxx xxxx —— —— —— —— ——— ——— ——— xxxx xxxx —— —— —— —— ——— ——— ——— NULL xxxx —— —— —— —— ——— ——— ——— xxxx L’applicazione dell’integrità referenziale richiede che siano fatte rispettare le seguenti regole: • non è possibile immettere un valore nella chiave esterna della tabella associata, se tale valore non esiste tra le chiavi della tabella primaria. È possibile, comunque, immettere un valore nullo nella chiave esterna, per rappresentare il fatto che le righe non sono correlate. • non è possibile eliminare una n-upla dalla tabella primaria, se esistono righe legate ad essa attraverso la chiave esterna nella tabella correlata. • inoltre non si può modificare, come è ovvio, il valore alla chiave nella tabella primaria, se ad essa corrispondono righe nella tabella correlata. 8 Osservazioni sul modello relazionale Come si è potuto notare, il modello relazionale è molto intuitivo ed espressivo per la strutturazione dei dati. La teoria dei database relazionali è costruita a partire da sicuri fondamenti matematici e utilizza un linguaggio rigoroso: questo consente di sviluppare definizioni, teoremi e dimostrazioni. Dal punto di vista informatico presenta una grande semplicità nell’uso e nell’implementazione, anche se è relativamente più lento nella ricerca e occupa più spazio su memoria di massa rispetto ai database creati e gestiti da DBMS basati su altri modelli. Il trattamento dei dati avviene per gruppi di record, anziché per singoli record, come avviene nelle organizzazioni convenzionali degli archivi. Il ritrovamento delle informazioni è realizzato operando sulle righe e sulle colonne delle tabelle, con gli operatori di selezione, proiezione e congiunzione. © Istituto Italiano Edizioni Atlas 175 parte prima Progettazione della base di dati capitolo 4 Modello relazionale Le operazioni sulle relazioni producono nuove relazioni, alle quali si possono ulteriormente applicare gli operatori. Quindi non è necessario specificare la sequenza del percorso che deve essere seguito per accedere ai dati contenuti nel database, mentre le organizzazioni tradizionali degli archivi (sequenziale o diretta) sono strettamente condizionate dal tipo di cammino insito nella struttura dei dati. Nello schema tabellare del modello relazionale inoltre l’ordine con il quale le righe compaiono nella tabella è ininfluente. Il modello relazionale ha portato poi benefici nel lavoro di progettazione del database: il progettista del database può costruire il modello dei dati considerando con attenzione le entità, le associazioni e le dipendenze tra gli attributi nel modello della realtà. Il passaggio dal modello concettuale al modello logico può essere realizzato con semplici regole. Nel discutere la normalizzazione si è considerato l’esempio della tabella Dipendenti di schema: Dipendenti (Matricola, Cognome, Nome, CodReparto, NomeReparto, CodiceCittà, NomeCittà) Per effetto della normalizzazione lo schema Dipendenti viene scomposto nei 3 schemi di relazione: Reparti (CodReparto, Nome Reparto) Città (CodiceCittà, NomeCittà) Dipendenti (Matricola, Cognome, Nome, CodReparto, CodiceCittà) L’esempio è utile per comprendere come la normalizzazione sia riuscita a rilevare un originario errore nella progettazione della tabella Dipendenti. Si noti infatti che nella versione non normalizzata la relazione Dipendenti contiene informazioni che provengono da diverse entità: oltre alle informazioni che riguardano i dipendenti, ci sono anche informazioni che descrivono i reparti nei quali essi lavorano e delle città dove sono collocati i reparti. La normalizzazione è riuscita a separare queste informazioni in differenti tabelle ognuna delle quali descrive una sola entità. La normalizzazione può essere considerata il passo finale del processo complessivo di progettazione della base di dati e può consentire di attuare un controllo sul modello realizzato attraverso alcune precise regole. Si osservi che la normalizzazione risulta particolarmente importante anche per controllare la consistenza dei dati di un database già esistente, oppure nel caso di importazione di dati all’interno di un database a partire da fonti di dati esterne (quali banche dati, file di testo o fogli elettronici in formato CSV, ma anche tabelle di database creati con software DBMS diversi). AUTOVERIFICA Domande da 26 a 32 pag. 181-182 Problemi da 16 a 20 pag. 185 176 © Istituto Italiano Edizioni Atlas parte prima Progettazione della base di dati capitolo 4 Modello relazionale DOMANDE Derivazione delle relazioni Quali delle seguenti frasi esprime meglio la definizione di relazione di grado 2? a) una tabella bidimensionale b) un sottoinsieme di un qualsiasi insieme c) una tabella con due colonne d) una tabella con due righe 2 Se il dominio dell’attributo A1 è formato da un insieme di 5 oggetti e quello dell’attributo A2 ne contiene 3, che cosa si può dire in merito alla cardinalità di una relazione con attributi A1 e A2? a) la cardinalità è 25 b) la cardinalità è minore o uguale a 15 c) la cardinalità è minore di 15 d) la cardinalità è minore o uguale a 8 3 Quali delle seguenti affermazioni sono vere (V) e quali false (F)? a) La relazione rappresenta un’associazione tra tabelle b) Ogni n-upla rappresenta un’istanza dell’entità c) Le colonne contengono i valori assunti dagli attributi dell’entità d) Il dominio è l’insieme dei valori che possono essere assunti da una chiave V V V V F F F F 4 Associa a ciascun termine della colonna di sinistra la definizione corretta tra quelle elencate a destra: a) Grado 1) Insieme di n-uple b) Dominio 2) Riga di una tabella c) Relazione 3) Attributo che identifica una n-upla d) Tupla 4) Insieme dei valori assunti da un attributo e) Chiave 5) Numero delle colonne della tabella 5 Quali delle seguenti frasi esprimono la definizione di chiave di una relazione? a) un attributo o un insieme di attributi che permettono di distinguere tra le righe della relazione b) un attributo numerico c) un attributo senza valori duplicati d) un attributo non derivato da altri 6 Per ciascuno degli oggetti elencati a sinistra riferiti a una tabella con i dati sulle prove degli studenti, specifica se si tratta di una tabella (T), di un campo (C), di una chiave primaria (K), indicando a destra la lettera corretta. Oggetto Tipo (T, C, K) a) Voto ................................................................................ b) Identificativo della prova ................................................................................ c) Data della prova ................................................................................ d) Prove ................................................................................ © Istituto Italiano Edizioni Atlas ATTIVITÀ DI AUTOVERIFICA 1 177 parte prima Progettazione della base di dati 7 ATTIVITÀ DI AUTOVERIFICA 8 9 capitolo 4 Modello relazionale Quali delle seguenti affermazioni su una tabella sono vere (V) e quali false (F)? a) Gli attributi rappresentano informazioni elementari b) Una relazione può avere righe duplicate c) La presenza di una chiave primaria garantisce l’assenza di righe duplicate d) Il numero di attributi deve essere identico per tutte le righe di una relazione Quali delle seguenti affermazioni vere (V) e quali sono false (F)? a) Per rappresentare un’associazione 1: N si aggiunge la chiave dell’entità che sta dalla parte N agli attributi dell’entità che sta dalla parte 1 b) Per rappresentare un’associazione 1: N si aggiunge la chiave dell’entità che sta dalla parte 1 agli attributi dell’entità che sta dalla parte N c) Un’associazione N:N non è rappresentabile nel modello relazionale e si sostituisce con due associazioni 1:N d) Un’associazione N:N si rappresenta aggiungendo la chiave della prima entità agli attributi della seconda entità e viceversa V F V F V F V F V F V F V F V F Un’associazione (1:N) tra due entità E1 ed E2, dalle quali derivano le tabelle: T1 (K1, A, B, C) e, rispettivamente, T2 (K2, D) viene tradotta nel modello relazionale con: a) T1 (K1, A, B, C); T2 (K2, D); T3(K1,K2) b) T1 (K1, A, B, C, K2); T2 (K2, D); c) T1 (K1, A, B, C); T2 (K2, D, K1); d) T1 (K1, A, B, C, K2); T2 (K2, D, K1); 10 Un’associazione (1:N) tra due entità E1 ed E2, dalle quali derivano le tabelle: ha a) b) c) d) T1 (K1, A, B, C) e, rispettivamente, T2 (K2, D) attributi A1 e A2. Come viene tradotta nel modello relazionale? T1 (K1, A, B, C); T2 (K2, D); T3 (K1, K2, A1, A2) T1 (K1, A, B, C, K2); T2 (K2, D, K1, A1, A2); T1 (K1, A, B, C, A1, A2); T2 (K2, D, K1); T1 (K1, A, B, C); T2 (K2, D, K1, A1, A2); 11 Un’associazione (N:N) tra due entità E1 ed E2, dalle quali derivano le tabelle: T1 (K1, A, B, C) e, rispettivamente, T2 (K2, D) viene rappresentata nel modello relazionale con: a) T1 (K1, A, B, C); T2 (K2, D); b) T1 (K1, A, B, C, K2); T2 (K2, D, K1); c) T1 (K1, A, B, C); T2 (K2, D, K1); d) T1 (K1, A, B, C, K2); T2 (K2, D); T3 (K1, K2) 12 Quali delle seguenti affermazioni sono vere (V) e quali false (F)? 178 a) Un’associazione 1:1 si rappresenta sempre aggregando in un’unica tabella gli attributi delle entità associate V F b) Un’associazione 1:1 si rappresenta spesso aggregando in un’unica tabella gli attributi delle entità associate V F © Istituto Italiano Edizioni Atlas parte prima Progettazione della base di dati capitolo 4 Modello relazionale c) Un’associazione 1:1 con partecipazione facoltativa di un’entità si rappresenta aggiungendo agli attributi dell’entità con partecipazione obbligatoria la chiave dell’entità con partecipazione facoltativa d) Un’associazione 1:1 con partecipazione facoltativa di un’entità si rappresenta aggiungendo agli attributi dell’entità con partecipazione facoltativa la chiave dell’entità con partecipazione obbligatoria V F V F 13 Un’associazione 1:1 tra due entità E1 ed E2, dalle quali derivano le tabelle: ATTIVITÀ DI AUTOVERIFICA T1 (K1, A, B, C) e, rispettivamente, T2 (K2, D) con partecipazione facoltativa di E1 e obbligatoria di E2, viene tradotta nel modello relazionale con: a) T (K1, K2, A, B, C, D) b) T1 (K1, A, B, C); T2 (K2, D); T3 (K1,K2) c) T1 (K1, A, B, C); T2 (K2, D, K1); d) T1 (K1, A, B, C, K2); T2 (K2, D); Operazioni relazionali 14 Quali delle seguenti affermazioni sono vere (V) e quali sono false (F)? a) b) c) d) Una proiezione non può alterare la cardinalità di una relazione Nella maggior parte dei casi una proiezione non altera la cardinalità di una relazione La selezione non cambia il grado di una relazione La selezione non cambia mai la cardinalità di una relazione 15 Le relazioni R e S hanno schema: R (A, B, C) e S (C, D, E). Qual è lo schema di R a) b) c) d) T T T T V V V V F F F F S? (S.C, D, E) (A, B, R.C, S.C, D, E) (A, B, C, D, E) (A, B, R.C) 16 Data la tabella anagrafica A (Codice, Cognome, Città), per ottenere l’elenco delle anagrafiche dei soggetti che risiedono a Genova, bisogna eseguire l’interrogazione: a) Proiezione di A su Città b) Proiezione di A su Codice c) Selezione di A per Cognome d) Selezione di A per Città = “Genova” 17 Le relazioni R e S hanno schema: R (A, B, C) e S (C, D, E). Qual è lo schema di R left join S? a) b) c) d) T T T T (R.C, D, E) (A, B, R.C, S.C, D, E) (A, B, R.C, D, E) (A, B, R.C) 18 Quali delle seguenti affermazioni sono vere (V) e quali false (F)? a) Il join naturale non è altro che un left join seguito da un’opportuna proiezione b) Il left join tra due tabelle produce una tabella che include tutte le righe presenti nel join naturale tra le due tabelle c) Il full join di R e S contiene tutte le righe presenti nel left join tra R e S e quelle generate dal right join tra R e S d) Le righe in comune tra il rigth join e il left join tra due tabelle sono quelle del join naturale tra le tabelle © Istituto Italiano Edizioni Atlas V F V F V F V F 179 parte prima Progettazione della base di dati capitolo 4 Modello relazionale Nelle domande successive si fa riferimento alle tabelle A, M di schema: A (Codice, Cognome, Città) M (Numero, Importo, Causale, Data, Codice) dove A e M rappresentano, in forma molto semplificata, un’anagrafica di soggetti e i movimenti contabili ad essi collegati. 19 Per ottenere numero e importo dei movimenti di “Bianchi” si deve eseguire l’interrogazione: ATTIVITÀ DI AUTOVERIFICA a) Proiezione di A su Cognome Selezione del risultato per Cognome=”Bianchi” Congiunzione del risultato con M su Codice b) Selezione di A per Cognome=”Bianchi” Congiunzione del risultato con M su Codice Proiezione del risultato su Numero, Importo c) Congiunzione di A e M su Codice Proiezione del risultato su Numero, Importo Selezione del risultato per Cognome=”Bianchi” d) Selezione di A per Cognome = “Bianchi” Proiezione del risultato su Numero, Importo Congiunzione del risultato con M su Codice 20 Per ottenere causale e importo dei movimenti di importo maggiore di 5000 si deve eseguire l’interrogazione: a) Selezione di M per Importo > 5000 Proiezione del risultato su Causale, Importo b) Selezione di A per Importo > 5000 Congiunzione del risultato con M su Codice Proiezione del risultato su Causale, Importo c) Congiunzione di A e M su Codice Proiezione del risultato su Causale, Importo d) Selezione di M per Importo > 5000 Congiunzione del risultato con M su Codice Proiezione del risultato su Numero, Importo 21 Per ottenere l’elenco dei soggetti (con codice e cognome) che hanno effettuato movimenti con causale “Vers” di importo superiore a 5000, si deve eseguire l’interrogazione: a) Proiezione di A su Codice, Cognome Congiunzione del risultato con M su Codice Selezione del risultato per Causale = “Vers” e Importo > 5000 b) Proiezione di A su Codice, Cognome Selezione di M per Causale = “Vers” e Importo > 5000 Congiunzione dei risultati su Codice c) Selezione di M per Causale = “Vers” e Importo > 5000 Proiezione di A su Codice, Cognome Congiunzione dei risultati su Codice d) Selezione di M per Causale = “Vers” e Importo > 5000 Congiunzione del risultato con A su Codice Proiezione del risultato su Codice, Cognome 180 © Istituto Italiano Edizioni Atlas parte prima Progettazione della base di dati capitolo 4 Modello relazionale 22 L’interrogazione: Selezione di A per Cognome = “Rossi” Congiunzione del risultato con M su Codice Proiezione del risultato su Importo, Causale permette di ottenere: a) l’elenco dei movimenti di Rossi b) l’elenco dei movimenti di Rossi con Codice, Importo e Causale c) l’elenco dei movimenti di Rossi con Importo e Causale d) l’elenco dei movimenti di Rossi con tutti i campi 23 L’interrogazione: ATTIVITÀ DI AUTOVERIFICA Selezione di A per Città = “Pescara” Proiezione del risultato su Codice, Cognome permette di ottenere: a) l’elenco delle anagrafiche di Pescara con tutti i campi b) l’elenco delle anagrafiche di Pescara con Cognome, Codice e Città c) l’elenco delle anagrafiche di Pescara con Codice e Città d) l’elenco delle anagrafiche di Pescara con Codice e Cognome 24 L’interrogazione: Selezione di A per Cognome = “Bianchi” Selezione di M per Causale = “Prel” Congiunzione dei risultati su Codice permette di ottenere: a) l’elenco dei prelievi di Bianchi con tutti i campi b) l’elenco dei prelievi di Bianchi con Cognome e tutti i campi di M c) L’elenco dei movimenti di Bianchi con tutti i campi d) L’elenco dei prelievi di Bianchi con tutti i campi di A 25 L’interrogazione: Congiunzione di A e M su Codice Proiezione del risultato su Codice, Cognome permette di ottenere: a) l’elenco di tutti i movimenti b) l’elenco delle anagrafiche che hanno effettuato movimenti c) l’elenco di tutte le anagrafiche d) l’elenco delle anagrafiche che hanno effettuato movimenti, con Codice, Cognome Normalizzazione delle relazioni e integrità referenziale 26 Quali delle seguenti affermazioni sono vere (V) e quali false (F)? a) La normalizzazione delle relazioni ha lo scopo di prevenire la ridondanza b) Le anomalie di aggiornamento, cancellazione, inserimento sono effetti indesiderati della normalizzazione c) La normalizzazione non garantisce la conservazione dell’informazione d) La normalizzazione è una tecnica alternativa alla progettazione concettuale V F V F V F V F 27 Quale delle seguenti affermazioni esprime meglio la definizione di chiave primaria di una relazione? a) un insieme di attributi che permette di identificare in modo univoco una riga della tabella b) la chiave candidata formata dal minor numero di attributi c) una chiave formata da un solo attributo d) un attributo prescelto dal progettista del database © Istituto Italiano Edizioni Atlas 181 parte prima Progettazione della base di dati capitolo 4 Modello relazionale 28 Quali delle seguenti affermazioni sono vere (V) e quali false (F)? a) Una chiave è determinante per ogni attributo della relazione b) Un insieme di attributi determinante per ogni attributo della relazione è una chiave candidata c) Un attributo determinante per ogni attributo della relazione è una chiave candidata d) Un insieme di attributi è determinante di ogni attributo che compone l’insieme V F V F V F V F 29 Quale tra le seguenti frasi esprime meglio il significato di terza forma normale di una relazione? a) b) c) d) la forma normale che elimina la dipendenza transitiva degli attributi dalla chiave una relazione in 2FN che elimina la dipendenza transitiva degli attributi dalla chiave una relazione che rispetta i requisiti fondamentali del modello relazionale la forma normale che elimina la dipendenza parziale degli attributi dalla chiave 30 L’attributo Codice è la chiave di Anagrafica ed è presente come chiave esterna in Movimenti. ATTIVITÀ DI AUTOVERIFICA Se tra le due tabelle sono stati imposti vincoli di integrità referenziale, quali delle seguenti affermazioni sono vere (V) e quali false (F)? a) Non è possibile inserire una riga di Movimenti con un valore di Codice che non sia presente tra i valori di Codice in Anagrafica V F b) Non è possibile inserire una riga di Anagrafica con un valore di Codice che non sia presente in Movimenti come chiave esterna V F c) Non è possibile inserire una riga di Movimenti senza immettere alcun valore per Codice V F d) Non è possibile modificare il valore di un qualsiasi attributo di Anagrafica V F 31 L’attributo Codice è la chiave di Anagrafica ed è presente come chiave esterna in Movimenti. Se tra le due tabelle sono stati imposti vincoli di integrità referenziale, quali delle seguenti affermazioni sono vere (V) e quali false (F)? a) Non è possibile cancellare una riga di Movimenti V F b) Non è possibile modificare il valore di Codice in una riga di Movimenti V F c) È possibile cancellare una riga di Anagrafica a condizione che il valore di Codice non sia presente in nessuna riga di Movimenti V F d) È possibile cambiare il valore di Codice in una riga di Anagrafica sotto opportune condizioni V F 32 Quale tra le seguenti frasi esprime meglio il significato di integrità? a) garantire che le operazioni effettuate sul database da utenti autorizzati non provochino una perdita di consistenza ai dati b) impedire che il database venga danneggiato da interventi accidentali o non autorizzati c) i dati contenuti nel database devono essere effettivamente utilizzabili in altri database d) gli stessi dati non compaiono più volte in archivi diversi, cioè il database è costituito da archivi integrati di dati PROBLEMI Derivazione delle relazioni 1 182 Dato il seguente schema di database: Reparti (CodReparto, NomeReparto) Prodotti (CodProdotto, Descrizione, Prezzo, CodReparto) Vendite (Numero, Data, Quantità, CodProdotto) costruire il modello E/R dei dati che ha originato le tre tabelle Reparti, Prodotti, Vendite. © Istituto Italiano Edizioni Atlas parte prima Progettazione della base di dati capitolo 4 Modello relazionale 2 Si considerino gli studenti di una scuola e le loro provenienze geografiche. Tra l’entità Comune e l’entità Studente esiste un’associazione 1:N, perché molti studenti provengono dallo stesso comune. Costruire il modello E/R e derivare le corrispondenti relazioni. 3 Un centro di formazione offre diversi corsi. Le persone possono iscriversi anche a diversi corsi. Tra l’entità Corso e l’entità Iscritto esiste quindi un’associazione N:N. Costruire il modello E/R e derivare le corrispondenti relazioni. 4 Si consideri l’associazione ricorsiva EssereMadre sull’entità Persona. Costruire il modello E/R e derivare le corrispondenti tabelle. 5 Si consideri l’associazione ricorsiva EssereGenitore sull’entità Persona. Costruire il modello E/R e derivare le corrispondenti tabelle. ATTIVITÀ DI AUTOVERIFICA Operazioni relazionali 6 Dopo aver definito il modello di database con una tabella per i dati delle aziende produttrici e una tabella contenente i dati su modelli diversi di computer (associazione uno a molti), fornire un esempio di selezione, uno di proiezione e uno di congiunzione sulle tabelle. 7 Dopo aver definito il modello di database con una tabella per i dati sui gruppi musicali e una tabella contenente i dati sulle canzoni (associazione uno a molti), fornire un esempio di selezione, uno di proiezione e uno di congiunzione sulle tabelle. 8 Dato il seguente schema di database: Reparti (CodReparto, NomeReparto) Prodotti (CodProdotto, Descrizione, Prezzo, CodReparto) costruire le interrogazioni per ottenere: - Codice e nome dei reparti nei quali non ci sono prodotti - Codice e descrizione dei prodotti che hanno un CodReparto inesistente. 9 Dopo aver definito il modello di database con una tabella per i clienti di un’agenzia di assicurazioni e una tabella con i dati relativi ai veicoli assicurati (associazione uno a molti), determinare le operazioni relazionali necessarie per ottenere: - Cognome, nome e indirizzo di tutti i clienti - Targa e modello per i veicoli con valore assicurato superiore a una cifra prefissata - Cognome, nome dei clienti e modello del veicolo assicurato - Cognome, nome e telefono dei clienti di una provincia prefissata. 10 Dato il seguente schema di database: Reparti (CodReparto, NomeReparto) Prodotti (CodProdotto, Descrizione, Prezzo, CodReparto) Vendite (Numero, Data, Quantità, CodProdotto) costruire le interrogazioni per ottenere: - l’elenco dei prodotti (con Descrizione e Prezzo) venduti in febbraio nel reparto “Alimenti Surgelati” - l’elenco dei prodotti (con Descrizione e Prezzo) del reparto “Cibo per Cani” - l’elenco dei prodotti (con Descrizione e NomeReparto) che hanno originato vendite con quantità venduta > 10 (quantità venduta in una singola vendita) © Istituto Italiano Edizioni Atlas 183 parte prima Progettazione della base di dati capitolo 4 Modello relazionale 11 Dato il seguente schema di database: Stanze Chirurghi Pazienti (Numero, Telefono, Televisore, AriaCond) (Codice, Cognome, Nome, Specialità) (Codice, Cognome, Nome, Indirizzo, CodiceChirurgo, DataIntervento, OraIntervento, SalaOperatoria, NumeroStanza, InizioRicovero, FineRicovero) costruire le interrogazioni per rispondere alle seguenti richieste: - data di ricovero, stanza, data dell’intervento e nome del chirurgo che ha operato un paziente di cui si conoscono nome e cognome - elenco dei pazienti (con nome, cognome e indirizzo) operati da un dato chirurgo nel corso del mese di marzo - elenco dei pazienti (con nome, cognome e indirizzo) ricoverati nel secondo trimestre che sono stati operati da un qualsiasi chirurgo di una data specialità. ATTIVITÀ DI AUTOVERIFICA Dopo aver svolto l’analisi del problema, si costruisca la base di dati a partire dal modello E/R con la definizione delle tabelle e delle caratteristiche degli attributi; definire la procedura per la gestione dei dati; rappresentare poi le interrogazioni proposte con un linguaggio di pseudocodifica, individuando le operazioni relazionali. Utilizzare come riferimento lo svolgimento dei progetti presentati nel paragrafo 5. 12 In un database si vogliono organizzare le informazioni sulle prove sostenute dagli studenti di una scuola nelle diverse materie e con i diversi docenti: si devono quindi conservare i dati degli studenti, dei docenti, delle materie e delle prove in modo da rendere possibili le seguenti interrogazioni: • l’elenco delle prove di uno studente; • l’elenco delle prove effettuate da un docente in una classe; • i voti di uno studente in una materia; • i voti di una classe nella prova svolta in una materia in un determinato giorno; • le date e il tipo delle prove effettuate da un docente in una materia; • le date e il tipo di prove effettuate da un docente in una classe. 13 Organizzare le informazioni relative agli abbonamenti di una casa editrice che pubblica più riviste: ogni rivista possiede molti abbonati e un abbonato può sottoscrivere più abbonamenti a riviste diverse. Dopo aver progettato il modello della base di dati, rappresentare le seguenti interrogazioni: • città di residenza degli abbonati a una rivista; • titolo e prezzo dell’abbonamento di tutte le riviste; • cognome e nome degli abbonati che hanno sottoscritto un abbonamento a una qualsiasi delle riviste nel primo trimestre dell’anno in corso; • titolo e periodicità della rivista con prezzo dell’abbonamento superiore a una cifra prefissata. 14 Le merci di una catena di supermercati sono distribuiti in magazzini di deposito; le entità sono: prodotto, magazzino, acquisto. Con l’arrivo delle merci nei magazzini, vengono archiviati gli acquisti di prodotti con il codice, la data e la quantità: ogni acquisto si riferisce a un solo prodotto. Definire il modello dei dati, ricavare le tabelle e rappresentare le seguenti interrogazioni: • codice, descrizione, prezzo di acquisto dei prodotti di un determinato magazzino; • codice dei prodotti di un determinato magazzino acquistati nella giornata odierna; • data e quantità per gli acquisti dei prodotti aventi il prezzo di acquisto superiore a una cifra prefissata; • codice e descrizione dei prodotti per i quali si sono registrati acquisti con numero di pezzi, per singolo acquisto, superiore a un numero prefissato; • descrizione del prodotto e del magazzino per prezzo di acquisto del prodotto inferiore a una cifra prefissata. 184 © Istituto Italiano Edizioni Atlas parte prima Progettazione della base di dati capitolo 4 Modello relazionale 15 Si vuole gestire con una base di dati il catalogo di un’azienda che vende programmi software ATTIVITÀ DI AUTOVERIFICA provenienti da diversi produttori. Ciascun produttore può fornire diversi prodotti software, classificabili secondo alcune categorie principali; per esempio: sistemi operativi, linguaggi, grafica, ambienti di sviluppo, Internet, ecc. Nella progettazione di questo modello non teniamo conto della parte riguardante la registrazione di ordini o vendite, ma soltanto delle informazioni riguardanti i produttori e le caratteristiche dei prodotti (nome, versione, prezzo, lingua, ecc.). Per facilitare la gestione del catalogo, anche le categorie sono organizzate con un codice e una descrizione. Definire il modello dei dati, ricavare le tabelle e rappresentare le seguenti interrogazioni: • nome e versione dei prodotti in una lingua prefissata; • nome e prezzo dei programmi di un produttore prefissato del quale viene fornito il codice; • denominazione e numero di telefono del produttore di un programma di cui viene fornito il codice; • elenco di tutti i software di una categoria prefissata (della quale viene fornito il codice), con nome, versione, prezzo; • elenco di tutti i software di un certo produttore avente una denominazione prefissata, con nome, versione e lingua; • elenco di tutti i software che costano meno di una cifra prefissata con denominazione del produttore, indirizzo, nome del prodotto, versione e prezzo. Normalizzazione delle relazioni e integrità referenziale 16 Le righe di una tabella contengono le informazioni anagrafiche di uno studente e i voti conseguiti a fine anno in 9 materie. Normalizzare la tabella in modo da ottenere le tabelle in prima forma normale, eliminando gli attributi ripetuti. 17 La tabella Anagrafica contiene informazioni sui dipendenti di un’azienda e ha il seguente schema: Anagrafica (Nome, Cognome, Matricola, Nascita, Indirizzo, CodiceDipartimento, NomeDipartimento, IndirizzoDipartimento, Stipendio) Definire le dipendenze funzionali che sussistono sullo schema di Anagrafica, individuare le eventuali violazioni alla seconda e terza forma normale e scomporre la tabella in due o più tabelle per eliminare le violazioni individuate. 18 La tabella Esami contiene informazioni sui risultati conseguiti dagli studenti negli esami e ha uno dei due seguenti schemi: Esami-1 (Corso, Matricola, Data, Voto, NomeCorso) Esami-2 (Corso, Matricola, Data, VotoInCifre, VotoInLettere) Definire, in entrambi i casi, le dipendenze funzionali che sussistono sullo schema della tabella e individuare le eventuali violazioni alla seconda e terza forma normale. 19 Una tabella contiene per ogni riga il codice del libro, il nome dell’autore, il titolo del libro, il nome dell’editore, l’indirizzo dell’editore, il prezzo e l’anno di edizione. Normalizzare la tabella in modo da ottenere tabelle in terza forma normale che eliminino la dipendenza transitiva. 20 La tabella Materiali contiene informazioni sui materiali metallici di un magazzino e sui tipi di acciaio utilizzati, e ha il seguente schema: Materiali (Codice, Descrizione, Fornitore, Prezzo, IndirizzoFornitore, Quantità, PosizioneInMagazzino, CodiceAcciaio, DescrizioneAcciaio, ResistenzaAcciaio, NomeFornitore) Definire le dipendenze funzionali che sussistono sullo schema di Materiali, individuare le eventuali violazioni alla seconda e terza forma normale e scomporre la tabella in due o più tabelle per eliminare le violazioni individuate. © Istituto Italiano Edizioni Atlas 185 parte prima Progettazione della base di dati capitolo 4 Modello relazionale SCHEDA DI AUTOVALUTAZIONE CONOSCENZE Concetti fondamentali del modello relazionale Requisiti del modello relazionale Regole di derivazione del modello logico Derivazione delle associazioni uno a uno Derivazione delle associazioni ricorsive Operazioni relazionali: selezione, proiezione, join Join esterno e self join Interrogazioni con più operatori Normalizzazione delle relazioni Integrità referenziale ABILITÀ Dato un problema, costruire il modello E/R e derivare le tabelle Derivare le tabelle da un’associazione ricorsiva Fornire esempi di selezione, proiezione e congiunzione sulle tabelle Date le tabelle, determinare le operazioni relazionali per eseguire le interrogazioni Individuare le violazioni alle forme normali Trasformare le tabelle in prima, seconda e terza forma normale Applicare le regole pratiche di integrità referenziale nelle operazioni di manipolazione DOMANDE PER LA PREPARAZIONE ALLA PROVA ORALE p. 532 SOLUZIONI AI QUESITI DI AUTOVERIFICA p. 536 186 © Istituto Italiano Edizioni Atlas 6 parte seconda Ambienti software per i database Il linguaggio SQL OBIETTIVI DI APPRENDIMENTO In questo capitolo imparerai ad applicare correttamente i principi del modello relazionale e a codificare nel linguaggio SQL le operazioni relazionali. Sarai in grado di interrogare il database usando il linguaggio SQL per estrarre informazioni e controllare la correttezza delle azioni programmate. © Istituto Italiano Edizioni Atlas Caratteristiche generali del linguaggio SQL Identificatori e tipi di dati La definizione delle tabelle I comandi per la manipolazione dei dati Il comando Select Le operazioni relazionali nel linguaggio SQL Le funzioni di aggregazione Ordinamenti e raggruppamenti Le condizioni di ricerca Interrogazioni nidificate Le viste logiche I comandi per la sicurezza parte seconda Ambienti software per i database capitolo 6 Il linguaggio SQL 1 Introduzione Nel primo capitolo si è osservato che, tramite i servizi di un DBMS, è possibile gestire gli archivi di un sistema informativo con notevole efficienza, avendo a disposizione uno specifico linguaggio per: • definire e creare il database; • effettuare le diverse operazioni di gestione dei dati, quali l’inserimento, la cancellazione e la variazione dei record di un archivio; • interrogare il database a scopo informativo. Il linguaggio deve permettere di fare tutto questo facilmente ed essere basato su costrutti semplici e facili da imparare. Le sue caratteristiche, infine, devono essere standardizzate in modo che un utente, cambiando DBMS, non debba apprendere un nuovo linguaggio per usare la base di dati. Il linguaggio SQL (Structured Query Language) è nato con l’intento di soddisfare a queste richieste nei database relazionali. Le interrogazioni che si possono costruire con SQL sono un’estensione di quelle che si possono realizzare con sequenze di operazioni relazionali, in quanto con SQL è possibile, come nelle query di Access, effettuare calcoli, raggruppamenti e ordinamenti. Access permette di costruire una query in modalità QBE e di visualizzare il corrispondente codice in SQL. È anche possibile costruire l’interrogazione in SQL e, passando alla Visualizzazione Struttura, visualizzare la versione QBE della query. Per imparare il linguaggio è molto utile passare da una modalità all’altra e osservare come una frase di SQL viene rappresentata in QBE oppure come una query QBE, di cui si conoscono gli effetti, viene tradotta in SQL. La conoscenza di SQL è di grande importanza anche nello sviluppo di applicazioni direttamente con Access in modalità QBE per le seguenti ragioni: - ci sono interrogazioni che non si riescono a sviluppare nella sola modalità QBE di Access; - per scrivere le interrogazioni nidificate, di cui si parlerà nei prossimi paragrafi, in modalità QBE bisogna inserire un comando SQL nella riga dei criteri; - volendo inserire in una maschera una casella combinata che permetta la scelta da un elenco di dati estratti da una tabella, bisogna scrivere un’interrogazione SQL da inserire tra le proprietà della casella; - scritta un’interrogazione in modalità QBE e dovendola modificare, è spesso più facile e rapido modificare il codice SQL dell’interrogazione che la versione QBE originale. Nel seguito della presentazione del linguaggio SQL faremo riferimento al seguente esempio. PROGETTO 1 Un’azienda è articolata in un certo numero di dipartimenti. I dipendenti sono assegnati ai diversi dipartimenti che hanno a capo un manager responsabile della gestione. Le entità individuate sono: • Impiegato con le informazioni sui dipendenti: il codice identificativo, nome, cognome, residenza e stipendio; • Dipartimento con le informazioni sui dipartimenti: il codice, il nome del dipartimento e il suo indirizzo. Tra Impiegato e Dipartimento si individuano due associazioni. 250 © Istituto Italiano Edizioni Atlas parte seconda Ambienti software per i database capitolo 6 Il linguaggio SQL La prima è l’associazione Comprendere che è un’associazione uno a molti tra Dipartimento e Impiegato perché un impiegato è compreso in un solo dipartimento, mentre un dipartimento è composto da molti impiegati. La partecipazione all’associazione è obbligatoria per Impiegato e facoltativa per Dipartimento, nell’ipotesi che ci possano essere dipartimenti ai quali non sono ancora stati assegnati dipendenti. La seconda associazione è Coordinare che mette in relazione un dipartimento con il dipendente che lo dirige. Coordinare è un’associazione uno a molti perché, nell’azienda in esame, un dipendente può essere a capo di più di un dipartimento, mentre un dipartimento è diretto da un unico manager. In questa associazione la partecipazione di Impiegato è facoltativa in quanto solo alcuni dipendenti sono manager, mentre la partecipazione di Dipartimento è obbligatoria perché tutti i dipartimenti devono essere diretti da qualcuno. Rappresentiamo l’analisi dei dati con il seguente diagramma E/R: N Comprendere 1 Impiegato ID {PK} Nome Cognome Residenza Stipendio Dipartimento 1 Coordinare N Codice {PK} Descrizione Sede Verifichiamo il modello costruito con le regole di lettura, ottenendo le seguenti frasi: Ogni impiegato deve essere compreso in un solo dipartimento; ogni dipartimento può comprendere uno o più impiegati. Ogni impiegato può coordinare uno o più dipartimenti; ogni dipartimento deve essere coordinato da un solo impiegato. Gli attributi di Impiegato sono: ID, Nome, Cognome, Residenza, Stipendio, con ID chiave primaria dell’entità, mentre quelli di Dipartimento sono: Codice, Descrizione, Sede, con Codice chiave primaria dell’entità. Il passaggio dal modello concettuale al modello relazionale permette di definire le due associazioni con il seguente schema, nel quale l’attributo sottolineato rappresenta la chiave primaria, mentre quello in corsivo è la chiave esterna della relazione: Impiegati (ID, Nome, Cognome, Residenza, Stipendio, Dipartimento) Dipartimenti (Codice, Descrizione, Sede, Manager) L’attributo Dipartimento di Impiegati contiene il codice del dipartimento di appartenenza di un dipendente ed è stato introdotto per rappresentare l’associazione uno a molti tra Dipartimento e Impiegato. Analogamente l’attributo Manager di Dipartimento rappresenta l’associazione uno a molti tra Impiegato e Dipartimento e contiene il valore della chiave primaria del dipendente che dirige il dipartimento. Dalla figura nella pagina seguente, che mostra un esempio di dati delle due relazioni, si può osservare che l’impiegato con ID = 6 lavora nel dipartimento Magazzino, che è diretto dal dipendente con ID = 10, (Margherita Colombi). La quinta riga della relazione Dipartimenti evidenzia che anche il dipartimento Produzione è diretto da Margherita Colombi. Si noti anche l’impiegato con ID = 5 che non è assegnato ad alcun dipartimento. Questa situazione, in violazione all’obbligatorietà della partecipazione di Dipendente all’associazione Comprendere, si può presentare per un dipendente appena assunto e non ancora assegnato ad alcun dipartimento. © Istituto Italiano Edizioni Atlas 251 parte seconda Ambienti software per i database capitolo 6 Il linguaggio SQL 2 Caratteristiche generali del linguaggio SQL Il linguaggio SQL è un linguaggio non procedurale che è diventato uno standard tra i linguaggi per la gestione di database relazionali. Dopo una prima versione introdotta da IBM alla fine degli anni ’70 per un prototipo di ricerca denominato System R, negli anni ’80 fu adottato con il nome attuale come linguaggio per i software DBMS prodotti dalla IBM (DB2 e SQL/DS). Nel 1986 l’ANSI (American National Standards Institute) pubblicò il primo standard del linguaggio SQL, al quale seguì lo standard dell’ISO (International Standards Organization) pubblicato nel 1987. Successivamente le specifiche del linguaggio vennero precisate e ampliate: gli aggiornamenti degli standard portarono alla versione, detta SQL2, pubblicata nel 1992 da ISO (ISO 9075) e alla successiva, indicata come SQL3, pubblicata nel 1999 da ISO come ISO 9075-2. Oggi il linguaggio SQL viene usato in tutti i prodotti DBMS come linguaggio di comandi per l’utente della base di dati (ricordiamo Oracle, MySQL, SQLServer, Access). Alcuni di questi prodotti, sviluppati originariamente per sistemi di elaborazione grandi e medi, sono stati poi adattati con versioni per personal computer, con l’uso di SQL come linguaggio relazionale. Le diverse versioni del linguaggio SQL sono in genere aderenti agli standard internazionali, ma ci sono sicuramente delle differenze che possono essere individuate attraverso la documentazione fornita con i prodotti software. Spesso si possono trovare le istruzioni SQL inserite nei programmi scritti con i linguaggi di programmazione tradizionali (linguaggi ospite), oppure il linguaggio SQL rappresenta uno degli strumenti principali all’interno di ambienti di sviluppo software: in questi casi si parla di Embedded SQL. Le parole-chiave che costituiscono i comandi del linguaggio SQL possono essere usate in modo interattivo, scrivendole direttamente sulla tastiera nel momento in cui si vogliono attivare. Tuttavia in molti ambienti i comandi possono essere inviati al sistema attraverso un’interfaccia grafica, che utilizza menu, finestre e icone per guidare l’utente nella costruzione dell’istruzione SQL. La terminologia del linguaggio SQL è analoga a quella di Access dove un database è costituito da tabelle, che rappresentano le relazioni; gli attributi sono le colonne della tabella e i record sono le righe della tabella. Rispetto ai linguaggi di programmazione, il linguaggio SQL, per la semplicità nell’uso delle istruzioni, la concisione dei comandi e la visione tabellare dei dati, può sicuramente aumentare la produttività nel progetto e nello sviluppo delle applicazioni orientate alla gestione di archivi di dati. 252 © Istituto Italiano Edizioni Atlas parte seconda Ambienti software per i database capitolo 6 Il linguaggio SQL Il linguaggio SQL consente all’utente di: • definire la struttura delle relazioni del database e di controllare gli accessi al database (funzioni di DDL), • modificare i dati contenuti nel database, con le operazioni di inserimento, variazione e cancellazione (funzioni di DML), • porre interrogazioni al database (funzioni di Query Language). Il linguaggio SQL fornisce inoltre gli opportuni comandi per definire in modo facile i tabulati di uscita dei risultati (report), per recuperare i dati quando accade un’interruzione del programma, un guasto nei supporti magnetici o un malfunzionamento del sistema, per definire le viste degli utenti sul database, per garantire la sicurezza dei dati nei confronti degli accessi di più utenti. 3 Identificatori e tipi di dati Il linguaggio SQL utilizza i caratteri alfabetici, le cifre decimali, gli operatori aritmetici e di confronto (+ - / * = < >), più altri caratteri che assumono particolari significati nella sintassi delle istruzioni e che verranno descritti nel seguito. Gli identificatori (nomi di tabelle e di attributi) sono costituiti da sequenze di caratteri di lunghezza massima uguale a 18 caratteri: devono iniziare con una lettera e possono anche contenere il carattere _. Il nome di un attributo, ovvero di una colonna di una tabella, è identificato per mezzo della notazione abituale: NomeTabella.NomeAttributo nella quale il nome della tabella e il nome dell’attributo vengono separati da un punto. Il nome della tabella può essere omesso se non ci sono ambiguità nell’identificazione dell’attributo. Nella dichiarazione della struttura di una tabella occorre specificare il tipo dei dati scelto per gli attributi. I tipi standard del linguaggio SQL sono: BOOLEAN Valore logico True, False CHARACTER(n) Stringa di lunghezza n n da 1 a 15000 DATE Data nella forma MM/GG/AA TIME Ora nella forma HH:MM INTEGER(p) Numero intero con precisione p p da 1 a 45 SMALLINT Numero intero con precisione 5 da -32768 a 32767 INTEGER Numero intero con precisione 10 da -2.147.483.648 a 2.147.483.647 DECIMAL(p,s) Numero decimale con precisione p e s cifre decimali p da 1 a 45 e s da 0 a p REAL Numero reale con mantissa di precisione 7 valore 0 oppure valore assoluto da 1E-38 a 1E+38 FLOAT (o DOUBLE PRECISION) Numero reale con mantissa di precisione 15 valore 0 oppure valore assoluto da 1E-308 a 1E+308 FLOAT(p) Numero reale con mantissa di precisione p p da 1 a 45 Per i dati numerici la precisione p indica il numero massimo di cifre che il numero può contenere, esclusi il segno e il punto decimale. Per i numeri decimali il valore s indica il numero di cifre che seguono il punto decimale. © Istituto Italiano Edizioni Atlas 253 parte seconda Ambienti software per i database capitolo 6 Il linguaggio SQL I dati numerici floating point sono memorizzati in forma esponenziale; la precisione riguarda solo le cifre della mantissa e indica il numero di cifre significative del dato. La parola NUMERIC può essere usata al posto di DECIMAL. La parola CHARACTER è equivalente a CHARACTER(1), e può essere abbreviata con CHAR. DECIMAL è equivalente a DECIMAL(15,0). Altre abbreviazioni sono: • CHAR(n) invece di CHARACTER(n); • INT(p) invece di INTEGER(p); • DEC(p,s) invece di DECIMAL(p,s). Occorre osservare che alcune versioni di SQL in specifici ambienti DBMS differiscono dallo standard nell’indicazione dei tipi di dati. Le stesse considerazioni valgono anche per le successive istruzioni del linguaggio: in diverse versioni del linguaggio SQL ci possono essere varianti nella sintassi e nei termini utilizzati. Per risolvere questi problemi è opportuno sempre controllare gli esempi presentati nei manuali per l’utente o nell’help in linea del linguaggio. Le costanti stringa sono delimitate dai caratteri ' o ". Il delimitatore standard è l’apice '. Nelle colonne della tabella gli attributi che hanno un valore non disponibile, o non definito, assumono il valore Null. Il valore Null non è mai uguale a nessun altro valore: è diverso dal valore zero per i dati numerici e dalla stringa vuota (") per i dati alfanumerici. Negli ordinamenti il valore Null compare, di norma, all’inizio delle sequenze crescenti e alla fine delle sequenze decrescenti. Le costanti numeriche possono avere o non avere il segno + oppure –. Nei numeri decimali la parte intera è separata dalle cifre decimali attraverso il punto. I numeri in floating point possono essere rappresentati in forma esponenziale, per esempio –1.2E+7. Nelle operazioni di confronto i numeri sono controllati in accordo con il loro valore algebrico, mentre le stringhe sono confrontate carattere per carattere a partire da sinistra secondo il codice ASCII. Nelle scrittura delle condizioni possono essere usati gli operatori NOT, AND e OR. Tutti i risultati di confronti numerici o stringa che riguardano attributi con valore Null sono considerati sconosciuti, perché Null non è uguale, maggiore o minore di nessun altro valore. Il linguaggio SQL può solo controllare la presenza o l’assenza di Null in una colonna. 4 La definizione delle tabelle Le tabelle vengono definite con il comando CREATE TABLE, seguito dal nome della tabella e dall’elenco degli attributi. Per ogni attributo occorre specificare il nome e il tipo di dato. Gli attributi possono essere qualificati mediante diverse clausole con le quali è possibile definire: la chiave primaria, le chiavi esterne, l’obbligatorietà e il valore di default di un campo. PROGETTO 2 Creare la tabella degli Impiegati e dei Dipartimenti. Per creare la tabella Impiegati del database utilizzato in questo capitolo si deve usare il seguente comando: CREATE TABLE ID Nome Cognome Residenza Stipendio Dipartimento 254 Impiegati( smallint primary key, char(20) not null, char(30) not null, char(20) default '*** Manca Residenza', decimal(9,2), char(5) references Dipartimenti(Codice)); © Istituto Italiano Edizioni Atlas parte seconda Ambienti software per i database capitolo 6 Il linguaggio SQL L’attributo ID è dichiarato chiave primaria della tabella tramite la clausola PRIMARY KEY. La clausola NOT NULL indica che in tutte le righe della tabella quella colonna deve essere riempita con un valore non nullo e rende il campo obbligatorio. La clausola DEFAULT definisce il valore da attribuire al campo se, al momento della creazione del record che lo contiene, non gli viene assegnato alcun valore. La clausola REFERENCES indica che l’attributo Dipartimento è chiave esterna e definisce un vincolo di integrità referenziale con la tabella Dipartimenti. Tra le altre clausole ammesse va ricordata la clausola UNIQUE che vieta la presenza di valori duplicati in una colonna o in un insieme di colonne. Per esempio, per indicare che non ci possono essere due dipendenti con identico nome e cognome nello stesso dipartimento, si può sfruttare la clausola UNIQUE: UNIQUE(Cognome, Nome, Dipartimento) inserita nel comando CREATE TABLE, di seguito alla dichiarazione delle caratteristiche dell’attributo Dipartimento, prima dei caratteri parentesi chiusa e punto e virgola ( ); ) che chiudono la dichiarazione. Anche le clausole PRIMARY KEY e REFERENCES possono essere inserite in righe isolate; questa caratteristica permette di dichiarare chiavi primarie o chiavi esterne formate da più campi. Assieme alla definizione di una chiave esterna è possibile dichiarare il tipo di comportamento da tenere in caso di cancellazione di una riga nella tabella collegata o di variazione del valore della chiave primaria associata alla chiave esterna. Per esempio, per creare la tabella Dipartimenti si deve usare il seguente comando: CREATE TABLE Dipartimenti( Codice char(5), Descrizione char(20) not null, Sede char(20), Manager smallint, Primary Key (Codice), Unique (Descrizione), Foreign Key (Manager) references Impiegati(ID) On Delete set null On Update cascade); Osservando le ultime clausole del comando si può affermare che: - Codice è chiave primaria della tabella (Primary Key); - non ci possono essere due dipartimenti con lo stesso nome: Unique (Descrizione); - è possibile dichiarare la chiave esterna in una riga a sé stante (Foreign Key); - Manager è chiave esterna associata alla tabella Impiegati; - la cancellazione di una riga di Impiegati con un valore di ID assunto in una o più righe di Dipartimenti dal campo Manager è permessa e i valori di Manager corrispondenti assumono valore nullo (On Delete set null); - l’aggiornamento di un ID associato a Manager si riflette a catena sui valori di Manager (On Update cascade). Per esempio, ricordando che Margherita Colombi (ID=10) è responsabile dei dipartimenti Magazzino e Produzione, la cancellazione del record con ID=10 di Impiegati è ammesso e nelle righe dei record descrittivi di Magazzino e Produzione in Dipartimenti il campo Manager assumerà il valore Null; se a Margherita Colombi viene assegnato un nuovo valore di ID esso viene attribuito al campo Manager nelle righe dei dipartimenti Magazzino e Produzione. © Istituto Italiano Edizioni Atlas 255 parte seconda Ambienti software per i database capitolo 6 Il linguaggio SQL Si osservi che le dichiarazioni: On Delete cascade e On Update cascade coincidono con le scelte Elimina record correlati a catena e Aggiorna campi collegati a catena che possono essere effettuate con Access nella definizione delle relazioni tra tabelle, come si è visto nel capitolo 5. Le dichiarazioni On Delete no action e On Update no action impediscono di cancellare un record della tabella Impiegati correlato alla chiave esterna di Dipartimenti o di modificare il valore della chiave primaria di un dipendente che è manager in qualche dipartimento. Se nella clausola Foreign Key non appare la dichiarazione On Delete oppure On Update, il comportamento del sistema per garantire l’integrità referenziale è del tipo no action. La struttura di una tabella può essere modificata in un secondo tempo con il comando ALTER TABLE, per aggiungere una nuova colonna (ADD) a quelle già esistenti, oppure per togliere una colonna (DROP). Per esempio, per inserire un nuovo attributo con la data di nascita del dipendente si usa il comando: ALTER TABLE Impiegati ADD Nascita date; Utilizzando l’opzione Drop si può togliere dalla tabella Impiegati l’attributo che si riferisce alla località di residenza: ALTER TABLE Impiegati DROP Residenza; L’istruzione CREATE INDEX viene utilizzata per creare un nuovo indice su una tabella esistente, indicando il nome della tabella e il nome dell’attributo o degli attributi ai quali associare l’indice. Se non si vuole che ci siano valori duplicati per l’attributo associato all’indice, occorre usare la clausola UNIQUE. Per esempio il comando seguente crea un indice di nome IndiceImpiegati sulla tabella Impiegati secondo gli attributi Cognome e Nome e non sono ammessi duplicati. CREATE UNIQUE INDEX IndiceImpiegati ON Impiegati(Cognome, Nome); Una tabella o un indice possono essere eliminati con il comando DROP, seguito dal nome della tabella o dell’indice. Per esempio, il seguente comando cancella la tabella Impiegati: DROP TABLE Impiegati; In modo analogo per cancellare l’indice di nome IndiceImpiegati si usa il comando: DROP INDEX IndiceImpiegati ON Impiegati; I comandi illustrati finora rappresentano la parte del linguaggio SQL che fa riferimento alla categoria dei comandi definiti con la sigla DDL (Data Definition Language), cioè il linguaggio che consente di implementare il modello logico dei dati sulle memorie di massa del computer. Occorre osservare che nelle versioni moderne dei prodotti DBMS le operazioni di creazione di tabelle e di indici, oltre che di modifica alla struttura della tabella o di cancellazione di tabelle e indici, vengono effettuate, come in Access, attraverso un’interfaccia interattiva che facilita il lavoro dell’utente, il quale può anche non conoscere la sintassi dei comandi sopra illustrati. 256 © Istituto Italiano Edizioni Atlas parte seconda Ambienti software per i database capitolo 6 Il linguaggio SQL 5 I comandi per la manipolazione dei dati I valori degli attributi nelle righe della tabella possono essere inseriti, aggiornati o cancellati rispettivamente con i comandi INSERT, UPDATE e DELETE. Illustriamo l’uso di questi comandi con alcuni esempi. PROGETTO 3 Effettuare operazioni di manipolazione sulla tabella Impiegati. Per inserire i valori di una nuova riga della tabella Impiegati, si usa il comando: INSERT INTO Impiegati (ID, Nome, Cognome, Residenza, Stipendio, Dipartimento) VALUES(20, 'Mario', 'Rossini', 'Caserta', 31500, 'Mag'); Per assegnare il dipendente con ID = 20, presente in anagrafica, al dipartimento Produzione, occorre dare il comando: UPDATE Impiegati SET Dipartimento = 'Prod' WHERE Matricola = 20; È possibile cambiare anche più attributi con un solo comando Update elencandone i nomi e i nuovi valori dopo la parola Set, separati dalla virgola. Per cancellare dalla tabella Impiegati i dati del dipendente con ID = 20, si usa il comando: DELETE FROM Impiegati WHERE ID = 20; È molto importante notare che l’uso della clausola Where nei comandi Update e Delete consente di operare su gruppi di record, cioè su molte righe, anziché su una sola riga per volta: basta indicare dopo Where una condizione che deve essere verificata dalle righe che si vogliono modificare o cancellare. Per esempio, se si vuole aumentare del 5% lo stipendio di tutti i dipendenti del dipartimento Produzione, occorre dare il comando: UPDATE Impiegati SET Stipendio = Stipendio * 1.05 WHERE Dipartimento = 'Prod'; Per eliminare dalla tabella Impiegati le righe corrispondenti ai dipendenti del dipartimento Ricerca & Sviluppo, si usa il seguente comando: DELETE FROM Impiegati WHERE Dipartimento = 'R&S'; Come già detto a proposito della creazione delle tabelle, nell’uso pratico del linguaggio, le operazioni di inserimento, così come quelle di modifica e di cancellazione, vengono facilitate mediante l’uso di maschere video che guidano l’utente nelle operazioni di trattamento dei dati, all’interno di un ambiente software basato sull’uso di interfacce grafiche amichevoli. © Istituto Italiano Edizioni Atlas 257 parte seconda Ambienti software per i database capitolo 6 Il linguaggio SQL Si pensi, nel caso di Access, all’uso delle maschere e alla possibilità di manipolare dati agendo direttamente sulla Visualizzazione Foglio dati di una tabella. Quindi i comandi di tipo DML (Data Manipulation Language) presenti all’interno del linguaggio SQL rimangono nascosti all’utente che può effettuare le operazioni di manipolazione senza conoscere la sintassi delle istruzioni. AUTOVERIFICA Domande da 1 a 2 pag. 294 Problemi 1, 2 pag. 296 e 40, 41 pag. 298 6 Il comando Select La caratteristica più importante del linguaggio SQL è la sua capacità di estrarre le informazioni desiderate dal database mediante interrogazioni. Queste funzionalità sono fornite dal comando SELECT che è semplice da usare e allo stesso tempo molto potente. Il comando Select riflette la natura dichiarativa del linguaggio SQL, e le interrogazioni sulle tabelle del database sono eseguite specificando solo cosa si vuole ottenere, senza doversi preoccupare di problemi quali: le modalità di rappresentazione dei dati e i percorsi per ritrovarli nelle memorie di massa. La struttura base del comando Select è la seguente: SELECT Colonne FROM Tabelle WHERE Condizioni Accanto alla parola Select sono indicati i nomi degli attributi (le colonne) da elencare (se è necessario elencare tutti gli attributi basta scrivere il segno di asterisco * dopo Select); nella clausola From vengono indicati i nomi della tabella o delle tabelle usate nell’interrogazione; dopo la clausola Where si specifica una condizione logica su uno o più attributi con lo scopo di filtrare le righe delle tabelle. La condizione logica è espressa secondo le modalità abituali dell’informatica, componendo confronti con gli operatori AND, OR e NOT. Le forme ammesse da SQL per la scrittura di condizioni sono approfondite nel paragrafo 10. PROGETTO 4 Effettuare interrogazioni sulla tabella Impiegati. L’elenco con cognome, nome e residenza dei dipendenti del dipartimento di codice Prod si ottiene con il seguente comando: SELECT Cognome, Nome, Residenza FROM Impiegati WHERE Dipartimento = 'Prod'; L’elenco dei dipendenti (con ID, Cognome, Nome) che lavorano alla produzione e risiedono a Torino si ottiene con la seguente interrogazione: SELECT ID, Cognome, Nome FROM Impiegati WHERE Dipartimento = 'Prod' AND Residenza = 'Torino'; 258 © Istituto Italiano Edizioni Atlas parte seconda Ambienti software per i database capitolo 6 Il linguaggio SQL In questi primi esempi accanto alla parola Select sono stati specificati solo alcuni fra gli attributi della tabella. Per richiedere tutti i dati dei dipendenti che abitano a Roma, si usa il comando Select nella forma: SELECT * FROM Impiegati WHERE Residenza = 'Roma'; Nell’esempio il simbolo * sostituisce l’elencazione di tutti gli attributi della tabella Impiegati. Il comando Select possiede i due predicati ALL e DISTINCT. Con il predicato ALL si richiede che nel risultato dell’interrogazione siano incluse tutte le righe che soddisfano alle condizioni contenute nel comando. Questo predicato è di default e quindi, se non viene fatta nessuna specificazione, sono visualizzate tutte le righe, anche se duplicate, della tabella prodotta dall’interrogazione. Pertanto le due seguenti istruzioni Select sono equivalenti: SELECT * FROM Impiegati WHERE Residenza = 'Milano'; SELECT ALL * FROM Impiegati WHERE Residenza = 'Milano'; Se viene specificato il predicato DISTINCT le righe duplicate nella tabella risultante sono ridotte a una. Per esempio, se si desidera ottenere l’elenco di tutte le località di residenza dei dipendenti, senza duplicati, anche se ci sono località, come Torino, dove risiedono più dipendenti, si deve usare la clausola DISTINCT prima dell’indicazione dell’attributo: SELECT DISTINCT Residenza FROM Impiegati; Si ottiene così l’elenco nella colonna a sinistra. Il comando SELECT nella forma senza la clausola DISTINCT: SELECT Residenza FROM Impiegati; produce invece l’elenco nella colonna a destra che, come si può notare, contiene righe duplicate. Come si è anticipato nel Capitolo 4, i DBMS commerciali, per ragioni di efficienza, non rispettano strettamente il modello relazionale che non ammette la presenza di righe duplicate in una tabella. Il predicato DISTINCT fa in modo che un comando Select produca una tabella coerente con il modello relazionale dei dati. La presenza del predicato DISTINCT in un comando Select impone che una riga sia inclusa nella tabella risultante solo se non c’è un’altra riga con gli stessi valori. La tabella che si ottiene come risultato dell’interrogazione ha di norma un’intestazione delle colonne che riporta i nomi degli attributi; se si vuole modificare tale intestazione, occorre rinominare la colonna usando la clausola AS. © Istituto Italiano Edizioni Atlas 259 parte seconda Ambienti software per i database capitolo 6 Il linguaggio SQL Per esempio, se si vuole ottenere l’elenco degli impiegati con ID, Nome e Cognome, ma si desidera che al posto di ID compaia Matricola come intestazione della colonna, si deve scrivere il seguente comando: SELECT ID AS Matricola, Nome, Cognome FROM Impiegati; Con il comando SELECT si può anche richiedere il calcolo di espressioni sugli attributi presenti nella tabella; la tabella risultante contiene una colonna aggiuntiva con i risultati del calcolo per ogni riga. Questa nuova colonna può essere intestata con una descrizione opportuna utilizzando la parola AS. In assenza di AS l’intestazione della colonna viene costruita dal sistema in modo differente a seconda dell’implementazione. Nel caso di Access il nome è Espr1 per la prima espressione, se compare una seconda espressione questa viene indicata con Espr2, e così via. Per esempio il seguente comando visualizza, accanto agli stipendi attuali, quali sarebbero i nuovi stipendi degli impiegati del magazzino se fossero aumentati del 5%. Gli importi di Stipendio nella tabella, naturalmente, non sono modificati. SELECT Cognome, Nome, Stipendio AS Attuale, Stipendio*1.05 AS Nuovo FROM Impiegati WHERE Dipartimento = 'Mag'; Nella maggior parte degli esempi di questo capitolo per rendere più semplice la descrizione dei comandi di SQL, vengono utilizzati valori costanti nelle condizioni scritte nella clausola Where, come nel caso della seguente interrogazione: SELECT Cognome, Nome, Residenza, Stipendio FROM Impiegati WHERE Stipendio >= 55000; che elenca i dipendenti con una retribuzione annua di almeno 55000 euro. In realtà la retribuzione minima da utilizzare nell’operazione di confronto, anziché essere uguale alla costante 55000, potrebbe essere indicata in modo parametrico, per poter usare la stessa interrogazione più volte, in diverse ricerche. Per esempio, nell’SQL di Access questo può essere fatto indicando tra parentesi quadre un messaggio: al momento dell’esecuzione dell’interrogazione all’utente viene richiesto di inserire, con una finestra di dialogo, il valore della retribuzione minima da considerare nell’interrogazione. SELECT Cognome, Nome, Residenza, Stipendio FROM Impiegati WHERE Stipendio >= [Retribuzione minima?]; 260 © Istituto Italiano Edizioni Atlas parte seconda Ambienti software per i database capitolo 6 Il linguaggio SQL Come si è già osservato, il dipendente con ID = 5 non è assegnato ad alcun dipartimento. Volendo ottenere l’elenco di tutti i dipendenti senza dipartimento di assegnazione, si devono identificare le righe con valori nulli nel campo Dipartimento e, per farlo occorre usare l’interrogazione: che genera l’elenco richiesto. Si osservi che per controllare la presenza di valori nulli si deve fare uso del predicato IS NULL, mentre è errato ricercare tali valori con clausole del tipo usato nella seguente query: SELECT ID AS Matricola, Cognome, Nome FROM Impiegati WHERE Dipartimento = ''; Ricerca una stringa vuota in Dipartimento Questa interrogazione produce un elenco vuoto perché non c’è nessuna riga di Impiegati nella quale è stata immessa una stringa di caratteri vuota nel campo Dipartimento. Per scrivere un’interrogazione in SQL nell’ambiente di Access, bisogna creare una nuova query accedendo alla Visualizzazione Struttura, e chiudere la finestra di dialogo Mostra tabella senza scegliere alcuna tabella. Poi si deve fare clic sulla scelta che è diventata la proposta del pulsante Visualizza. Appare una finestra come quella in figura che permette di scrivere l’interrogazione desiderata. 7 Le operazioni relazionali nel linguaggio SQL Le operazioni di selezione, proiezione e congiunzione su una base di dati relazionale vengono realizzate attraverso il comando Select, secondo le diverse forme consentite dalla sintassi di questo comando. Se si vuole rispettare una delle regole del modello relazionale, che non consente la presenza di righe uguali all’interno della stessa tabella, basta porre accanto alla parola Select la clausola Distinct: con questa specificazione la tabella ottenuta non conterrà righe duplicate. La selezione e la proiezione sono già state utilizzate negli esempi di uso del comando Select del precedente paragrafo. L’operazione di selezione, che consente di ricavare da una relazione un’altra relazione contenente solo le righe che soddisfano a una certa condizione, viene realizzata nel linguaggio SQL utilizzando la clausola Where del comando Select. © Istituto Italiano Edizioni Atlas 261 parte seconda Ambienti software per i database capitolo 6 Il linguaggio SQL Per esempio, per ottenere l’elenco con tutti i dati dei dipendenti con stipendio minore di 31000 euro, si opera una selezione sulla tabella Impiegati, estraendo le righe per le quali l’attributo Stipendio è minore di 31000. In pseudocodifica si scrive: σP Impiegati Selezione di Impiegati per Stipendio < 31000 La precedente interrogazione viene codificata in linguaggio SQL con il comando: SELECT * FROM Impiegati WHERE Stipendio < 31000; L’operazione di proiezione, che permette di ottenere una relazione contenente solo alcuni attributi della relazione di partenza, si realizza scrivendo accanto alla parola Select l’elenco degli attributi richiesti. Per esempio, per ottenere l’elenco di tutti i dipendenti con cognome, nome e matricola, si deve effettuare una proiezione sulla tabella Impiegati estraendo soltanto le colonne corrispondenti agli attributi richiesti. In pseudocodifica si scrive: ΠL Impiegati Proiezione di Impiegati su Cognome, Nome, ID Questa operazione viene codificata in linguaggio SQL con il comando: SELECT Cognome, Nome, ID FROM Impiegati Il comando Select può operare su più tabelle, indicandone i nomi (separati da virgola) dopo la parola From e scrivendo, dopo la parola Where, la condizione che fa corrispondere le righe di una tabella con quelle dell’altra. Come si è detto nel precedente capitolo, nella quasi totalità dei casi si vogliono costruire degli equi-join, per cui la condizione da scrivere nella clausola Where consiste nell’uguaglianza tra attributi in due tabelle. Si realizza così l’operazione di congiunzione di due tabelle secondo un attributo comune. Qualora ci sia l’esigenza di maggiore chiarezza nella descrizione del comando, oppure ci siano due attributi con lo stesso nome in due tabelle diverse, è opportuno o necessario, a seconda dei casi, indicare il nome della tabella e il nome dell’attributo separati dal punto. Per ottenere l’elenco di tutti i dipendenti con i dati del dipartimento dove lavorano, occorre effettuare la congiunzione delle tabelle Impiegati e Dipartimenti secondo gli attributi comuni Dipartimento e Codice: ImpiegatiFK DipartimentiPK Congiunzione di Impiegati su Dipartimento e Dipartimenti su Codice In linguaggio SQL si deve scrivere: SELECT * FROM Impiegati, Dipartimenti WHERE Dipartimento = Codice; Per maggiore chiarezza l’interrogazione si può anche scrivere esplicitando, assieme al nome degli attributi, il nome delle tabelle alle quali appartengono: SELECT * FROM Impiegati, Dipartimenti WHERE Impiegati.Dipartimento = Dipartimenti.Codice; 262 © Istituto Italiano Edizioni Atlas parte seconda Ambienti software per i database capitolo 6 Il linguaggio SQL Poiché nella condizione scritta accanto a Where viene usato il segno uguale, la congiunzione precedente fornisce un esempio di equi-join, cioè vengono combinate solo le righe per le quali si possono trovare valori uguali negli attributi che si corrispondono. Nella versione del linguaggio SQL adottata da Access l’equi-join viene indicato, in accordo con la terminologia introdotta nel Capitolo 4, come inner join. Se la precedente interrogazione viene realizzata in Access in modalità QBE e, successivamente, si accede alla query in visualizzazione SQL, il comando visualizzato (una volta ripulito dalle parentesi inutili) è il seguente: SELECT Impiegati.*, Dipartimenti.* FROM Dipartimenti INNER JOIN Impiegati ON Dipartimenti.Codice = Impiegati.Dipartimento; Nella query, mediante la dichiarazione INNER JOIN, è specificato il tipo di congiunzione da costruire, e la condizione di congiunzione è scritta nella clausola From del comando Select, dopo la parola ON. La sintassi adottata da Access è una variante degli standard proposti in SQL2, mentre il modo di costruire le congiunzioni presentato in questo paragrafo è quello dello standard di base del linguaggio. Va precisato che Access (come tutti gli SQL che ammettono quest’ultima sintassi) accetta ed esegue correttamente le interrogazioni costruite secondo lo standard di base. Naturalmente, quando il comando Select è costruito direttamente da Access partendo da una QBE, l’interrogazione è realizzata secondo gli standard tipici della implementazione. La congiunzione di Impiegati con Dipartimenti secondo una qualsiasi delle precedenti sintassi produce la tabella in figura. Dal suo esame si nota che è composta da 11 righe e che nella congiunzione scompare ogni informazione sul dipendente con ID = 5, che non è assegnato ad alcun dipartimento e, analogamente, si perde ogni informazione sul dipartimento di codice Pers, perché non ci sono dipendenti in quel dipartimento. Come si è detto nel Capitolo 4, gli strumenti per recuperare le informazioni sulle righe che non hanno corrispondenti nella congiunzione sono i join esterni e, in particolare, il left join che è presentato nel riquadro a fine paragrafo. Dopo aver visto come si rappresentano nel linguaggio SQL le operazioni fondamentali del modello relazionale, vediamo ora come con SQL si possa costruire un’interrogazione espressa tramite una sequenza di operazioni relazionali. © Istituto Italiano Edizioni Atlas 263 parte seconda Ambienti software per i database capitolo 6 Il linguaggio SQL Per esempio, se si vuole ottenere l’elenco dei dipendenti che lavorano in un dipartimento con sede a Roma, con cognome, nome e descrizione del dipartimento, occorre dapprima operare una selezione su Dipartimenti per Sede = ‘Roma’; poi si deve effettuare una congiunzione della tabella ottenuta con la tabella Impiegati e, infine, applicare una proiezione sugli attributi Cognome, Nome, Descrizione sulla nuova tabella risultante. In pseudocodifica l’interrogazione si rappresenta in questo modo: 1. σP Dipartimenti 2. Temp1PK ImpiegatiFK 3. ΠL Temp2 Temp1=Selezione di Dipartimenti per Sede = ‘Roma’ Temp2=Congiunzione di Temp1 su Codice e Impiegati su Dipartimento Proiezione di Temp2 su Cognome, Nome, Descrizione L’interrogazione viene codificata nel linguaggio SQL con il seguente comando: SELECT Cognome, Nome, Descrizione FROM Impiegati, Dipartimenti WHERE Dipartimento=Codice AND Sede = 'Roma'; La prima condizione scritta dopo Where (Dipartimento = Codice) serve a specificare l’uguaglianza tra gli attributi comuni delle tabelle coinvolte nella congiunzione, la seconda condizione (Sede = 'Roma') specifica il criterio per operare la selezione sulle righe di Dipartimenti. Le due condizioni sono combinate tramite l’operatore AND. La codifica in SQL diventa più precisa facendo precedere il nome delle tabelle ai nomi degli attributi, come mostrato nella seguente versione del comando: SELECT Impiegati.Cognome, Impiegati.Nome, Dipartimenti.Descrizione FROM Impiegati, Dipartimenti WHERE Impiegati.Dipartimento = Dipartimenti.Codice AND Dipartimenti.Sede = 'Roma'; Per semplificare la scrittura del comando Select è possibile fare ricorso agli alias per il nome della tabella, specificando dopo il nome originale della tabella la parola AS seguita dal nuovo nome. Si potrebbe, per esempio, indicare la tabella Impiegati con I e la tabella Dipartimenti con D, limitando il numero di caratteri da digitare e scrivendo comandi più compatti. La precedente interrogazione espressa nel linguaggio SQL di Access diventa: SELECT I.Cognome, I.Nome, D.Descrizione FROM Impiegati AS I INNER JOIN Dipartimenti AS D ON I.Dipartimento = D.Codice WHERE D.Sede = 'Roma'; La scrittura della parola AS è opzionale. Risulta evidente la maggior chiarezza dell’ultima interrogazione rispetto alle due precedenti: la sintassi di Access ha il pregio di separare nettamente la condizione di congiunzione, che viene espressa nella parte From dell’interrogazione, dalle condizioni che devono essere soddisfatte per operare le selezioni, che sono espresse nella parte Where della query. Per sopperire alla minor chiarezza delle interrogazioni scritte nella versione SQL1 è opportuno scrivere la parte Where dell’interrogazione su più righe, come nell’esempio precedente, riportando prima le condizioni per la congiunzione delle tabelle e poi le condizioni che esprimono la selezione. 264 © Istituto Italiano Edizioni Atlas parte seconda Ambienti software per i database capitolo 6 Il linguaggio SQL Dagli esempi precedenti si può osservare come nel linguaggio SQL con poche parole di codice sia possibile estrarre da una base di dati tutte le informazioni che si desiderano. Le stesse operazioni, formulate attraverso le istruzioni di un linguaggio di programmazione tradizionale, richiederebbero un elevato numero di righe di codice, oltre che lunghi processi di ricerca sui file e di confronti tra i campi dei record. IL SELF JOIN E IL LEFT JOIN Mostriamo, con un esempio, come si possa realizzare un self-join su una tabella. Si consideri l’associazione esistente tra un oggetto e le sue parti (che sono ancora oggetti). Consideriamo, in particolare, l’oggetto camicia composto da: 1 colletto, 2 maniche, 10 bottoni, 1 taschino e altri oggetti. È stata introdotta, di fatto, un’associazione ricorsiva sull’entità Oggetto, di attributi: ID, Descrizione e Qta, che è rappresentata nel modello relazionale da una tabella con il seguente schema: Oggetti (ID, Descrizione, Qta, ComponenteDi) Nel caso degli oggetti che compongono una camicia si dovrebbero considerare le 5 righe della tabella Oggetti mostrata in figura: Dalla tabella si vede che l’oggetto identificato dall’ID = 4, il bottone, è una componente dell’oggetto con ID = 1, la camicia, e che in una camicia ci sono 10 bottoni. Naturalmente nella tabella Oggetti ci saranno, oltre all’oggetto Camicia, anche altri oggetti composti, quali: giacca, cappotto e altri, con le relative componenti. Se si vogliono ottenere le informazioni delle diverse parti che compongono gli oggetti, assieme alle informazioni sugli oggetti composti, occorre congiungere la tabella Oggetti con se stessa, cioè operare un self-join. Per esprimere la condizione che una riga di Oggetti deve essere abbinata a una riga, sempre di Oggetti, con il valore di ID uguale a quello di ComponenteDi nell’altra, occorre usare gli alias per il nome della tabella, cioè indicare con due nomi diversi la stessa tabella, utilizzando la parola AS nella clausola From dell’interrogazione, come mostrato nell’esempio in figura. I nomi scelti per rinominare la tabella servono a ricordare i differenti ruoli svolti dalla medesima tabella Oggetti: le parti nel primo caso, i composti nel secondo. © Istituto Italiano Edizioni Atlas 265 parte seconda Ambienti software per i database capitolo 6 Il linguaggio SQL Oltre all’equi-join, il linguaggio SQL permette di costruire forme di join che rispondono all’esigenza di congiungere due tabelle includendo nella congiunzione anche quelle righe di una delle due tabelle che non hanno una riga associata nell’altra. Queste congiunzioni prendono il nome di join esterni e, come si è già detto, corrispondono alle operazioni di left join, right join, full join dell’algebra relazionale. Consideriamo tra questi il left join e mostriamo la sua utilità nella soluzione di un tipico problema di assenza: elencare i dipartimenti che non hanno dipendenti loro assegnati. Per farlo congiungiamo la tabella Dipartimenti e la tabella Impiegati con un left join. In questa congiunzione sono incluse tutte le righe di Dipartimenti, comprese quelle dei dipartimenti senza impiegati associati. Tali righe sono completate con valori nulli in corrispondenza dei campi di Impiegati considerati nell’interrogazione. La figura mostra il codice SQL dell’interrogazione e il risultato sulle tabelle dell’esempio. Si nota, in particolare, la riga con i valori del dipartimento Personale che sono completate con valori nulli nei campi Nome e Cognome. Per identificare i dipartimenti senza impiegati bisogna saper riconoscere le righe con valori nulli, per esempio, nel campo Cognome e, come abbiamo visto nel Paragrafo 6, tali righe si possono selezionare controllando il campo Cognome con il predicato IS NULL. I dipartimenti senza dipendenti sono allora elencati dal seguente comando SQL: SELECT Descrizione FROM Dipartimenti LEFT JOIN Impiegati ON Dipartimenti.Codice = Impiegati.Dipartimento WHERE Cognome IS NULL; 266 ERIA EB W LIBR AUTOVERIFICA Domande da 3 a 8 pag. 294-295 Problemi da 3 a 12 pag. 296-297 e da 42 a 49 pag. 298-299 1. Gli altri tipi di join esterni e le operazioni insiemistiche © Istituto Italiano Edizioni Atlas parte seconda Ambienti software per i database capitolo 6 Il linguaggio SQL 8 Le funzioni di aggregazione All’interno del comando Select possono essere usate funzioni predefinite che agiscono sui valori contenuti in insiemi di righe della tabella e che per questo motivo si chiamano funzioni di aggregazione. Le funzioni di aggregazione agiscono sui valori di una singola colonna e restituiscono un solo valore come il massimo o il minimo dei valori considerati. Le righe considerate per l’aggregazione sono quelle prodotte dall’interrogazione e quindi, in presenza di una clausola Where, sono le sole righe che soddisfano la condizione specificata. Le funzioni di aggregazione possono essere utilizzate solo come argomento scritto accanto a Select oppure nella clausola Having (che sarà spiegata nel riquadro alla fine del prossimo paragrafo). • Funzione COUNT La funzione COUNT conta il numero di righe selezionate dall’interrogazione. La sintassi del linguaggio SQL richiede di specificare come argomento della funzione il nome di un attributo oppure il carattere * (asterisco): nel primo caso non vengono conteggiate le righe che hanno valore Null nella colonna dell’attributo specificato; nel secondo caso, indicando l’asterisco, la funzione Count(*) calcola il numero delle righe della tabella, incluse quelle con campi di tipo Null. In sostanza la funzione Count(*) serve per ottenere la cardinalità di una relazione. Il seguente comando restituisce il numero delle righe presenti nella tabella Impiegati (12 nell’esempio): SELECT COUNT (*) FROM Impiegati; Restituisce 12 Specificando il nome dell’attributo Dipartimento come argomento della funzione Count, si ottiene il numero dei dipendenti della tabella Impiegati che sono assegnati a un dipartimento. (11 nell’esempio perché nel conteggio non sono considerati i valori nulli). SELECT COUNT (Dipartimento) FROM Impiegati; Restituisce 11 La seguente interrogazione restituisce il numero dei dipendenti residenti a Roma presenti nella tabella Impiegati: SELECT COUNT(*) FROM Impiegati WHERE Residenza = 'Roma'; Restituisce 2 Il risultato del conteggio può essere anche descritto con un’opportuna intestazione, come già visto in precedenza, aggiungendo la clausola AS seguita dal nuovo nome da utilizzare come intestazione di colonna. Diversamente la colonna viene presentata con un’intestazione che dipende dall’implementazione di SQL: Access, per esempio, nel caso dell’interrogazione considerata, produce l’intestazione EXPR1000, EXPR1001, ecc. La figura seguente evidenzia il confronto tra i risultati ottenuti con o senza AS. SELECT COUNT(*), COUNT(*) FROM Impiegati WHERE Residenza = 'Roma'; © Istituto Italiano Edizioni Atlas AS ResidentiRoma 267 parte seconda Ambienti software per i database capitolo 6 Il linguaggio SQL • Funzione SUM La funzione SUM restituisce la somma di tutti i valori contenuti in una colonna specificata come argomento della funzione: naturalmente l’attributo utilizzato nel calcolo deve essere di tipo numerico; anche con questa funzione si può usare, se necessario, la parola Distinct prima del nome dell’attributo, se si vogliono eliminare dal calcolo della somma i valori duplicati presenti nella colonna specificata; i valori nulli sono trascurati dalla funzione Sum. Per esempio se si vuole ottenere la somma degli stipendi dei dipendenti che appartengono al dipartimento Amministrazione, occorre usare il comando Select nella forma: SELECT SUM (Stipendio) FROM Impiegati WHERE Dipartimento = 'Amm'; Restituisce 90000 L’argomento della funzione Sum può anche essere un’espressione numerica contenente i nomi di attributi di tipo numerico. Si supponga, per esempio, di voler conoscere l’ammontare degli stipendi del reparto Amministrazione e il nuovo ammontare dopo un incremento del 3%. Si costruisce l’interrogazione: SELECT SUM (Stipendio) AS StipendiAmm, SUM (Stipendio*1.03) AS NuoviStipendiAmm FROM Impiegati WHERE Dipartimento = 'Amm'; • Funzione AVG In modo analogo agisce la funzione AVG (dall’inglese average = media), per calcolare la media dei valori (numerici) contenuti in una determinata colonna di una tabella, con l’eventuale aggiunta dell’opzione Distinct. L’argomento della funzione può essere un’espressione aritmetica anziché il nome di un attributo. La media calcolata dalla funzione Avg equivale alla media aritmetica, cioè la somma dei valori diviso il numero dei valori. La funzione Avg non include nel calcolo i valori di tipo Null presenti nella colonna. Nell’esempio seguente viene calcolato lo stipendio medio dei dipendenti che lavorano in dipartimenti con sede a Torino: SELECT AVG(Stipendio) FROM Impiegati, Dipartimenti WHERE Dipartimento = Codice AND Sede = 'Torino'; Restituisce 46916,67 • Funzioni MIN e MAX Le funzioni MIN e MAX restituiscono rispettivamente il valore minimo e il valore massimo tra i valori della colonna di una tabella specificata come argomento della funzione; le funzioni Min e Max consentono di determinare i valori minimi e massimi anche per campi di tipo carattere. Anche le funzioni Min e Max ignorano i campi con valore Null e possono avere come argomento un’espressione anziché il nome di un attributo. Per esempio, utilizzando un attributo numerico come lo stipendio, si calcolano i valori minimo e massimo degli stipendi di tutti i dipendenti: SELECT MIN(Stipendio), MAX(Stipendio) FROM Impiegati; Restituisce 25000 e 85000 Il seguente esempio di interrogazione invece restituisce il primo cognome e l’ultimo nell’elenco dei dipendenti, specificando come argomento delle funzioni l’attributo Cognome che è di tipo carattere: SELECT MIN(Cognome), MAX(Cognome) FROM Impiegati; 268 Restituisce Bianco e Volpi © Istituto Italiano Edizioni Atlas parte seconda Ambienti software per i database capitolo 6 Il linguaggio SQL 9 Ordinamenti e raggruppamenti Nel comando Select si può inserire la clausola ORDER BY per ottenere i risultati di un’interrogazione ordinati secondo i valori contenuti in una o più colonne, tra quelle elencate accanto alla parola Select. L’indicazione delle colonne da considerare nell’ordinamento avviene precisando il nome della colonna oppure la posizione che essa occupa nella lista che segue la parola Select: 1 per la prima posizione, 2 per la seconda, e così via. L’ordinamento può essere crescente (le stringhe dalla A alla Z e i numeri dal minore al maggiore) oppure decrescente (le stringhe dalla Z alla A e i numeri dal maggiore al minore): i due tipi di ordinamento sono specificati usando rispettivamente le parole chiave ASC per crescente e DESC per decrescente. L’ordinamento è crescente per default e quindi va specificata la parola Desc solo se si desidera l’ordinamento decrescente. Negli ordinamenti il valore Null compare, di norma, all’inizio delle sequenze crescenti e alla fine delle sequenze decrescenti. La clausola Order By, se presente, deve essere l’ultimo elemento di un comando Select. Il seguente esempio produce in output l’elenco alfabetico dei dipendenti, con cognome, nome, residenza: SELECT Cognome, Nome, Residenza FROM Impiegati ORDER BY Cognome, Nome; L’ordinamento viene fatto su due attributi: a parità di cognome i dipendenti vengono ordinati per nome. Se i tipi di ordinamento richiesti riguardano più attributi e sono diversi, occorre aggiungere la parola Desc accanto agli attributi per i quali si vuole l’ordinamento decrescente. L’esempio seguente produce l’elenco dei dipendenti in ordine decrescente di stipendio e, a parità di stipendio, in ordine (crescente) di cognome: SELECT Cognome, Stipendio FROM Impiegati ORDER BY Stipendio DESC, Cognome; Si consideri una tabella delle fatture che contiene tra gli attributi di ogni fattura, la descrizione del prodotto, il suo prezzo unitario e la quantità ordinata. Il seguente comando Select ordina l’elenco per valori decrescenti dell’espressione PrezUnit*Qta (campo 4 tra quelli elencati vicino a Select): SELECT NomeProdotto, PrezUnit, Qta, PrezUnit*Qta FROM Fatture ORDER BY 4 DESC; Forma sconsigliata Si osservi però che l’uso del precedente comando non è raccomandato perché la sua lettura è complicata dalla necessità di riesaminare la clausola Select per capire quale sia il tipo di ordinamento richiesto. Non solo: se, in un secondo tempo, si deve modificare l’elenco dei campi nella clausola Select, bisogna ricordarsi di modificare il valore specificato nella clausola Order By. In queste situazioni, si raccomanda di ridefinire il nome del campo contenente l’espressione con la parola AS e di definire l’ordinamento nella clausola Order By, in modo simbolico, mediante questo nome. SELECT NomeProdotto, PrezUnit, Qta, PrezUnit*Qta AS Totale FROM Fatture Forma raccomandata ORDER BY Totale DESC; © Istituto Italiano Edizioni Atlas 269 parte seconda Ambienti software per i database capitolo 6 Il linguaggio SQL Con le funzioni di aggregazione si condensano le informazioni di una tabella in un solo valore come, per esempio, la somma degli stipendi di tutti i dipendenti. Spesso è però utile sintetizzare i valori per classi omogenee, secondo opportuni criteri di raggruppamento, per esempio per produrre la somme parziali degli stipendi nei diversi dipartimenti. La clausola GROUP BY ha questo scopo, in quanto permette di raggruppare un insieme di righe aventi lo stesso valore nelle colonne indicate dalla clausola. L’opzione produce una riga di risultati per ogni raggruppamento. Se nel comando viene inserita una funzione di aggregazione, come Sum o Count, per ciascuna riga della tabella risultante viene prodotto un valore di raggruppamento. I valori Null sono raggruppati, ma non vengono valutati da nessuna delle funzioni di aggregazione ad eccezione di Count(*). Quando si utilizza una clausola Group By, tutti gli attributi che compaiono nella lista accanto alla parola Select devono essere inclusi nella clausola Group By oppure devono essere argomenti di una funzione di aggregazione. Il comando seguente elenca i dipartimenti dove lavorano i dipendenti, con la somma degli stipendi e il numero dei dipendenti per ogni dipartimento: SELECT Dipartimento, COUNT(ID) AS Dipendenti, SUM(Stipendio) AS Stipendi FROM Impiegati GROUP BY Dipartimento; L’interrogazione viene eseguita per passi: 1. le righe sono raggruppate per dipartimento 2. le funzioni di aggregazione sono applicate ai singoli raggruppamenti. Se nell’elenco prodotto si desidera che compaia il nome per esteso del dipartimento, bisogna includere anche la tabella Dipartimenti nell’interrogazione ed effettuare il raggruppamento sul campo Descrizione: SELECT Descrizione, COUNT(*) AS Dipendenti, SUM(Stipendio) AS Stipendi FROM Impiegati, Dipartimenti WHERE Impiegati.Dipartimento = Dipartimenti.Codice GROUP BY Descrizione; Questa interrogazione differisce dalla precedente non solo per la presenza del nome del dipartimento al posto del suo codice, ma anche per il fatto che nell’elenco generato non ci sono le informazioni sui dipendenti che non sono inquadrati in alcun dipartimento, in quanto queste righe sono escluse dalla congiunzione tra le due tabelle. Si osservi anche l’uso di: COUNT(*) al posto di COUNT(ID), che conta le righe prodotte nei singoli raggruppamenti. 270 © Istituto Italiano Edizioni Atlas parte seconda Ambienti software per i database capitolo 6 Il linguaggio SQL CONDIZIONI SUI RAGGRUPPAMENTI La struttura del comando Select con raggruppamenti può essere ulteriormente ampliata con la clausola HAVING con la quale è possibile sottoporre al controllo di una o più condizioni i gruppi creati con la clausola Group by. La condizione scritta dopo Having in genere controlla il valore restituito dalle funzioni di aggregazione (Count, Sum, Avg, Min, Max). Si noti che la clausola Having deve essere usata insieme a Group By: dopo che Group By ha formato i raggruppamenti di righe, Having serve a visualizzare le sole righe dei raggruppamenti che soddisfano alle condizioni scritte accanto a Having. Il seguente esempio mostra l’uso del comando Select per ottenere, per i soli dipartimenti con più di 2 addetti, il numero degli addetti e la somma degli stipendi. L’elenco si limita al solo dipartimento Produzione che ha 3 addetti. SELECT Dipartimento, COUNT(ID) AS Dipendenti, SUM(Stipendio) AS Stipendi FROM Impiegati GROUP BY Dipartimento HAVING COUNT(ID) > 2; Se l’istruzione Select contiene la clausola Where, i valori vengono raggruppati dopo aver operato la selezione sulle righe che rispettano le condizioni scritte accanto a Where. Con il seguente comando si ottiene l’elenco dei dipartimenti con sede a Torino con più di un addetto: per questi dipartimenti viene elencato oltre al nome anche il numero di impiegati e la somma degli stipendi: La clausola Having presenta caratteristiche analoghe alla clausola Where, ma agisce in modo differente: con Where vengono poste condizioni sulle righe della tabella, con Having il controllo delle condizioni viene fatto sui risultati delle funzioni di aggregazione applicate a gruppi di righe; in sostanza: Having pone condizioni sui gruppi, Where pone condizioni sulle singole righe. Per realizzare l’ultima interrogazione con Access in modalità QBE bisogna trovare il modo di esprimere nella griglia posta nella parte inferiore della QBE sia le condizioni sui raggruppamenti (in Having) sia le condizioni sulle righe (clausola Where). Operando come descritto nel Capitolo 5, si fa clic sul pulsante Totali per attivare la riga Formula nella griglia QBE e si definiscono nei diversi campi raggruppamenti, conteggi, somme in base alle richieste del problema. A questo punto ogni condizione scritta nella riga Criteri della QBE viene interpretata da Access come una condizione sui raggruppamenti e si può verificare che viene inserita di seguito a Having nella Visualizzazione SQL della query. © Istituto Italiano Edizioni Atlas 271 parte seconda Ambienti software per i database capitolo 6 Il linguaggio SQL Per indicare che i raggruppamenti devono essere effettuati solo sulle righe dei dipartimenti con sede a Torino, bisogna inserire il campo Sede in una colonna dello schema QBE e, nella riga della Formula, in corrispondenza di Sede, selezionare Dove dal menu a discesa. Il segno di spunta in corrispondenza di Mostra del campo Sede viene tolto automaticamente e si può verificare che la condizione espressa nella riga Criteri di Sede viene inserita di seguito a Where nella Visualizzazione SQL della query. Sintetizziamo in un unico quadro le diverse clausole che possono apparire nel comando Select: SELECT FROM WHERE GROUP BY HAVING ORDER BY Elenco colonne da mostrare Tabelle da cui estrarre le righe Condizioni sulle righe estratte Campi da considerare per i raggruppamenti Condizioni sui raggruppamenti Ordinamenti sulle colonne elencate nella clausola SELECT È opportuno fare le seguenti precisazioni: • Le uniche clausole che devono comparire obbligatoriamente in un comando Select sono le prime due dell’elenco, le altre sono facoltative. • Le clausole utilizzate devono essere elencate rispettando l’ordinamento del precedente elenco: Select deve precedere From, ..., Having deve precedere Order by. • Le interrogazioni che si possono costruire con le operazioni relazionali si esprimono con le sole clausole Select, From e Where. • Il DBMS esegue il comando elaborando le clausole nel seguente ordine: 272 £ Where £ Group by £ Having £ Select £ Order by ERIA EB W LIBR From 2. Query di comando e query di servizio in Access © Istituto Italiano Edizioni Atlas parte seconda Ambienti software per i database capitolo 6 Il linguaggio SQL 10 Le condizioni di ricerca Le condizioni di ricerca sono utilizzate nelle clausole Where e Having per determinare i criteri di selezione rispettivamente delle righe e dei raggruppamenti. Nella scrittura delle condizioni si usano i segni del confronto =, <, >, <>, >=, <=. Una condizione di ricerca è costruita anche mettendo insieme più condizioni legate tra loro con gli operatori AND e OR, precedute eventualmente dall’operatore NOT. L’ordine di applicazione degli operatori è il seguente: NOT viene applicato prima di AND e AND prima di OR. Le condizioni di ricerca si possono esprimere utilizzando anche altre parole del linguaggio SQL che indicano operatori o predicati, con i quali è possibile rendere più raffinate ed espressive le interrogazioni alla base di dati. • BETWEEN L’operatore BETWEEN controlla se un valore è compreso all’interno di un intervallo di valori, inclusi gli estremi. È possibile specificare, anteponendolo a Between, anche l’operatore logico NOT per valutare la condizione opposta, cioè per controllare se il valore non rientra nell’intervallo specificato. Per ottenere l’elenco dei dipendenti (con cognome, nome, residenza) che hanno retribuzione compresa tra 30000 e 45000 euro, si può usare la parola Between nella scrittura della condizione dopo Where: SELECT Cognome, Nome, Residenza FROM Impiegati WHERE Stipendio BETWEEN 30000 AND 45000; La condizione specificata con Between nella clausola Where è preferibile, per chiarezza e sinteticità, alla condizione equivalente: Stipendio>=30000 AND Stipendio<=45000 • IN L’operatore IN controlla se un valore appartiene a uno dei valori di una lista che viene precisata dopo la parola In all’interno della condizione. Anche IN può essere preceduto da NOT per indicare la condizione opposta, cioè la non appartenenza del valore all’insieme dei valori. Per ottenere tutti i dati dei dipendenti che risiedono a Torino, Venezia e Palermo, si usa il comando Select nella forma: SELECT * FROM Impiegati WHERE Residenza IN ('Torino','Venezia','Palermo'); Anche in questo caso la condizione espressa con In nella clausola Where è sicuramente preferibile alla condizione equivalente: Residenza ='Torino' OR Residenza ='Venezia' OR Residenza ='Palermo' • LIKE L’operatore LIKE confronta il valore di un attributo di tipo carattere con un modello di stringa che può contenere caratteri jolly (o metacaratteri). Anche in questo caso si può usare l’operatore NOT prima di Like per indicare criteri di ricerca opposti. Per l’uso dell’operatore LIKE nelle interrogazioni SQL di Access valgono le convenzioni descritte nel capitolo precedente. © Istituto Italiano Edizioni Atlas 273 parte seconda Ambienti software per i database capitolo 6 Il linguaggio SQL I caratteri jolly sono: _ (underline o underscore) per indicare uno e un solo carattere qualsiasi in quella posizione della stringa; % (percento) per indicare una sequenza di zero o più caratteri in quella posizione della stringa. Per esempio: LIKE 'xyz%' vengono ricercate tutte le stringhe che iniziano con i caratteri 'xyz'; LIKE '%xyz' serve a ricercare tutte le stringhe che finiscono con i caratteri 'xyz'; LIKE '%xyz%' per tutte le stringhe di 3 o più caratteri che contengono i caratteri 'xyz'; LIKE '_xyz' controlla le stringhe di 4 caratteri che finiscono con 'xyz'. L’operatore Like utilizzato con un modello di stringa che non contiene caratteri jolly è del tutto equivalente all’operatore =. Con il comando Select scritto nella forma seguente, è possibile ottenere il cognome e il dipartimento dei dipendenti con il cognome che inizia con ‘R’; SELECT Cognome, Dipartimento FROM Impiegati WHERE Cognome LIKE 'R%'; Per ricercare uno dei caratteri jolly in una stringa si deve usare uno speciale carattere, detto carattere escape per qualificare il carattere come carattere da ricercare e non come un metacarattere. Il carattere escape viene precisato con la dichiarazione ESCAPE. Per esempio, per ricercare la presenza del carattere _ nel nome di un dipartimento, si usa la seguente condizione: LIKE '%$_%' ESCAPE '$'. Il carattere ‘$’ è il carattere escape e, pertanto, la sequenza ‘$_’ precisa che il carattere _ (underline) è il carattere da ricercare nella stringa e non un carattere jolly. Si noti che il linguaggio SQL di Access accetta, come molte altre implementazione di SQL, la coppia di caratteri jolly: ? ed * in sostituzione dei caratteri di sottolineatura _ e di percentuale %. In sostanza nel linguaggio SQL di Access: - con ? si vuole indicare la presenza di uno e un solo carattere nella stringa modello; - il carattere * indica una sequenza qualsiasi (anche vuota) di caratteri. • IS NULL Il predicato IS NULL confronta il valore in una colonna con il valore Null. L’uso di questo predicato è il solo modo per controllare la presenza del valore Null in una colonna. È possibile inserire l’operatore di negazione NOT per valutare la condizione opposta: in altre parole, per controllare se un attributo non ha valore nullo, si usa il predicato IS NOT NULL. L’operatore Is viene utilizzato solo con la parola Null. Per esempio se si vuole ottenere l’elenco con cognome e nome dei dipendenti per i quali è indicato lo stipendio, si deve scrivere la seguente istruzione Select: SELECT Cognome, Nome FROM Impiegati WHERE Stipendio IS NOT NULL; 274 © Istituto Italiano Edizioni Atlas parte seconda Ambienti software per i database capitolo 6 Il linguaggio SQL INTERROGAZIONI NIDIFICATE Supponiamo di voler conoscere Nome, Cognome e Dipartimento del dipendente con lo stipendio massimo. Per risolvere il problema si può ricercare, con l’interrogazione in figura, lo stipendio di valore massimo fra quelli di tutti i dipendenti. Annotato il valore dello stipendio massimo si ricerca il dipendente con tale stipendio costruendo l’interrogazione mostrata nella Query2 in figura. Il linguaggio SQL ha un’interessante caratteristica secondo la quale si può sostituire a una costante in una clausola Where, l’interrogazione che genera tale costante. Ne segue che, in virtù di questa regola, le due precedenti interrogazioni possono essere utilizzate per costruire l’interrogazione nidificata in figura. L’esempio mostra come si possa usare un Select al posto di una costante in una clausola Where. Si costruisce cosi un comando Select che contiene un altro comando SELECT al proprio interno. Il comando interno è indicato con il nome di sottoquery e deve comparire racchiuso in una coppia di parentesi senza il punto e virgola finale. Si consideri, come ulteriore esempio, il problema di elencare cognome e nome dei dipendenti che hanno lo stipendio inferiore allo stipendio medio di tutti i dipendenti. Ricordando che un comando Select può sostituire una costante in una clausola Where, si può costruire la query StipendiInferioriMedia. © Istituto Italiano Edizioni Atlas 275 parte seconda Ambienti software per i database capitolo 6 Il linguaggio SQL Il comando Select interno restituisce il valore medio degli stipendi; questo dato viene usato nell’interrogazione principale per il confronto con i valori dell’attributo Stipendio nel criterio di selezione scritto dopo Where. Si noti che le interrogazioni nidificate introducono una modalità alternativa a quella dell’algebra relazionale per risolvere problemi. Per esempio, per conoscere nome e cognome del manager del dipartimento Personale, si può usare sia un’interrogazione nidificata, sia le abituali tecniche dell’algebra relazionale. Il codice SQL dell’interrogazione ManagerDiPersonale secondo le due differenti modalità è mostrata in figura. Le interrogazioni nidificate possono essere viste come un modo diverso per risolvere problemi ma, soprattutto, sono lo strumento che permette di affrontare problemi che non si potrebbero risolvere con i comandi esaminati sino ad ora. Le interrogazioni nidificate StipendioMax e StipendiInferioreMedia sono esempi di interrogazioni che risolvono problemi impossibili da risolvere con le tradizionali modalità dell’algebra relazionale, in quanto le funzioni di aggregazione non possono comparire nella clausola Where, ma solo nelle clausole Select ed Having. Si osservi che la sottoquery deve apparire come secondo termine nei confronti. Pertanto una clausola Where del tipo: WHERE ( SELECT AVG(Stipendio) FROM Impiegati ) > Stipendio non è ammessa, e la condizione della clausola Where deve essere scritta nel seguente modo: WHERE Stipendio < ( SELECT AVG(Stipendio) FROM Impiegati ) • Sottointerrogazioni che restituiscono un elenco di valori Sino ad ora si sono considerate sottointerrogazioni che restituiscono un singolo valore. Il prossimo esempio mostra l’utilità delle sottointerrogazioni che restituiscono un elenco di valori. Si consideri il problema di elencare, con Nome, Cognome e Stipendio, i dipendenti che sono manager. Procediamo, come nel caso della query StipendioMax, e costruiamo, con l’interrogazione in figura, l’elenco dei codici identificativi dei dipendenti che sono manager: 276 © Istituto Italiano Edizioni Atlas parte seconda Ambienti software per i database capitolo 6 Il linguaggio SQL Disponendo dell’elenco degli ID dei dipendenti che sono manager è molto semplice produrre l’elenco richiesto, come è mostrato in DatiManager. Sostituendo all’elenco con i codici dei manager il comando Select che lo genera, si ottiene la query annidata in figura che risolve il problema. Per costruire l’interrogazione DatiManager si è fatto uso di una regola della sintassi del linguaggio SQL che afferma che un elenco di valori che compare dopo il predicato IN, in una clausola Where, può essere sostituito dalla sottointerrogazione che lo genera. Analogamente, l’elenco dei dipendenti che non sono capi di dipartimento si ottiene, con l’interrogazione: SELECT Cognome, Nome, Stipendio FROM Impiegati WHERE ID NOT IN ( SELECT DISTINCT Manager FROM Dipartimenti ); Si noti in particolare, nella sottoquery, l’uso della clausola DISTINCT per impedire che i manager a capo di più di un dipartimento compaiano più volte. Si ricordi che il predicato IN utilizzato nella forma x IN Elenco, è vero se x appartiene all’elenco, mentre è falso se x non compare in Elenco. L’elenco generato dalla sottoquery può essere controllato, oltre che con i predicati IN e NOT IN, anche con altri predicati (ALL, ANY ed EXISTS) che sono presentati nei materiali on line richiamati alla fine del paragrafo. • Numero dei valori diversi tra loro in una colonna Si consideri ora il problema di calcolare da quante differenti città di residenza provengono i dipendenti del dipartimento Produzione. Nel linguaggio SQL si usa la funzione Count con la clausola Distinct come nel seguente comando: SELECT COUNT(DISTINCT Residenza) FROM Impiegati WHERE Dipartimento = 'Prod'; © Istituto Italiano Edizioni Atlas Restituisce 2 277 parte seconda Ambienti software per i database capitolo 6 Il linguaggio SQL La clausola Distinct non può essere usata nel formato con l’asterisco Count(*). Il linguaggio SQL di Access non consente l’uso della clausola Distinct all’interno della funzione Count. Il problema può essere risolto con la seguente interrogazione nidificata, inserita direttamente nella clausola From: SELECT COUNT(*) FROM ( SELECT DISTINCT Residenza FROM Impiegati WHERE Dipartimento = 'Prod'); • Sottoquery in modalità QBE Access ammette l’uso delle interrogazioni annidate. Il loro inserimento può essere effettuato, come abbiamo mostrato negli esempi precedenti, scrivendo l’interrogazione direttamente nella finestra SQL delle query. Per inserire una sottoquery in modalità QBE, occorre scrivere l’istruzione Select che rappresenta la sottoquery nella riga Criteri della griglia QBE. La sottoquery va scritta all’interno di una coppia di parentesi tonde e, per rendere più agevole la scrittura del comando, è opportuno usare la finestra di ingrandimento che si apre facendo clic con il tasto destro del mouse e scegliendo Zoom nel menu di scelta rapida. Nella figura, che mostra la precedente interrogazione DatiManager in Visualizzazione Struttura, si noti la sottoquery che produce l’elenco degli ID dei manager da controllare con il predicato IN. • Query di ricerca dati duplicati in Access La ricerca di valori duplicati in una colonna di una tabella si può eseguire con una query prodotta da una creazione guidata. Per generare la query si attiva la Creazione guidata query (nella scheda Crea, gruppo Query) e, nella finestra Nuova query si sceglie Creazione guidata Query ricerca duplicati. Il generatore, in successive finestre di dialogo, richiede di specificare: la tabella e il campo nel quale cercare i valori duplicati e quali altri campi devono essere visualizzati nell’output generato. Al termine dell’interazione la query è salvata con un nome opportuno ed eseguita automaticamente. Per esempio, la ricerca di valori duplicati nel campo Manager di Dipartimenti può essere utile per identificare i manager responsabili di più di un dipartimento. Nell’autocomposizione bisogna richiedere di cercare nella tabella Dipartimenti i valori duplicati di Manager e, oltre al valore di tale campo, di visualizzare anche quello di Descrizione. Access genera la query Trova duplicati per Dipartimenti in figura. 278 © Istituto Italiano Edizioni Atlas parte seconda Ambienti software per i database capitolo 6 Il linguaggio SQL Il codice SQL dell’interrogazione è il seguente: Come si vede, la query di ricerca dei dati duplicati utilizza una query nidificata per generare l’elenco dei manager che compaiono più di una volta in Dipartimenti. Nell’interrogazione nidificata compare una sottoquery che produce, con un controllo sui raggruppamenti, l’elenco dei valori duplicati. ERIA EB W LIBR AUTOVERIFICA Domande da 9 a 14 pag. 295 Problemi da 13 a 36 pag. 297-298 e da 50 a 72 pag. 299 3a. Intersezione e differenza con il predicato IN 3b. I predicati ANY, ALL, EXISTS 11 Le viste logiche Il linguaggio SQL consente di decidere le modalità con le quali gli utenti possono vedere le tabelle del database, creando una finestra, detta VIEW (vista), su alcuni o su tutti i dati contenuti in una o più tabelle. La vista viene identificata con un nome assegnato in fase di creazione con il comando CREATE VIEW. Con le viste è possibile decidere anche che un utente possa avere una visione solo parziale dei dati registrati nel database, e non possa vedere altri dati: in questo modo si elimina il rischio di modifiche indesiderate su dati che non riguardano il lavoro di un determinato utente e nello stesso tempo l’utente non rimane distratto dai dati che sono ininfluenti sul tipo di elaborazione che deve fare. L’utente può comunque operare sulla vista con i comandi illustrati nei paragrafi precedenti, come se fosse una tabella del database. Le viste sono finestre dinamiche sulle tabelle del database, in quanto ogni modifica ai dati sulla tabella primaria è disponibile per l’utente attraverso la vista. Vale anche l’opposto: ogni modifica sui dati della vista si riflette sui dati della tabella primaria. Non tutte le viste sono, però, aggiornabili: infatti le viste che contengono risultati di funzioni di aggregazione non possono essere modificate. © Istituto Italiano Edizioni Atlas 279 parte seconda Ambienti software per i database capitolo 6 Il linguaggio SQL La creazione della vista viene realizzata con l’uso dell’istruzione Select all’interno del comando Create View. Per esempio, per creare una vista di nome ImpiegatiCapi contenente i dati dei manager, si usa il comando: CREATE VIEW ImpiegatiCapi AS SELECT ID, Nome, Cognome, Dipartimento FROM Impiegati WHERE ID IN (10,12,13,14); essendo 10, 12, 13, 14 gli identificativi dei manager. Una vista può essere eliminata con il comando DROP VIEW seguito dal nome assegnato alla vista in fase di creazione. Per esempio, il comando seguente elimina la vista creata con il nome ImpiegatiCapi: DROP VIEW ImpiegatiCapi; La versione SQL di Access non prevede il comando Create View, ma le query, salvate con un nome simbolico, sono, a tutti gli effetti, viste logiche e, come queste, possono essere utilizzate con i comandi Select. VISTE LOGICHE CON RAGGRUPPAMENTI E CONTROLLO DELLE CONDIZIONI Le viste logiche possono semplificare la progettazione di query complesse. Mostriamo con un esempio come utilizzare le viste logiche per affrontare problemi impossibili da risolvere diversamente. Costruiamo la vista logica di nome PersonaleDipartimenti che elenca, per ogni dipartimento, il totale degli stipendi erogati e il numero dei dipendenti che lavorano nel dipartimento: CREATE VIEW PersonaleDipartimenti AS SELECT Dipartimenti AS Dipart, COUNT(*) AS NumDipendenti, SUM(Stipendio) AS TotStipendi FROM Impiegati GROUP BY Dipartimenti; Il comando Create View crea una vista logica con tre attributi di nome Dipart, NumDipendenti, TotStipendi con i quali si fa riferimento, nell’ordine, ai tre valori prodotti dalla clausola Select dell’interrogazione. Partendo dalla vista logica PersonaleDipartimenti si possono costruire le interrogazioni seguenti: • Dipartimento che spende di più in stipendi SELECT Dipart FROM PersonaleDipartimenti WHERE TotStipendi = (SELECT MAX(TotStipendi) FROM PersonaleDipartimenti); • Numero medio di dipendenti per dipartimento SELECT AVG(NumDipendenti) FROM PersonaleDipartimenti; Si osservi che non sarebbe stato possibile produrre questi risultati con un’interrogazione basata sulla tabella Impiegati. 280 © Istituto Italiano Edizioni Atlas parte seconda Ambienti software per i database capitolo 6 Il linguaggio SQL 12 Esempi di interrogazioni con uso del linguaggio SQL PROGETTO 5 Attività sportive studentesche Le informazioni relative alle attività sportive studentesche devono essere organizzate in una base di dati. Gli studenti, dei quali si conservano le informazioni anagrafiche, frequentano gli Istituti superiori, e possono partecipare a una o più manifestazioni sportive (specialità sportive diverse, giornate diverse, campionati che durano per mesi o gare di un giorno). Per ogni attività sportiva le scuole indicano un professore che svolge la funzione di riferimento e di allenatore: ogni professore segue una sola manifestazione, ma una stessa manifestazione può essere seguita da professori diversi di scuole diverse. Definire il modello del database e rappresentare le seguenti interrogazioni: • Numero degli studenti che partecipano a una determinata manifestazione sportiva. • Elenco anagrafico degli allenatori di un’attività sportiva. • Elenco delle scuole (denominazione) con il numero di studenti che partecipano alle attività sportive. • Elenco delle scuole (con denominazione, indirizzo, telefono) con studenti che partecipano a una determinata manifestazione sportiva. • Elenco dei professori (cognome e nome) e scuole (denominazione) di appartenenza in ordine alfabetico. • Numero degli studenti partecipanti di una determinata scuola per ciascuna delle manifestazioni sportive. ANALISI DEI DATI Le entità che possono essere individuate nel problema sono: • Istituto, per gli istituti di appartenenza di studenti e professori; • Studente, per gli studenti delle diverse scuole che partecipano alle manifestazioni; • Professore, per rappresentare i docenti che svolgono le funzioni di allenatore; • Manifestazione, per le attività sportive. Gli attributi di Istituto sono: codice dell’istituto, denominazione, indirizzo, telefono. Gli attributi di Studente sono: codice dello studente, cognome, nome, data di nascita, classe. Gli attributi di Professore sono: codice del professore, cognome, nome. Gli attributi di Manifestazione sono: codice della manifestazione, descrizione, luogo, data di inizio per i tornei e i campionati o di svolgimento per le gare di una giornata. Tra l’entità Istituto e l’entità Studente esiste un’associazione uno a molti, perché gli studenti che partecipano alle manifestazioni possono provenire da più istituti e ogni studente frequenta un solo istituto. Tra l’entità Studente e l’entità Manifestazione esiste un’associazione molti a molti, perché ogni studente partecipa a una o più manifestazioni e, ovviamente, a ogni manifestazione partecipano più studenti. Tra l’entità Manifestazione e l’entità Professore si stabilisce un’associazione uno a molti, perché ogni manifestazione può avere più professori come coordinatori, provenienti da scuole diverse; il testo del problema inoltre pone il vincolo che ogni professore possa seguire una sola manifestazione. Tra l’entità Istituto e l’entità Professore esiste un’associazione uno a molti, perché ogni istituto può avere molti docenti che si occupano delle manifestazioni sportive e ogni docente è titolare di insegnamento in un solo istituto. © Istituto Italiano Edizioni Atlas 281 parte seconda Ambienti software per i database capitolo 6 Il linguaggio SQL Sulla base dell’analisi effettuata si può disegnare il modello Entità/Associazioni. MODELLO E/R Studente N 1 Frequentare CodiceStud {PK} CognStud NomeStud DataNascita Classe Istituto CodiceIstituto {PK} Denominazione Indirizzo Telefono 1 N Impiegare Partecipare N Manifestazione CodiceManif {PK} Descrizione Luogo DataInizio N 1 N Coordinare Professore CodiceProf {PK} CognProf NomeProf Nel modello E/R sono stati indicati i nomi delle associazioni e l’opzionalità od obbligatorietà della partecipazione all’associazione (rispettivamente con linea tratteggiata o continua). Il modello viene verificato utilizzando le regole di lettura del modello E/R: Ogni istituto può essere frequentato da uno o più studenti, ogni studente deve frequentare un solo istituto. Ogni istituto può impiegare uno o più professori, ogni professore deve essere impiegato presso un solo istituto. Ogni studente può partecipare a una o più manifestazioni, ogni manifestazione può essere seguita da uno o più studenti. Ogni manifestazione può essere coordinata da uno o più professori, ogni professore può coordinare una sola manifestazione. Utilizzando le regole di derivazione si passa dal modello concettuale al modello logico, cioè alle tabelle: le associazioni uno a molti si rappresentano introducendo le chiavi esterne nelle tabelle Studenti e Professori per indicare l’istituto di appartenenza; nella tabella Professori viene aggiunta anche un’altra chiave esterna per l’associazione con l’entità Manifestazione; l’associazione molti a molti genera una nuova tabella Iscrizioni che contiene le chiavi primarie di Studenti e Manifestazioni più eventuali attributi dell’associazione, per esempio la data di iscrizione. TABELLE Istituti (CodiceIstituto, Denominazione, Indirizzo, Telefono) Studenti (CodiceStud, CognStud, NomeStud, DataNascita, Classe, CodiceIstituto) Manifestazioni (CodiceManif, Descrizione, Luogo, DataInizio) Professori (CodiceProf, CognProf, NomeProf, CodiceIstituto, CodiceManif) Iscrizioni (ID, CodiceStud, CodiceManif, DataIscrizione). 282 © Istituto Italiano Edizioni Atlas parte seconda Ambienti software per i database capitolo 6 Il linguaggio SQL Le caratteristiche degli attributi delle tabelle sono illustrate nello schema seguente: Tabella Attributo Chiave Formato Istituti Studenti CodiceIstituto Denominazione Indirizzo Telefono PK carattere carattere carattere carattere CodiceStud CognStud NomeStud DataNascita Classe CodiceIstituto PK numerico (intero) carattere (30) carattere (20) data/ora numerico (byte) carattere (4) sì sì no no no sì Manifestazioni CodiceManif Descrizione Luogo DataInizio PK carattere (3) carattere (40) carattere (20) data/ora sì sì no no Professori CodiceProf CognProf NomeProf CodiceIstituto CodiceManif PK numerico (intero) carattere (30) carattere (20) carattere (4) carattere (3) sì sì no sì sì ID CodiceStud CodiceManif DataIscrizione PK FK FK numerico (autoinc) numerico (intero) carattere (3) data/ora sì sì sì no Iscrizioni FK FK FK Indicizzato (4) (30) (30) (12) sì sì no no INTERROGAZIONI Le costanti utilizzate nelle condizioni di ricerca sono indicate tra parentesi quadre. Nella rappresentazione delle interrogazioni mediante pseudocodifica sono stati inseriti commenti nei punti dove sono previste operazioni quali ordinamenti, raggruppamenti e calcoli che non sono previste nel modello relazionale e non hanno una forma di rappresentazione standardizzata. Numero degli studenti che partecipano a una determinata manifestazione sportiva. 1. σP Manifestazioni 2. Temp1PK IscrizioniFK 3. Temp1 = Selezione di Manifestazioni per Descrizione = [manifestazione] Temp2 = Congiunzione di Temp1 e Iscrizioni su CodiceManif Conteggio delle righe di Temp2 SELECT COUNT(*) AS NumeroStudenti FROM Manifestazioni, Iscrizioni WHERE Manifestazioni.CodiceManif = Iscrizioni.CodiceManif AND Descrizione = [manifestazione da controllare]; Elenco anagrafico degli allenatori di un’attività o manifestazione sportiva. 1. σP Manifestazioni Temp1 = Selezione di Manifestazioni per Descrizione = [manifestazione] 2. Temp1PK ProfessoriFK Temp2 = Congiunzione di Temp1 e Professori su CodiceManif 3. ΠL Temp2 Proiezione di Temp2 su CognProf, NomeProf Ordinato su CognProf e NomeProf © Istituto Italiano Edizioni Atlas 283 parte seconda Ambienti software per i database capitolo 6 Il linguaggio SQL SELECT CognProf, NomeProf FROM Manifestazioni, Professori WHERE Manifestazioni.CodiceManif = Professori.CodiceManif AND Descrizione = [manifestazione da controllare] ORDER BY CognProf, NomeProf; Elenco delle scuole (denominazione) con il numero di studenti che partecipano alle attività sportive. 1. IstitutiPK StudentiFK Temp1 = Congiunzione di Istituti e Studenti su CodiceIstituto 2. Temp2 = raggruppamento per Denominazione e Conteggio 3. ΠL Temp2 Proiezione di Temp2 su Denominazione, conteggio SELECT Denominazione, COUNT (DISTINCT CodiceStud) AS Numero FROM Studenti, Istituti WHERE Studenti.CodiceIstituto = Istituti.CodiceIstituto GROUP BY Denominazione; Elenco delle scuole (con denominazione, indirizzo, telefono) con studenti che partecipano a una determinata manifestazione sportiva. 1. σP Manifestazioni 2. Temp1PK IscrizioniFK Temp1 = Selezione di Manifestazioni per Descrizione = [manifestazione] Temp2 = Congiunzione di Temp1 e Iscrizioni su CodiceManif 3. Temp2FK StudentiPK Temp3 = Congiunzione di Temp2 e Studenti su CodiceStud 4. Temp3FK IstitutiPK Temp4 = Congiunzione di Temp3 e Istituti su CodiceIstituto 5. Temp5 = Raggruppamento di Temp4 per Denominazione 6. ΠL Temp5 Proiezione di Temp5 su Denominazione, Indirizzo, Telefono SELECT Denominazione, Indirizzo, Telefono FROM Manifestazioni, Iscrizioni, Studenti, Istituti WHERE Manifestazioni.CodiceManif = Iscrizioni.CodiceManif AND Studenti.CodiceStud = Iscrizioni.CodiceStud AND Studenti.CodiceIstituto = Istituti.CodiceIstituto AND Descrizione = [manifestazione da controllare] GROUP BY Denominazione, Indirizzo, Telefono; Elenco alfabetico dei professori (cognome e nome) e scuole (denominazione) di appartenenza. 1. IstitutiPK 2. ΠL Temp1 ProfessoriFK Temp1 = Congiunzione di Istituti e Professori su CodiceIstituto Proiezione di Temp1 su CognProf, NomeProf, Denominazione ordinato su CognProf e NomeProf SELECT CognProf, NomeProf, Denominazione FROM Professori, Istituti WHERE Professori.CodiceIstituto = Istituti.CodiceIstituto ORDER BY CognProf, NomeProf; 284 © Istituto Italiano Edizioni Atlas parte seconda Ambienti software per i database capitolo 6 Il linguaggio SQL Numero degli studenti partecipanti di una determinata scuola per ciascuna delle manifestazioni sportive. 1. σP Istituti 2. Temp1PK StudentiFK Temp1 = Selezione di Istituti per Denominazione = [scuola] Temp2 = Congiunzione di Temp1 e Studenti su CodiceIstituto 3. Temp2PK IscrizioniFK Temp3 = Congiunzione di Temp2 e Iscrizioni su CodiceStud 4. Temp3FK ManifestazioniPK Temp4 = Congiunzione di Temp3 e Manifestazioni su CodiceManif 5. Temp5 = Raggruppamento di Temp4 per Descrizione e Conteggio 6. ΠL Temp5 Proiezione di Temp5 su Descrizione, conteggio SELECT Descrizione, COUNT(*) AS Numero FROM Manifestazioni, Iscrizioni, Studenti, Istituti WHERE Manifestazioni.CodiceManif = Iscrizioni.CodiceManif AND Studenti.CodiceStud = Iscrizioni.CodiceStud AND Studenti.CodiceIstituto = Istituti.CodiceIstituto AND Denominazione = [scuola da controllare] GROUP BY Descrizione; PROGETTO 6 Viaggi e vacanze Un’agenzia di viaggi intende organizzare in una base di dati tutte le informazioni riguardanti la sua attività: i viaggi o vacanze, le organizzazioni turistiche o tour operator, i clienti dei propri servizi, le nazioni o località o città che sono destinazione dei viaggi/vacanze. Tutte le attività proposte ai clienti sono dei pacchetti: ciascuno di essi si riferisce a un’organizzazione turistica, e riguardano una precisa zona del mondo o nazione o città. Ci possono essere offerte di viaggi con la stessa destinazione da parte di organizzazioni diverse. Per esempio ci può essere una crociera nel Mediterraneo proposta dall’organizzazione turistica A, oppure un soggiorno di una settimana a Vienna offerta dall’organizzazione turistica B. Di ogni pacchetto offerto occorre conoscere modalità e prezzi; di ogni località o nazione è opportuno tenere memorizzate informazioni su condizioni climatiche, moneta, ecc. Un cliente può naturalmente acquistare in date diverse molti viaggi o vacanze. Definire il modello del database e rappresentare le seguenti interrogazioni: • Elenco dei viaggi/vacanza con prezzo inferiore a un prezzo prefissato. • Elenco dei soggiorni con prezzo in una località prefissata. • Elenco dei clienti, con nome e indirizzo, che hanno fatto un viaggio con una determinata destinazione. • Numero dei pacchetti offerti da un’organizzazione turistica prefissata. • Elenco di tutte le nazioni o località con il numero di pacchetti che si riferiscono ad esse. ANALISI DEI DATI Le entità che possono essere individuate nel problema sono: • Nazione, per rappresentare gli stati o le località che sono destinazioni dei pacchetti di vacanze; • Organizzazione, per le società di turismo che offrono i viaggi e i soggiorni di vacanze; • Cliente, per l’anagrafica dei clienti dell’agenzia di viaggi; • Pacchetto, per rappresentare i pacchetti di viaggio o soggiorno. © Istituto Italiano Edizioni Atlas 285 parte seconda Ambienti software per i database capitolo 6 Il linguaggio SQL Gli attributi di Nazione sono: codice della nazione o località, denominazione più dettagliata dello stato o della località di destinazione, moneta, clima. Gli attributi di Organizzazione sono: codice dell’organizzazione, nome, telefono. Gli attributi di Cliente sono: codice del cliente, cognome e nome, indirizzo, telefono. Gli attributi di Pacchetto sono: codice del pacchetto, descrizione, modalità, prezzo. Tra l’entità Nazione e l’entità Pacchetto esiste un’associazione uno a molti perché ci possono essere più viaggi tra quelli offerti che hanno come destinazione una certa nazione o località. Tra l’entità Organizzazione e Pacchetto si stabilisce un’associazione uno a molti, perché una stessa organizzazione può offrire molti pacchetti, però ogni pacchetto deve essere inteso come un’offerta che per le sue caratteristiche è riferita a una precisa organizzazione, anche se ha come destinazione una località comune ad altri pacchetti. Tra l’entità Pacchetto e l’entità Cliente esiste un’associazione molti a molti, perché nel testo del problema si dice che un cliente può acquistare in date diverse più viaggi o vacanze e naturalmente lo stesso pacchetto viene acquistato da più clienti. MODELLO E/R Organizzazione CodiceOrg {PK} NomeOrg TelefonoOrg 1 N Offrire Pacchetto N CodicePac {PK} Descrizione Modalità Prezzo N N Acquistare Cliente CodiceCli {PK} Cognome Nome Indirizzo Telefono Essere destinazione 1 Nazione CodiceNaz {PK} Denominazione Moneta Clima Il modello viene verificato utilizzando le regole di lettura: Ogni organizzazione può offrire uno o più pacchetti, ogni pacchetto deve essere offerto da una sola organizzazione. Ogni nazione o località può essere destinazione di uno o più pacchetti, ogni pacchetto deve avere destinazione in una sola nazione o località. Ogni pacchetto può essere acquistato da uno o più clienti, ogni cliente può acquistare uno o più pacchetti. Utilizzando le regole di derivazione si passa dal modello concettuale al modello logico, cioè alle tabelle: le associazioni uno a molti si rappresentano introducendo le chiavi esterne nella tabella Pacchetti per indicare l’organizzazione proponente e la nazione o località di destinazione. 286 © Istituto Italiano Edizioni Atlas parte seconda Ambienti software per i database capitolo 6 Il linguaggio SQL L’associazione molti a molti genera una nuova tabella Acquisti. Essa ha come chiave un numero progressivo di registrazione e contiene le chiavi di Pacchetti e Clienti più eventuali attributi dell’associazione, per esempio la data in cui il cliente ha acquistato il pacchetto. TABELLE Nazioni (CodiceNaz, Denominazione, Moneta, Clima) Clienti (CodiceCli, Cognome, Nome, Indirizzo, Telefono) Organizzazioni (CodiceOrg, NomeOrg, TelefonoOrg) Pacchetti (CodicePac, Descrizione, Modalità, Prezzo, CodiceNaz, CodiceOrg) Acquisti (NumReg, CodiceCli, CodicePac, DataAcquisto) Lo schema seguente illustra le caratteristiche degli attributi delle tabelle. Tabella Attributo Chiave Formato Nazioni CodiceNaz Denominazione Moneta Clima PK carattere carattere carattere carattere Clienti CodiceCli Cognome Nome Indirizzo Telefono PK numerico (intero) carattere (30) carattere (20) carattere (25) carattere (12) sì sì no no sì Organizzazioni CodiceOrg NomeOrg TelefonoOrg PK carattere (4) carattere (30) carattere (12) sì sì no Pacchetti CodicePac Descrizione Modalità Prezzo CodiceNaz CodiceOrg PK carattere (5) carattere (50) carattere (40) numerico (2 decimali) carattere (3) carattere (4) sì sì no no sì sì NumReg CodiceCli CodicePac DataAcquisto PK FK FK numerico (autoinc) numerico (intero) carattere (5) data/ora sì sì sì no Acquisti FK FK Indicizzato (3) (20) (15) (30) sì sì no no INTERROGAZIONI Elenco dei viaggi/vacanza con prezzo inferiore a un prezzo prefissato. 1. σP Pacchetti Selezione di Pacchetti per Prezzo < [prezzo massimo] SELECT * FROM Pacchetti WHERE Prezzo < [prezzo massimo]; © Istituto Italiano Edizioni Atlas 287 parte seconda Ambienti software per i database capitolo 6 Il linguaggio SQL Elenco dei soggiorni con prezzo in una località prefissata. 1. σP Nazioni 2. Temp1PK PacchettiFK 3. ΠL Temp2 Temp1 = Selezione di Nazioni per Denominazione = [località] Temp2 = Congiunzione di Temp1 e Pacchetti su CodiceNaz Proiezione di Temp2 su Descrizione, Modalità, Prezzo SELECT Descrizione, Modalità, Prezzo FROM Nazioni, Pacchetti WHERE Nazioni.CodiceNaz = Pacchetti.CodiceNaz AND Denominazione = [località prefissata]; Elenco dei clienti, con cognome, nome e indirizzo, che hanno fatto un viaggio con una determinata destinazione. 1. σP Nazioni 2. Temp1PK Temp1 = Selezione di Nazioni per Denominazione = [località] PacchettiFK Temp2 = Congiunzione di Temp1 e Pacchetti su CodiceNaz 3. Temp2PK AcquistiFK Temp3 = Congiunzione di Temp2 e Acquisti su CodicePac 4. Temp3FK ClientiPK Temp4 = Congiunzione di Temp3 e Clienti su CodiceCli 5. ΠL Temp4 Proiezione di Temp4 su Cognome, Nome, Indirizzo SELECT Cognome, Nome, Indirizzo FROM Nazioni, Pacchetti, Acquisti, Clienti WHERE Nazioni.CodiceNaz = Pacchetti.CodiceNaz AND Pacchetti.CodicePac = Acquisti.CodicePac AND Acquisti.CodiceCli = Clienti.CodiceCli AND Denominazione = [località da controllare]; Numero dei pacchetti offerti da un’organizzazione turistica prefissata. 1. σP Organizzazioni Temp1 = Selezione di Organizzazioni per NomeOrg = [organizzazione] 2. Temp1PK Temp2 = Congiunzione di Temp1 e Pacchetti su CodiceOrg PacchettiFK 3. ΠL Temp2 Proiezione di Temp2 su conteggi SELECT COUNT(*) AS Numero FROM Pacchetti, Organizzazioni WHERE Pacchetti.CodiceOrg = Organizzazioni.CodiceOrg AND NomeOrg = [organizzazione da controllare]; Elenco di tutte le nazioni o località con il numero di pacchetti che si riferiscono ad esse. 1. NazioniPK PacchettiFK Temp1 = Congiunzione di Nazioni e Pacchetti su CodiceNaz 2. Temp2 = Raggruppamento di Temp1 per Denominazione Conteggio 3. ΠL Temp2 Proiezione di Temp2 su Denominazione, conteggio SELECT Denominazione, COUNT(*) AS Numero FROM Nazioni, Pacchetti WHERE Nazioni.CodiceNaz = Pacchetti.CodiceNaz GROUP BY Denominazione; 288 © Istituto Italiano Edizioni Atlas parte seconda Ambienti software per i database capitolo 6 Il linguaggio SQL ESEMPIO CON QUERY NIDIFICATE E CONDIZIONI SUI RAGGRUPPAMENTI PROGETTO 7 Rappresentanti e fatture ai clienti Si vogliono organizzare le informazioni relative ai clienti, ai loro rappresentanti e alle fatture emesse. Ogni rappresentante ha tanti clienti, mentre a un cliente corrisponde un solo rappresentante. Per semplicità si supponga di registrare solo la data e l’importo totale di ogni fattura, senza specificare le righe di dettaglio sugli articoli venduti. Definire il modello del database e rappresentare le seguenti interrogazioni: • Elenco dei clienti di un rappresentante. • Numero dei clienti affidati a un determinato rappresentante. • Cognome e nome del rappresentante di un determinato cliente. • Elenco delle fatture di un codice cliente prefissato, in ordine di data. • Fatturato raggruppato per codice rappresentante. • Numero delle fatture emesse raggruppate per codice rappresentante. • Nome del cliente e data di emissione per la fattura con importo massimo. • Nome del rappresentante corrispondente alla fattura con importo massimo. • Codice e nome dei clienti per i quali il fatturato totale è superiore a un valore prefissato. • Codice e nome dei rappresentanti per i quali il numero delle fatture è superiore a un numero prefissato. ANALISI DEI DATI Le entità che possono essere individuate nel problema sono: • Cliente, per i clienti ai quali vengono emesse le fatture; • Rappresentante, per gli agenti ai quali sono assegnati i clienti; • Fattura, per le vendite effettuate dai rappresentanti. Gli attributi di Cliente sono: codice del cliente, ragione sociale, indirizzo, telefono, partita IVA. Gli attributi di Rappresentante sono: codice del rappresentante, cognome, nome, zona assegnata. Gli attributi di Fattura sono: numero della fattura, data di emissione, importo. Tra l’entità Cliente e l’entità Fattura esiste un’associazione uno a molti, perché per lo stesso cliente possono essere emesse molte fatture, ma ciascuna fattura è ricevuta da un solo cliente. Tra l’entità Rappresentante e l’entità Cliente si stabilisce un’associazione uno a molti perché ogni rappresentante ha tanti clienti, mentre a un cliente corrisponde un solo rappresentante. I dati del problema considerato si rappresentano graficamente con il seguente schema Entity/Relationship: MODELLO E/R Fattura N 1 Ricevere NumeroFatt {PK} DataFatt Importo © Istituto Italiano Edizioni Atlas Cliente CodiceCli {PK} RagioneSociale Indirizzo Telefono PartitaIVA N 1 Visitare Rappresentante CodiceRap {PK} CognomeRap NomeRap Zona 289 parte seconda Ambienti software per i database capitolo 6 Il linguaggio SQL Il modello viene verificato utilizzando le regole di lettura: Ogni rappresentante può visitare uno o più clienti, ogni cliente deve essere visitato da un solo rappresentante. Ogni cliente può ricevere una o più fatture, ogni fattura deve essere ricevuta da un solo cliente. Utilizzando le regole di derivazione si passa dal modello concettuale alle tabelle, introducendo le chiavi esterne per rappresentare le associazioni uno a molti. TABELLE Rappresentanti (CodiceRap, CognomeRap, NomeRap, Zona) Clienti (CodiceCli, RagioneSociale, Indirizzo, Telefono, PartitaIVA, CodiceRap) Fatture (NumeroFatt, DataFatt, Importo, CodiceCli) Le caratteristiche degli attributi delle tabelle sono illustrate nello schema seguente: Tabella Attributo Rappresentanti CodiceRap CognomeRap NomeRap Zona PK carattere (4) carattere (30) carattere (20) numerico (intero) sì sì no no Clienti CodiceCli RagioneSociale Indirizzo Telefono PartitaIVA CodiceRap PK carattere carattere carattere carattere carattere carattere sì sì no no no sì NumeroFatt DataFatt Importo CodiceCli PK Fatture Chiave FK FK Formato Indicizzato (5) (40) (30) (12) (11) (4) numerico (autoinc) data/ora numerico (2 decimali) carattere (5) sì no no sì INTERROGAZIONI Elenco dei clienti di un rappresentante. 1. σP Rappresentanti 2. Temp1PK ClientiFK 3. ΠL Temp2 Temp1 = Selezione di Rappresentanti per CognomeRap = [cognome] Temp2 = Congiunzione di Temp1 e Clienti su CodiceRap Proiezione di Temp2 su RagioneSociale, Indirizzo, Telefono SELECT RagioneSociale, Indirizzo, Telefono FROM Clienti, Rappresentanti WHERE Clienti.CodiceRap = Rappresentanti.CodiceRap AND CognomeRap = [rappresentante da controllare]; Numero dei clienti affidati a un determinato rappresentante. 1. σP Rappresentanti 2. Temp1PK ClientiFK 3. Temp1 = Selezione di Rappresentanti per CognomeRap = [cognome] Temp2 = Congiunzione di Temp1 e Clienti su CodiceRap Conteggio delle righe di Temp2 SELECT COUNT(*) AS NumeroClienti FROM Clienti, Rappresentanti WHERE Clienti.CodiceRap = Rappresentanti.CodiceRap AND CognomeRap = [rappresentante da controllare]; 290 © Istituto Italiano Edizioni Atlas parte seconda Ambienti software per i database capitolo 6 Il linguaggio SQL Cognome e nome del rappresentante di un determinato cliente. 1. σP Clienti 2. Temp1FK 3. ΠL Temp2 Temp1 = Selezione di Clienti per RagioneSociale = [cliente] RappresentantiPK Temp2 = Congiunzione di Temp1 e Rappresentanti su CodiceRap Proiezione di Temp2 su CognomeRap, NomeRap SELECT CognomeRap, NomeRap FROM Clienti, Rappresentanti WHERE Clienti.CodiceRap = Rappresentanti.CodiceRap AND RagioneSociale = [cliente da controllare]; Elenco delle fatture di un codice cliente prefissato in ordine di data. 1. σP Fatture 2. ΠL Temp2 Temp1 = Selezione di Fatture per CodiceCli = [codice cliente] Proiezione di Temp2 su tutti i campi ordinato per data fattura SELECT * FROM Fatture WHERE CodiceCli = [codice da controllare] ORDER BY DataFatt; Fatturato raggruppato per codice rappresentante. 1. ClientiPK 2. 3. ΠL Temp2 FattureFK Temp1 = Congiunzione di Clienti e Fatture su CodiceCli Temp2 = Raggruppamento di Temp1 per CodiceRap e calcolo somma Importo Proiezione di Temp2 su CodiceRap, Somma SELECT CodiceRap, SUM(Importo) AS Fatturato FROM Fatture, Clienti WHERE Fatture.CodiceCli = Clienti.CodiceCli GROUP BY CodiceRap; Numero delle fatture emesse raggruppate per codice rappresentante. 1. ClientiPK 2. 3. ΠL Temp2 FattureFK Temp1 = Congiunzione di Clienti e Fatture su CodiceCli Temp2 = Raggruppamento di Temp1 per CodiceRap e Conteggio Proiezione di Temp2 su CodiceRap, conteggio SELECT CodiceRap, COUNT(*) AS NumeroFatture FROM Fatture, Clienti WHERE Fatture.CodiceCli = Clienti.CodiceCli GROUP BY CodiceRap; Nome del cliente e data di emissione per la fattura con importo massimo. 1. 2. σP Fatture 3. ClientiPK 4. ΠL Temp2 Temp1FK Max = Valore massimo importo fatture Temp1 = Selezione di Fatture per Importo = Max Temp2 = Congiunzione di Clienti e Temp1 su CodiceCli Proiezione di Temp2 su RagioneSociale, DataFatt, Importo SELECT RagioneSociale, DataFatt, Importo FROM Fatture, Clienti WHERE Fatture.CodiceCli = Clienti.CodiceCli AND Importo = (SELECT MAX(Importo) FROM Fatture); © Istituto Italiano Edizioni Atlas 291 parte seconda Ambienti software per i database capitolo 6 Il linguaggio SQL Cognome e nome del rappresentante corrispondente alla fattura con importo massimo. 1. Max = Valore massimo importo fatture 2. σP Fatture 3. ClientiPK Temp1 = Selezione di Fatture per Importo = Max Temp2 = Congiunzione di Clienti e Temp1 su CodiceCli Temp1FK 4. RappresentantiPK Temp2FK 5. ΠL Temp3 Temp3 = Congiunzione di Rappresentanti e Temp2 su CodiceRap Proiezione di Temp3 su CognomeRap, NomeRap SELECT CognomeRap, NomeRap FROM Fatture, Rappresentanti, Clienti WHERE Clienti.CodiceRap = Rappresentanti.CodiceRap AND Fatture.CodiceCli = Clienti.CodiceCli AND Importo = (SELECT MAX(Importo) FROM Fatture); Codice e ragione sociale dei clienti per i quali il fatturato totale è superiore a un valore prefissato. 1. ClientiPK FattureFK Temp1 = Congiunzione di Clienti e Fatture su CodiceCli 2. Temp2 = Raggruppamento di Temp1 per cliente e Somma importi 3. Temp3 = Selezione di Temp2 per Somma importi > [cifra prefissata] 4. ΠL Temp3 Proiezione di Temp3 su CodiceCli, RagioneSociale SELECT CodiceCli, RagioneSociale FROM Fatture, Clienti WHERE Clienti.CodiceCli = Fatture.CodiceCli GROUP BY CodiceCli, RagioneSociale HAVING SUM(Importo) > [cifra prefissata]; Codice con cognome e nome dei rappresentanti per i quali il numero delle fatture è superiore a un numero prefissato. 1. RappresentantiPK 2. Temp1PK 3. ClientiFK FattureFK Temp1 = Congiunzione di Rappresentanti e Clienti su CodiceRap Temp2 = Congiunzione di Temp1 e Fatture su CodiceCli Temp3 = raggruppamento di Temp2 per rappresentante e Conteggio 4. Temp4 = Selezione di Temp3 per Conteggio > [numero prefissato] 5. ΠL Temp4 Proiezione di Temp4 su CodiceRap, CognomeRap, NomeRap SELECT CodiceRap, CognomeRap, NomeRap FROM Fatture, Rappresentanti, Clienti WHERE Clienti.CodiceRap = Rappresentanti.CodiceRap AND Fatture.CodiceCli = Clienti.CodiceCli GROUP BY CodiceRap, CognomeRap, NomeRap HAVING COUNT(*) > [numero prefissato]; 292 © Istituto Italiano Edizioni Atlas parte seconda Ambienti software per i database capitolo 6 Il linguaggio SQL 13 I comandi per la sicurezza L’amministratore della base di dati, o comunque chi crea il database, può stabilire anche il diritto di accesso per utenti specifici o per tutti gli utenti, nel caso di accessi multipli alle tabelle del database. Il comando GRANT concede i permessi, specificando il tipo di accesso, per le tabelle sulle quali è consentito l’accesso e l’elenco degli utenti ai quali è permesso di accedere. Il tipo di accesso può riguardare, per esempio, il diritto di modifica della struttura della tabella con l’aggiunta di nuove colonne, oppure di modifica dei dati contenuti nella tabella, oppure l’uso del comando Select. Per concedere il diritto di modifica sulla tabella Impiegati agli utenti denominati con User1 e User2, si deve usare il comando Grant nella forma: GRANT UPDATE ON Impiegati TO User1, User2; La revoca dei permessi con annullamento dei diritti di accesso viene effettuato con il comando REVOKE che ha una sintassi analoga a quella del comando Grant: REVOKE UPDATE ON Impiegati FROM User1, User2; I permessi che possono essere concessi (o revocati) agli utenti sono indicati con le seguenti parole chiave che vanno specificate dopo Grant o Revoke: ALTER per aggiungere o eliminare colonne, oppure per modificare i tipi di dati DELETE per eliminare righe dalle tabelle INDEX per creare indici INSERT per inserire nuove righe nelle tabelle SELECT per ritrovare i dati dalle tabelle UPDATE per cambiare i valori contenuti nelle tabelle ALL per tutti i permessi precedenti. I permessi con le opzioni Select e Update, nei comandi Grant e Revoke, diventano più restrittivi specificando, tra parentesi tonde e separati con la virgola, i nomi delle colonne che l’utente può vedere o modificare. Per concedere il diritto di modifica della residenza e dello stipendio degli impiegati all’utente denominato con User3, si deve usare il comando Grant nella forma: GRANT UPDATE (Residenza, Stipendio) ON Impiegati TO User3; AUTOVERIFICA Domanda 15 pag. 296 Problemi da 37 a 39 pag. 298 e da 73 a 75 pag. 300 Problemi di riepilogo da 76 a 79 pag. 300-301 ERIA EB W LIBR I permessi e i diritti di accesso possono riguardate, non solo le tabelle, ma anche le viste create con il comando Create View. I sottoschemi e le autorizzazioni per utenti diversi su un database relazionale possono essere quindi definiti in pratica con il linguaggio SQL, usando in modo combinato i comandi Create View e Grant. 4. I trigger © Istituto Italiano Edizioni Atlas 293 parte seconda Ambienti software per i database capitolo 6 Il linguaggio SQL DOMANDE ATTIVITÀ DI AUTOVERIFICA Creazione del database e delle tabelle 1 Completa le frasi seguenti utilizzando una tra le parole elencate alla fine della domanda. a) per eliminare una tabella dal database si usa il comando ......... b) per modificare i valori nelle righe di una tabella si usa il comando ......... c) per inserire nuove tabelle nel database si usa il comando ......... d) per aggiungere una colonna a una tabella si usa il comando ......... Insert, Select, Create Table, Update, Alter Table, Delete, Drop Table 2 Determina il tipo di linguaggio per ciascuno dei comandi SQL elencati nella colonna di sinistra. comando tipo di linguaggio: DDL, DML, QL (Query Language) a) INSERT .............. b) CREATE TABLE .............. c) UPDATE .............. d) ALTER TABLE .............. e) DELETE .............. Operazioni relazionali con il linguaggio SQL 294 3 Quale delle seguenti frasi SQL estrae i valori di A1 nelle righe di Tabella con A2 = 5? a) Select A1, A2=5 From Tabella b) Select A2=5 From Tabella.A1 c) Select A1 From Tabella Where A2 = 5 d) Select Tabella.A1 From Tabella.A2 = 5 4 Quale delle seguenti frasi SQL estrae le righe di Tabella prive di valori in A2? a) Select ALL From Tabella Where A1 = ‘ ‘ b) Select * From Tabella Where A2 Is Null c) Select Tabella.* From Tabella Where A1 = ‘ ‘ d) Select A1 From Tabella With A2 Null 5 Quale delle seguenti frasi SQL rappresenta meglio una proiezione? a) Select A1, A2 From Tabella1 Where K1 > 10 b) Select * From Tabella1, Tabella2 Where K1 = K2 c) Select A1, A2 From Tabella1 d) Select * From Tabella1 Where A1 = ‘xyz’ 6 Quale delle seguenti frasi SQL contiene una selezione? a) Select * From Tabella1 b) Select * From Tabella1, Tabella2 Where K1 = K2 c) Select A1 = A2 From Tabella1 d) Select * From Tabella1 Where A1 = ‘xyz’ 7 Quale delle seguenti frasi SQL rappresenta meglio una congiunzione? a) Select * From Tabella1, Tabella2 Where K1 = K2 b) Select A1, A2 From Tabella1 c) Select A1, A2, K1 From Tabella1, Tabella2 Where K1 = K2 And A1 = ‘xyz’ d) Select * From Tabella2 Where A1 = ‘xyz’ © Istituto Italiano Edizioni Atlas parte seconda Ambienti software per i database 8 capitolo 6 Il linguaggio SQL Quali delle seguenti affermazioni sono vere (V) e quali false (F)? a) Il left join si può realizzare in SQL, ma non nell’SQL di Access b) Il left join è una congiunzione di scarsa utilità c) Nelle interrogazioni che riguardano un’entità sulla quale è stata stabilita un’associazione ricorsiva può essere necessario il self join d) Un self join tra tabelle si realizza con il comando: Self Join V F V F V F V F Funzioni di aggregazione, ordinamenti, raggruppamenti 9 Quali delle seguenti frasi SQL sono sintatticamente corrette (V) e quali sono errate (F)? Select Select Select Select SUM (Num1 * Num2) AS ‘Totale’ From Tabella; Tabella Where AVG(Importo) > 100; Count (Num1) AS Conteggio From Tabella Where Nome = ‘ABCD’; Nome, Num1 From Tabella Group By Nome; V F V F V F ATTIVITÀ DI AUTOVERIFICA a) b) c) d) V F 10 Quali delle seguenti frasi SQL elenca il totale delle fatture suddivise per cliente? e) b) c) d) Select Select Select Select Cliente, SUM(Importo) From TabellaFatture Group By Importo; Cliente, SUM (Importo) From TabellaFatture Order By Cliente; ORDER (Cliente, Importo ) From TabellaFatture; Cliente, SUM (Importo) From TabellaFatture Group By Cliente; 11 Quale delle seguenti frasi SQL consente di ottenere il nome delle città da cui provengono più di 10 studenti? a) Select Studenti From Città b) Select Studenti From Città c) Select Città From Studenti d) Select Città From Studenti Group Group Group Group By By By By Città Città Città Città Having COUNT(*) > 10; Where COUNT(*) > 10; Having COUNT(*) > 10; Where COUNT(*) > 10; 12 Quale delle seguenti frasi SQL consente di ottenere il numero degli studenti che provengono da a) b) c) d) una città prefissata? Select COUNT(*) From Select COUNT(*) From Select COUNT(*) From Select COUNT(*) From Studenti Studenti Studenti Studenti Group By [Città prefissata]; Where Città = [Città prefissata]; Group By Città Where Città = [Città prefissata]; Having Città = [Città prefissata]; 13 Associa a ciascun predicato della colonna di sinistra la funzione da esso svolta nelle condizioni di ricerca scegliendo tra quelle elencate a destra: a) BETWEEN 1) controlla se un valore appartiene a un insieme specificato di valori b) IN 2) confronta il valore in una colonna con il valore nullo c) LIKE 3) controlla se un valore è compreso in un intervallo di valori d) IS NULL 4) confronta il valore di un attributo con un modello di stringa 14 Quale delle seguenti frasi SQL consente di ottenere il numero della fattura di importo massimo? a) b) c) d) Select Select Select Select NumFattura, MAX(Importo) From Fatture; NumFattura From Fatture Where Importo = MAX(Importo); NumFattura From Fatture Having Importo = MAX(Importo); NumFattura From Fatture Where Importo = (Select MAX(Importo) From Fatture); © Istituto Italiano Edizioni Atlas 295 parte seconda Ambienti software per i database capitolo 6 Il linguaggio SQL Comandi per la sicurezza 15 Quali delle seguenti affermazioni sono vere (V) e quali false (F)? a) Il comando GRANT crea una vista parziale sulle tabelle del database b) L’annullamento dei permessi agli utenti per l’accesso alle tabelle viene effettuato con il comando REVOKE c) La vista consente di decidere le modalità con le quali gli utenti possono vedere Le tabelle del database d) Il comando GRANT UPDATE concede permessi di variazione sui dati V F V F V F V F PROBLEMI ATTIVITÀ DI AUTOVERIFICA Gli esercizi proposti consistono nel costruire il progetto del database attraverso il modello E/R e la derivazione delle tabelle; inoltre devono essere formalizzate le interrogazioni attraverso la pseudocodifica e il linguaggio SQL. Per ciascun problema le interrogazioni sono di difficoltà crescente e richiedono l’utilizzo di operatori, funzioni e predicati del linguaggio SQL: quindi possono essere svolte anche in tempi successivi per lo stesso esercizio con il procedere dello studio del linguaggio SQL. PROBLEMA 1 Costruire il modello dei dati per organizzare le informazioni sui redditi dei dipendenti e le aziende dove lavorano. I dipendenti effettuano versamenti di imposta in date diverse durante l’anno. Le entità del modello sono quindi Dipendente, Azienda e Versamento. Tra gli attributi dei dipendenti, oltre ai dati anagrafici sono contenuti anche la professione, il reddito annuo lordo, il numero dei familiari a carico, il totale delle trattenute effettuate. Negli attributi dell’azienda, oltre alla denominazione, occorre inserire anche l’indirizzo e il settore di attività. Definire il modello E/R e il modello logico con le tabelle. Creazione del database e delle tabelle 1 2 Scrivere le istruzioni SQL per la creazione della tabella delle aziende. Scrivere le istruzioni SQL per la creazione della tabella dei dipendenti, rendendo obbligatoria l’immissione del nome e del cognome e dichiarando il campo della tabella che è messo in corrispondenza con la chiave della tabella delle aziende. Operazioni relazionali con il linguaggio SQL Scrivere in pseudocodifica e in linguaggio SQL le seguenti interrogazioni. 296 3 4 5 6 7 Elenco dei dipendenti con matricola, cognome, nome, professione e reddito lordo. 8 Cognome e nome dei dipendenti di una determinata azienda che svolgono una professione prefissata. 9 Lista delle differenti professioni presenti in un’azienda di cui si conosce il codice. Denominazione e indirizzo dell’azienda avente un codice prefissato. Cognome e nome dei dipendenti che hanno un reddito superiore a una cifra prefissata. Denominazione e indirizzo delle aziende che hanno la sede in un Comune prefissato. Cognome, nome, professione, reddito, per i dipendenti che svolgono una determinata professione e hanno il reddito inferiore a un valore prefissato. © Istituto Italiano Edizioni Atlas parte seconda Ambienti software per i database capitolo 6 Il linguaggio SQL 10 Lista delle professioni, con eliminazione dei duplicati, per le quali i redditi sono superiori a un valore prefissato. 11 Elenco dei versamenti, con data e importo, effettuati dai dipendenti di una determinata azienda. 12 Ammontare dell’imposta lorda, calcolata sul reddito al netto delle trattenute secondo una percentuale prefissata, per tutti i dipendenti che svolgono una determinata professione. Funzioni di aggregazione, ordinamenti, raggruppamenti Numero dei dipendenti che lavorano in un’azienda di cui si conosce la denominazione. Valore minimo e massimo tra i redditi di tutti i dipendenti. Valore medio dei redditi dei dipendenti con professione prefissata. Somma dei versamenti di imposta effettuati dai dipendenti di un’azienda di cui si conosce il codice. ATTIVITÀ DI AUTOVERIFICA 13 14 15 16 17 Elenco alfabetico con i dati anagrafici di tutti i dipendenti. 18 Elenco alfabetico di tutte le aziende. 19 Elenco alfabetico dei dipendenti di un’azienda, con cognome, nome e reddito al netto delle trattenute. 20 Elenco alfabetico dei dipendenti di un’azienda con cognome, nome e detrazioni totali spettanti in funzione dei familiari a carico, conoscendo il valore unitario della detrazione per ogni familiare. 21 Elenco alfabetico con cognome, nome dei dipendenti e indirizzo dell’azienda dove lavorano. 22 Elenco dei dipendenti di un’azienda prefissata con cognome, nome, reddito lordo, somma dei versamenti di imposta. 23 Per ciascuna azienda: denominazione, numero dei dipendenti, totale dei redditi. 24 Numero dei dipendenti e reddito medio per i dipendenti con una professione prefissata raggruppati per azienda. 25 Valore medio dei versamenti di imposta raggruppati per azienda. 26 Cognome e nome dei dipendenti che lavorano presso una tra quattro aziende prefissate delle quali si conoscono i codici. 27 Cognome e nome dei dipendenti che non sono né impiegati né dirigenti. 28 Cognome e professione dei dipendenti che hanno il cognome con iniziale dalla lettera A alla lettera M. 29 Cognome, nome e professione dei dipendenti che hanno il reddito compreso tra due cifre prefissate. 30 Numero dei dipendenti raggruppati per professione riferiti alle aziende che operano in uno tra cinque settori di attività prefissati. 31 Lista delle aziende, con denominazione e valore medio dei versamenti di imposta, per le quali il valore medio è superiore a un valore prefissato. 32 Lista delle aziende, con denominazione e numero dei dipendenti che svolgono una professione prefissata, per le quali il numero dei dipendenti calcolato è superiore a 10. © Istituto Italiano Edizioni Atlas 297 parte seconda Ambienti software per i database capitolo 6 Il linguaggio SQL 33 Elenco delle professioni dei dipendenti per i quali il valore medio dei redditi è superiore a un valore prefissato. 34 Elenco delle aziende, con codice, denominazione e numero di dipendenti, per le quali il numero dei dipendenti è superiore a 20. 35 Cognome, nome e professione dei dipendenti per i quali il reddito è uguale al valore massimo tra tutti i dipendenti. 36 Codice dell’azienda, cognome e nome dei dipendenti che hanno il reddito uguale al valore minimo tra i dipendenti aventi una determinata professione. Viste logiche 37 Visualizzare odice e denominazione dell’azienda (o delle aziende) con il maggior numero di dipendenti. 38 Lista delle aziende, con denominazione e valore medio dei redditi nell’azienda, per le quali ATTIVITÀ DI AUTOVERIFICA il valore medio è inferiore al valore medio dei dipendenti di tutte le aziende. 39 Codice e denominazione dell’azienda (o delle aziende) con il minor numero di dipendenti. PROBLEMA 2 Si vogliono gestire con una base di dati le informazioni necessarie a organizzare i corsi di recupero in una scuola. Gli elementi caratterizzanti il problema sono: gli studenti, le materie, dove gli studenti possono avere delle carenze, e i docenti che devono fare i corsi di recupero. Gli studenti possono avere più materie carenti e in ogni materia ci possono essere più studenti bisognosi di recupero. Il legame tra studente e materia è realizzato tramite il voto che lo studente ha in quella materia e la data in cui questo voto è stato assegnato. Ogni docente insegna una sola materia, ma la stessa materia può essere insegnata da più docenti. Definire il modello E/R e il modello logico con le tabelle. Creazione del database e delle tabelle 40 Scrivere le istruzioni SQL per la creazione delle tabelle degli studenti, delle materie e dei docenti. 41 Scrivere le istruzioni SQL per la creazione della tabella dei voti, che rappresenta il legame tra studenti e materie, rendendo obbligatoria l’immissione del voto e dichiarando i campi della tabella che sono in corrispondenza con le tabelle degli studenti e delle materie. Codifica delle operazioni relazionali con il linguaggio SQL Scrivere in pseudocodifica e in linguaggio SQL le seguenti interrogazioni. 42 43 44 45 46 Elenco, con cognome e nome, degli studenti delle quinte classi. Elenco dei voti ottenuti da uno studente di cui si conosce il codice. Elenco dei docenti di uno studente di cui si conosce il codice. Elenco dei docenti con descrizione della materia insegnata. Elenco delle prove sostenute dagli studenti in una materia, della quale viene fornito il codice, con cognome, nome e voto. 47 Cognome, nome e classe degli studenti che hanno ottenuto voti inferiori a 5 in una certa materia di cui viene fornita la descrizione, facendo comparire ciascun studente una sola volta nell’elenco. 298 © Istituto Italiano Edizioni Atlas parte seconda Ambienti software per i database capitolo 6 Il linguaggio SQL 48 Elenco degli studenti di un docente, di cui si conosce il codice. 49 Elenco delle materie insegnate nella scuola, con descrizione della materia e dei dati dei docenti che la insegnano. Funzioni di aggregazione, ordinamenti, raggruppamenti Media dei voti di Inglese di uno studente di cui si conosce il nome. Numero degli studenti di una classe. Numero degli studenti della scuola. Miglior voto di Matematica nella classe terza. Miglior voto e peggior voto di uno studente di cui si conosce il codice. Elenco dei voti ottenuti da uno studente di cui si conosce il codice. L’elenco, con descrizione della materia, data e voto, deve essere ordinato per materia e data. ATTIVITÀ DI AUTOVERIFICA 50 51 52 53 54 55 56 Elenco degli studenti di un docente, di cui si conosce il cognome, ordinato per classe e per cognome e nome dello studente. 57 Elenco alfabetico di tutti gli studenti con cognome, nome e numero delle prove sufficienti in una determinata materia. 58 Elenco dei cognomi e nomi degli studenti di una certa classe con il numero delle prove con voto inferiore a 5 di ciascun studente. 59 Elenco delle descrizioni delle materie con il numero di docenti per ogni materia. 60 Per ciascuna materia la descrizione e il numero delle prove svolte nel periodo tra 1 ottobre e 15 novembre. 61 Numero delle prove che un determinato studente, di cui si conosce il cognome e nome, ha sostenuto in ciascuna materia con la descrizione della materia. 62 Cognome, nome e classe degli studenti per i quali il cognome inizia con la lettera R. 63 Elenco alfabetico dei docenti che insegnano o lettere o matematica o inglese. 64 Cognome e nome degli studenti di una data classe che hanno voti compresi tra i valori di 7,5 e 10 in una materia fornita come parametro. 65 Elenco degli studenti, con nome, cognome e classe, che hanno ottenuto insufficienze in matematica o informatica o fisica nel mese di aprile. 66 Elenco alfabetico dei docenti con la media dei voti assegnati per i quali la media è superiore a 5. 67 Elenco con cognome e nome degli studenti di una determinata classe che hanno il voto minimo inferiore a 4. 68 Elenco con cognome e nome degli studenti di una determinata classe che hanno il voto massimo superiore a 7. 69 Elenco dei docenti, con la materia di insegnamento, che hanno svolto più di 2 prove. 70 Descrizione delle materie nelle quali sono state effettuate più di 10 prove. 71 Cognome, nome e matricola degli studenti che non hanno insufficienze. 72 Cognome e mnome degli studenti che hanno più di un voto in Italiano. © Istituto Italiano Edizioni Atlas 299 parte seconda Ambienti software per i database capitolo 6 Il linguaggio SQL Viste logiche 73 Visualizzare cognome, nome degli studenti di una classe che hanno la media dei voti di tutte le prove inferiore alla media dei voti di tutte le prove per l’intera classe. 74 Cognome, nome e classe degli studenti che hanno ottenuto nelle prove di una materia un voto uguale al massimo dei voti in quella materia di tutte le classi. 75 Sigla delle classi che hanno la media dei voti di tutti gli studenti in una materia (di cui viene fornito il codice) inferiore alla media di tutti i voti in quella materia di tutta la scuola. PROBLEMI DI RIEPILOGO ATTIVITÀ DI AUTOVERIFICA Per i seguenti problemi, produrre l’analisi dei dati con entità, attributi, associazioni, motivandone le scelte; disegnare il modello E/R e verificarne la correttezza con le regole di lettura; definire le tabelle con le regole di derivazione; descrivere le caratteristiche degli attributi nel modello logico; scrivere infine le interrogazioni in pseudocodifica e in linguaggio SQL. Utilizzare come riferimento gli esempi svolti nel paragrafo 12. 76 Date le tabelle: Anagrafiche (Codice, Cognome, Nome, DataNascita, Indirizzo, Città, Provincia) Immobili (CodImm, Collocazione, Tipo, Dimensione, CodProprietario) Versamenti (ID, DataVers, Importo, CodAnag, CodImmobile) (le chiavi primarie sono sottolineate, le chiavi esterne sono in corsivo) che rappresentano gli importi versati dai proprietari di immobili per il pagamento delle imposte, produrre in pseudocodifica e in linguaggio SQL le seguenti interrogazioni: • Importo totale dei versamenti per una Provincia prefissata. • Numero degli immobili raggruppati per Tipo. • Cognome e Nome delle persone che posseggono più di 1 immobile. • Codice degli immobili per i quali sono stati fatti versamenti con importo superiore a una cifra prefissata. • Elenco con Cognome, Nome del proprietario e Collocazione dell’immobile per un Tipo prefissato. • Numero delle persone raggruppate per Provincia tra quelle che posseggono un immobile con Dimensione superiore a un valore prefissato. • Cognome, Nome, Codice immobile riferiti ai versamenti effettuati tra due date prefissate. • Media giornaliera degli importi dei versamenti per ciascuna data dei versamenti. 77 Le informazioni relative ai contratti dei giocatori con le società di calcio devono essere organizzate in una base di dati. Le squadre possono naturalmente stipulare contratti con molti giocatori; di solito un giocatore ha un contratto con una sola società; accade però spesso anche il caso della comproprietà di un giocatore con squadre diverse a opera di più contratti con i quali deve essere indicata anche la percentuale di possesso per ciascuna società; in ogni caso il giocatore ha una sola squadra di cui indossa la maglia e in cui effettivamente gioca. Se per ciascun contratto venissero indicate la data di inizio e la data di scadenza, si potrebbe anche sapere quali giocatori sono già occupati in una squadra, quali sono svincolati e quali sono in comproprietà: nel primo caso un solo contratto ha la data di scadenza superiore alla data odierna, nel secondo nessuno, nel terzo più di uno. Conservando nell’archivio tutti i contratti degli anni precedenti, si possono anche avere informazioni sulla carriera di un giocatore. 300 © Istituto Italiano Edizioni Atlas parte seconda Ambienti software per i database capitolo 6 Il linguaggio SQL Le interrogazioni da rappresentare sono: • Per ogni squadra, visualizzare il codice della squadra e il numero dei giocatori con contratto in corso. • Denominazione delle squadre che hanno più di 30 giocatori con contratto in corso. • Dato il codice di un un giocatore, fornire l’elenco delle squadre (denominazione, data inizio, data scadenza) con le quali ha avuto o ha contratti, cioè la carriera del giocatore. • Cognome, nome e ruolo dei giocatori attualmente svincolati. • Elenco dei giocatori (cognome, nome e squadra dove giocano) attualmente in comproprietà. • Cognome, nome del giocatore e denominazione della squadra che attualmente ha in corso il contratto con l’ingaggio più alto. 78 Si vuole gestire in modo automatizzato il servizio di fotocopiatura presso il Centro Stampa ATTIVITÀ DI AUTOVERIFICA di una scuola: ogni attività svolta (giorno, numero fotocopie, prezzo pagato) può essere richiesta da un utente che può essere uno studente, un docente oppure una classe; si può quindi usare un’unica anagrafica per gli utenti distinguendo tra studenti, docenti e classi attraverso un campo di 1 carattere (con valori S, D, C). Le informazioni sugli utenti sono minime (codice, descrizione, tipo, oltre a un riferimento: classe per gli studenti, sigla della materia per i docenti, aula per le classi). Le attività di fotocopiatura vengono svolte da operatori diversi e con macchine di stampa diverse. Si devono poi realizzare le seguenti interrogazioni: • Elenco delle attività svolte per i docenti di matematica (con giorno, numero fotocopie e prezzo). • Nome degli operatori che hanno svolto attività di fotocopie usando la macchina con codice ABC. • Elenco delle classi che hanno richiesto fotocopie in numero superiore a 100. • Elenco dei docenti con la descrizione e la materia. • Descrizione degli studenti che hanno fatto fotocopie, in numero superiore a un valore prefissato, con l’operatore avente codice XYZ. • Classi (con aula e numero fotocopie) che hanno richiesto il servizio nella giornata odierna. 79 Un’azienda di informatica gestisce un servizio di manutenzione sulle apparecchiature hardware e software delle aziende clienti. Ciascun cliente può sottoscrivere diversi contratti di manutenzione, ciascuno dei quali ha una data di scadenza e un importo complessivo; inoltre ogni contratto di manutenzione può riguardare diverse apparecchiature per ciascun cliente. Per identificare le apparecchiature, ciascun cliente usa un numero di matricola: per ciascuna apparecchiatura occorre quindi usare una chiave composta codice cliente + matricola apparecchiatura. Sulle apparecchiature, durante il periodo del contratto, vengono eseguiti diversi interventi di assistenza (ogni intervento viene registrato con riferimento a una sola apparecchiatura); interessa anche conoscere il nome del tecnico che ha effettuato l’intervento; ogni tecnico naturalmente può fare interventi su qualsiasi cliente e su qualsiasi apparecchiatura a seconda delle esigenze. L’intervento ha una data di inizio (chiamata del cliente) e una data di fine (apparecchiatura riparata e riconsegnata al cliente), che possono ovviamente anche coincidere. Se la data di fine è nulla, significa che l’apparecchiatura è tuttora in riparazione. Si devono realizzare le seguenti interrogazioni: • Elenco degli interventi in corso (non completati) con descrizione, data di inizio e nome del tecnico che li effettua. • Totale degli importi dei contratti che scadono nell’ultimo trimestre dell’anno per ciascuna azienda avente più di un contratto in manutenzione. • Elenco delle ragioni sociali dei clienti con numero delle apparecchiature per ciascun cliente. • Elenco delle ragioni sociali dei clienti che hanno richiesto interventi nel mese di febbraio. • Elenco dei nomi dei tecnici che hanno effettuato interventi sulle apparecchiature del cliente avente una ragione sociale prefissata. • Elenco di tutti gli interventi effettuati su un’apparecchiatura avente un certo codice cliente e un certo numero di matricola con descrizione, data inizio, e data fine. • Elenco dei clienti con codice cliente e numero degli interventi effettuati per i clienti che hanno la somma degli importi dei contratti inferiore a un valore prefissato. © Istituto Italiano Edizioni Atlas 301 parte seconda Ambienti software per i database capitolo 6 Il linguaggio SQL SCHEDA DI AUTOVALUTAZIONE CONOSCENZE Caratteristiche generali del linguaggio SQL Comandi per la definizione del database e per le manipolazioni dei dati Interrogazioni con il comando Select Operazioni relazionali in SQL Self join e join esterni Funzioni di aggregazione Ordinamenti e raggruppamenti Condizioni sui raggruppamenti Condizioni di ricerca Viste logiche Interrogazioni nidificate Comandi per la sicurezza ABILITÀ Creare una tabella con i comandi SQL Utilizzare la sintassi dei comandi Insert, Update e Delete Codificare semplici query in SQL Rappresentare le operazioni di selezione, proiezione e congiunzione Rappresentare in SQL il self join e il left join Usare le funzioni conteggio, somma, media, minimo e massimo Usare le clausole Order by e Group by Usare la clausola Having Passare in Access dallo schema QBE alla Visualizzazione SQL e viceversa Introdurre nelle query le condizioni con Between, In e Like Definire le viste Costruire query nidificate Impostare permessi e diritti di accesso DOMANDE PER LA PREPARAZIONE ALLA PROVA ORALE p. 533-534 SOLUZIONI AI QUESITI DI AUTOVERIFICA p. 537 302 © Istituto Italiano Edizioni Atlas