Sistemi di Gestione di Basi di dati File System vs DBMS _ Un file è una collezione di dati che risiede su un dispositivo di memoria esterna ed è strutturata in accordo ai requisiti di un'applicazione. Emissione fatture Inserimento Ordini Registro fatture Indirizzo Cliente Anagrafe clienti Indirizzo Cliente Ordini Indirizzo Cliente Fatture La ripetizione dell'indirizzo del cliente consente alle applicazioni Registro fatture e inserimento ordini di operare allo stesso tempo _ Programmi individuali accedono, di solito, in modo esclusivo ai file. Per raggiungere un ragionevole grado di efficienza, si introduce ridondanza nelle informazioni Introduzione ai DBMS pag. 1 _ La ridondanza riduce il numero di risorse che devono essere 'locked', quando più applicazioni sono attive. _ Ciò comporta tuttavia l'adozione di tecniche atte a garantire la consistenza delle informazioni. _ A causa delle limitate possibilità di cooperazione tra file, le applicazioni costruite su un file system si basano sui metodi di accesso messi a disposizione dal sistema operativo e sulle organizzazioni di file disponibili nel linguaggio di programmazione. _ Di solito organizzazioni: sono disponibili _ sequential _ relative _ indexed-sequential Introduzione ai DBMS pag. 2 le _ Un database è una collezione di oggetti che richiede un dispositivo di memoria esterna ad accesso diretto. Un DBMS (Data Base Management System) ha capacità di gestire grandi moli di dati in un ambiente multiutente. _ Dal punto di vista fisico, ovvero del sistema operativo, anche un database consiste di file. Tuttavia un DBMS consente elaborazione concorrente, mantiene la consistenza delle informazioni minimizzando la ridondanza, offre supporto per test e prototipazione, permette indipendenza del software dalla organizzazione fisica e logica delle strutture dati. Emissione fatture Indirizzo cliente Inserimento Ordini DBMS Ordini Registro fatture Fatture Una granularita' piu' fine consente l'uso condiviso della risorsa indirizzo cliente Introduzione ai DBMS Anagrafe clienti pag. 3 _ Un DBMS è costruito sopra il sistema operativo ed amplia la gamma delle strutture di accesso messe a disposizione dal file system. In sintesi, in una base di dati la gestione delle informazioni è logicamente centralizzata in una rappresentazione integrata e non ridondante. _ Dal punto di vista utente un database e' visto come una collezione di dati che modellano una certa porzione della realta' di interesse. _ L'astrazione logica con cui i dati vengono resi disponibili all'utente definisce un modello dei dati Es: * Un file è una sequenza di record: type persona = record cognome, nome: string[20]; ntel: string[16]; .......... end; Il concetto di file è legato ad una profonda conoscenza, da parte dell'utente, dei meccanismi di memorizzazione fisica e delle modalità di accesso. * Una relazione è un'astrazione di file: un insieme di ennuple (tuple) in cui non viene specificato l'ordine PERSONE(Cognome, Nome, Ntel, ......) Il concetto di relazione svincola ulteriormente l'utente dai dettagli della rappresentazione interna. Introduzione ai DBMS pag. 4 Peculiarità dei DBMS _ gestione efficiente di grandi moli di dati persistenti _ supporto dati _ per almeno un modello dei linguaggi di alto livello per _ definizione dati (DDL = Data Definition L.) _ manipolazione dei dati (DML=Data Manipulation L.) _ controllo dei dati (DCL=Data Control L.) _ gestione delle transazioni _ controllo degli accessi _ resilienza = capacita' di garantire l'integrita' dei dati in seguito a anomalie di funzionamento di varia natura _ ambiente di sviluppo _ _ _ _ _ _ generatori di applicazioni linguaggi di IV generazione interfacce evolute strumenti di riorganizzazione archivi strumenti di analisi delle prestazioni strumenti di ausilio al progetto Introduzione ai DBMS pag. 5 Livelli di astrazione nei DBMS La "classica" architettura a tre livelli vista 1 database concettuale vista 2 Database fisico vista n DDL per sottoschemi DDL per schema integrato realizzato su dispositivi fisici La presenza del livello concettuale risponde alla necessita' di fornire caratteristiche di indipendenza fisica che possano consentire la riorganizzazione dei dati su disco senza comportare effetti collaterali sui programmi applicativi che li usano. Allo stesso tempo il livello concettuale fornisce una visione integrata dei dati. La presenza del livello esterno (o delle viste) va nella direzione di assicurare l'indipendenza logica dei dati: l'utente ha la possibilita' di "vedere" i dati (o solo parte di essi) scegliendo l'astrazione piu' conveniente. Introduzione ai DBMS pag. 6 Livello fisico (interno) Il physical database e' una collezione di archivi e relative strutture di accesso che risiede permanentemente su memorie di massa. Il livello interno riguarda il modo in cui le informazioni sono organizzate e gestite sui dispositivi fisici. La descrizione di una base di dati a questo livello viene chiamata physical schema (schema interno). Il progetto fisico di un database riguarda problemi legati principalmente a: _ criteri di allocazione dei dati partizionamento, ordinamento, _ scelta dei metodi di accesso Introduzione ai DBMS pag. 7 Livello concettuale Il conceptual database e' un'astrazione del mondo reale come percepito (globalmente) dagli utenti. Un DBMS mette a disposizione un linguaggio DDL (Data Definition Language) per la descrizione del conceptual schema e per la sua (parziale) realizzazione in un corrispondente schema fisico. Il DDL consente di definire lo schema concettuale in termini di data model (modello dei dati). Si parla dunque di modello relazionale, reticolare, gerarchico, logico, a oggetti, a seconda del tipo di DBMS. Ad esempio, facendo uso del modello relazionale e del linguaggio SQL (Structured Query Language): create table STUDENTI ( Matricola char(5) not null, Cognome char(20) not null, Nome char(20) not null, Data_di_nascita char(6) not null, Telefono char(10) ); create table ESAMI ( Matricola CodCorso Denominazione Voto Data Introduzione ai DBMS char(5) char(5) char(30) integer char(6) pag. 8 not not not not not null, null, null, null, null); Lo schema concettuale rende trasparente l'implementazione fisica dei dati Per le relazioni STUDENTI ed ESAMI e' possibile avere due file distinti, oppure un unico file le cui pagine contengono un record di STUDENTI e N record di ESAMI (e' la soluzione adottata, ad es., dai DBMS ORACLE e SUPRA). Matric ola Cognome Nome D atanascita 12045 Giuliani Marco 27/02/71 12045 1027 Analisi I 25 4/6/91 12045 1045 Fisica 30 10/7/91 12045 112 TAMC 28 12/10/91 12045 1190 Algebra 30 18/2/92 12045 1132 Geometria Matricola Co dCorso I 27 Tel. 051-24451 21/5/92 Denominazione Uno schema concettuale viene costruito in modo da integrare le diverse esigenze di trattamento delle informazioni degli utenti di uno stesso database. Il processo che porta alla definizione, in sede di progetto, di una struttura unificante viene detto database view integration ed implica l'unificazione di schemi concettuali parziali. Introduzione ai DBMS pag. 9 Limitazioni dei D D L Spesso il formalismo impiegato per il progetto di un database è più ricco semanticamente del DDL del DBMS. E' necessario allora un ulteriore passo d i progetto che traduca dallo schema concettuale impiegato per descrivere il mondo reale allo schema concettuale (ora chiamato piu' propriamente schema logico) disponibile nell'ambiente del DBMS. Si distingue pertanto tra progetto concettuale e progetto logico. Impiegato = persona caratterizzata da: codice (Cod) nome (Nome) diretto superiore(Cod_dir) Lo schema concettuale deve modellare l'entita' Impiegato e la relazione transitiva di "superiore". impiegato(Cod,Nome,Cod_dir). superiore(Cod_sup,Cod_imp) :impiegato(Cod_imp,_,Cod_sup). superiore(Cod_sup,Cod_imp) :impiegato(Cod_imp,_,Cod_dir), superiore(Cod_sup,Cod_dir). I modelli relazionale, gerarchico e reticolare non dispongono degli strumenti necessari per esprimere uno schema di questo tipo. Occorre complementare il DDL a disposizione con strutture di altro tipo (ad es. funzioni C, regole Prolog, ecc) Introduzione ai DBMS pag. 10 Livello esterno Una view (vista) o sottoschema è porzione di uno schema concettuale. La costruzione di viste è inverso dell'integrazione concettuali parziali. una il processo di schemi Molti DBMS forniscono una sintassi per la definizione di sottoschemi e per la manipolazione delle viste generate. Data la relazione: PERSONE(Nome,CodFisc,Reddito,Indirizzo,Data_nascita) si può definire una vista in SQL mediante : create view PERSONE_RICCHE as select CodFisc,Nome from PERSONE where Reddito > 100,000,000 La vista PERSONE_RICCHE non corrisponde ad un vero file fisico, pur essendo interrogabile come se lo fosse: select Nome from PERSONE_RICCHE where CodFisc='TRLFLV51M27F839X' Introduzione ai DBMS pag. 11 Le viste consentono di: a) raggiungere un livello di astrazione maggiore rispetto al modello concettuale integrato del database. Un ufficio vendite vuole disporre di una vista sui propri clienti che contenga l'attributo età.. Tuttavia, poichè l'età cambia di giorno in giorno, nel modello concettuale integrato sarà previsto di memorizzare la data di nascita per ogni cliente. Ciò implica che l'interrogazione di una vista può comportare un calcolo per rendere disponibile all'utente un dato che concettualmente, nella sua visione esterna, fa parte del proprio sottoschema. b) consentire un certo livello di indipendenza logica a fronte di ristrutturazioni dello schema concettuale Si supponga che la relazione STRADE(Nome,Lung,Larg,Zona,Max_Civico) venga ridefinita come S_Z(Nome,Zona,Max_Civico) S_LL(Nome,Lung,Larg) E' possibile preservare la visione originaria definendo la vista: create view STRADE(Nome,Lung,Larg,Zona,Max_Civico) as select S_LL.Nome,S_LL.Lung,S_LL.Larg, S_Z.Zona,S_Z.Max_Civico from S_Z,S_LL where S_LL.Nome = S_Z.Nome che sfrutta la corrispondenza biunivoca tra le tuple di S_Z e S_LL Introduzione ai DBMS pag. 12 c) definire diverse classi di utenti, assegnando ad ognuna diversi privilegi. Le viste costituiscono un semplice meccanismo di sicurezza dei dati realizzato attraverso l'occultamento di informazione. Facendo uso della vista PERSONE_RICCHE, il DBMS puo' distinguere, ad esempio, tra: a) b) c) utenti con accesso in lettura e scrittura alla relazione PERSONE utenti con accesso in sola lettura alla relazione PERSONE utenti con accesso in sola lettura alla vista PERSONE_RICCHE Per distinguere i casi a) e b) occorrono altri strumenti (autorizzazioni) N.B. La classe d) utenti con accesso in lettura e scrittura alla vista PERSONE_RICCHE non puo' esistere! Ad es. insert into PERSONE_RICCHE(CodFisc,Nome) values ('TRLFLV51M27F839X','Flavia') darebbe luogo ad un inserimento reale in PERSONE della tupla ('TRLFLV51M27F839X','Flavia',?,?,?) che non soddisfa Reddito > 100,000,000 Introduzione ai DBMS pag. 13 Modelli dei dati Un modello dei dati e' una collezione di concetti che possono venire usati per descrivere un insieme di dati, le loro associazioni, e le operazioni che agiscono sui dati stessi. Una distinzione importante modelli dei dati in: Modelli suddivide i concettuali: utilizzati per descrivere la porzione di mondo che viene rappresentata nel Database, facendo uso di meccanismi di astrazione; importanti per la fase di progettazione concettuale di un DB. Modelli logici: forniscono una descrizione dei dati che e' direttamente supportata dal DBMS; rappresentano un target per la fase di progettazione logica; permettono un mapping semplice con le strutture del DB fisico; sono il punto di riferimento per chi sviluppa applicazioni su DBMS. Introduzione ai DBMS pag. 14 Modello Entity-Relationship (E/R) [Chen 1970] Corsi Studenti fr equentan o tenuti _da in_gru ppo_con D ocenti Lo schema modella una realta' descrivibile a parole come segue: I Corsi sono tenuti da Docenti Gli Studenti frequentano i Corsi Gli Studenti sono in gruppo con altri Studenti Lo schema non puo' fornire informazioni su quali gruppi sono presenti nei vari corsi (l'associazione in_gruppo_con non riguarda i Corsi) Lo schema scheletro non dice: quanti Corsi puo' tenere un Docente; cos'e' un Corso (se e' sdoppiato o meno), ecc. Esempio di Introduzione ai DBMS riferimento pag. 15 Par ti For ni tor i P_F (for nitu re) Parte: caratterizzata da {unico} Codice (P#) Nome (PName) Colore (Color) Peso (Weight) Citta' (City) Fornitore: caratterizzato da Codice (S#) {unico} Nome (Sname) Livello (Status) Citta' (City) Fornitura: caratterizzata da Codice Parte (P#) Codice Fornitore (S#) Quantita' (Qty) Informazioni aggiuntive: Una Parte puo' essere fornita da piu' Fornitori Un Fornitore puo' fornire piu' Parti N.B. Tutto cio' puo' essere espresso (graficamente o meno) facendo uso del formalismo del modello E/R Introduzione ai DBMS pag. 16 Modello Reticolare Il modello reticolare scaturisce dal report del 1971 del CODASYL DBTG (Data Base Task Group) mirante a fornire uno standard nel settore. Sistemi commerciali: IDS II DBMS-11 VAX-DBMS Honeywell Digital " IDMS Computer Associates DMS 1100 Univac IMAGE Hewlett-Packard Il modello si basa sui due concetti base di record type e set type. record type: descrive la struttura di un gruppo di record che memorizzano lo stesso tipo di informazioni set type: descrive una associazione esistente tra due record types (A e B) di tipo 1:N, ovvero: un record di tipo A, detto owner , e' posto in relazione a uno o piu' record di tipo B, detti member(s). Introduzione ai DBMS pag. 17 Es: rappresentazione Dipartimenti e relativo set type dei record Impiegati e type del Ow ner D1 I1 DEI S M ario 150 I4 Bologna Anna I 20 L uca Members Per rappresentare la relazione tra Parti e Fornitori (di tipo molti a molti, M:N), si rende necessario: 1) introdurre il record (detto link type); type Forniture 2) definire due set types con owner, rispettivamente una Parte ed un Fornitore; 3) rendere le Forniture entrambi i set types. Introduzione ai DBMS pag. 18 member di S1 Smith 300 P1 20 200 Nut P2 400 Red Bolt 12 Jones 300 10 Paris 400 London Green P3 Introduzione ai DBMS S2 London 17 Par is Screw pag. 19 Blue 17 Rome Supporto fisico Gli elementi di un record type possono essere memorizzati secondo tre modalita' distinte: DIRECT: CALC: VIA SET: allocazione esplicita sul dispositivo fisico; allocazione via funzione hash; overflow gestito con open addressing a scansione lineare; allocazione contigua per elementi member dello stesso set type; l'opzione NEAR TO OWNER forza l'allocazione in prossimita' del record owner. Per quanto riguarda gli elementi di un avere: i collegamenti tra set type, si puo' MODE IS CHAIN: lista circolare; MODE IS POINTER ARRAY:lista lineare; INDEX: struttura ad albero per i members. DML Le operazioni di ricerca si basano su una visita del DB che "naviga" sui cammini definiti dalle istanze dei set. L'elaborazione e' "record-oriented", in quanto si accede ad un singolo record alla volta. Concetto di record corrente: a) del programma (ultimo record visitato) b) del record type R (idem, ma relativo a R) c) del set type S (relativo a S, owner o member)) Introduzione ai DBMS pag. 20 Istruzione FIND ANY list>] FIND <record type> [USING <field trova un record sulla base di eventuali condizioni di eguaglianza sui campi. (N.B.: USING = WITH) FIND ANY Impiegati USING Nome = "Luca" FIND DUPLICATE <field list>] <record type> [USING per trovare altri record soddisfano le condizioni. che FIND DUPLICATE Impiegati USING Nome = "Luca" FIND (FIRST|NEXT|PRIOR|LAST) <record type> WITHIN <set type> [USING <field list>] permette l'accesso set type. ai membri di un FIND FIRST Impiegati WITHIN Lavora_in FIND OWNER WITHIN trova l'owner del set <set type> corrente. FIND OWNER WITHIN Lavora_in Istruzione GET GET < record type >: restituisce il record corrente nella variabile di programma assegnata. GET DIPARTIMENTI; Introduzione ai DBMS pag. 21 Esempi: stampa dei nomi di tutti gli impiegati di un dipartimento Dipartimento.Codice = $DCod {$DCod : variabile programma } FIND ANY Dipartimento USING Codice if DB_STATUS = 0 {Flag di stato} then begin FIND FIRST Impiegati WITHIN Lavora_in while DB_STATUS = 0 do begin GET Impiegati write Impiegati.Nome FIND NEXT Impiegati WITHIN Lavora_in end end; di stampa del nome del mio dipartimento dei nomi di tutti i suoi impiegati e Impiegati.Codice = $ICod {$ICod : e' il mio codice} FIND ANY Impiegati USING Codice if DB_STATUS = 0 then begin FIND OWNER WITHIN Lavora_in GET Dipartimento write Dipartimento.Nome FIND FIRST Impiegati WITHIN Lavora_in ........... { prosegue come sopra } end; Introduzione ai DBMS pag. 22 Modello Gerarchico A differenza del modello relazionale, il modello gerarchico non e' mai stato formalmente definito. Ne' si e' avuto un tentativo di standardizzazione simile a quello operato dal CODASYL DBTG per il modello reticolare. L'origine e' industriale (IBM), e risente fortemente dell'influenza di aspetti piu' "fisici" che "logici" Sistemi commerciali: IMS (Information Management System) IBM E' il sistema gerarchico piu' diffuso, che ha praticamente dominato il mercato dalla fine degli anni '60 agli inizi degli anni '80, fino all'avvento dei sistemi relazionali. Il suo DML, detto DL/I (Data Language/I), non e' integrato nel sistema, e forza necessariamente l'uso di un linguaggio ospite. System 2000 MRI (ora SAS, Inc.) L'aspetto piu' saliente dei sistemi gerarchici e' sicuramente l'efficienza nell'esecuzione delle operazioni che sono conformi alla struttura prescelta per rappresentare le associazioni tra i dati. Introduzione ai DBMS pag. 23 Un database gerarchico e' una foresta, ovvero una collezione di alberi. La scelta della struttura degli alberi puo' indurre asimmetrie nella rappresentazione (logica e fisica), con conseguente sbilanciamento delle prestazioni. P1 Nut Red S1 Smith S2 P2 Screw S1 Introduzione ai DBMS 10 20 Jones Smith 17 300 Paris London 200 Par is 17 20 300 Paris 10 Blue London London Gr een Smith S2 P3 20 Jones Bolt S1 12 Rome London pag. 24 400 400 I concetti alla base di un DB gerarchico sono quelli di record type (segment in IMS) e di parent-child relationship type (PCR type). Quest'ultimo e' un legame 1:N tra un parent record type e un child record type. In un DB gerarchico il record type che non ha un parent e' detto root. La rappresentazione di associazioni M:N (ad es. tra Fornitori e Parti) puo' dar luogo a replicazione dei dati, a meno di non fare uso di virtual (o pointer) record type. P1 Nut S1 Red Smith S2 P2 Bolt 12 20 Jones Gr een London London 10 Paris 17 300 300 Paris 200 400 E' anche possibile avere due gerarchie distinte, con root Parti e Fornitori. Introduzione ai DBMS pag. 25 Supporto fisico Dato un albero di record types e PCR types, una sua istanza e' un albero in cui viene stabilito un ordine lineare sui record di ogni record type. L'albero e' memorizzato (logicamente) secondo una visita in preordine dei nodi. database schema D ept. Emp. occurrence tree Proj. DM Funds John M ary Ann .... Stars Roblab DM John Stars Introduzione ai DBMS M ary FlyCo. Ann .... Games Toyfun .... linear stor age Roblab FlyCo. Games Toyfun pag. 26 Organizzazioni fisiche in IMS HSAM (Hierarchical Seq. Access Method): allocazione sequenziale, valida per archivi storici. HISAM (Hierarchical ISAM): gestione via ISAM (o VSAM), con accesso indiciato alle root degli alberi. Un albero e' memorizzato in una pagina ad esso dedicata e, se necessario, nell'area di overflow. HIDAM (Hierarchical Indexed Direct AM): simile all'HISAM, ma senza gestione esclusiva delle pagine, e con uso di puntatori per il mantenimento dell'ordinamento lineare dell'albero. HDAM (Hierarchical Direct AM): i record root sono gestiti via hash; gli overflow sono in area primaria a catene non coalescenti. Introduzione ai DBMS pag. 27 DML GET UNIQUE <conditions> <record per reperire root di condizioni type> record WHERE sulla base GET UNIQUE Dipartimenti WHERE Codice = "DM" GET NEXT <record type> WHERE <conditions> per il successivo record di un tipo GET NEXT WITHIN PARENT <record type> per reperire il (successivo) del padre corrente figlio GET NEXT WITHIN PARENT Impiegati Esempio: elenco dei progetti del dipartimento "DM" GET UNIQUE Dipartimento WHERE Codice = "DM" while DB_STATUS = 0 do begin GET NEXT WITHIN PARENT Progetti write Progetti.Nome end; Introduzione ai DBMS pag. 28 Nel caso di associazioni M:N si ha una formulazione dell'interrogazione che, dipendendo fortemente dalla struttura dell'albero, facilita alcune interrogazioni a scapito di altre. Esempio: stampa di tutti i Fornitori fornito la parte "P1" che hanno GET UNIQUE Parti WHERE P# = "P1" while DB_STATUS = 0 do begin GET NEXT WITHIN PARENT Fornitori write Fornitori.S# end; stampa di tutti Fornitore "S1" le Parti fornite GET FIRST Parti while DB_STATUS = 0 do begin Found = FALSE while (DB_STATUS = 0) and not(Found) do begin GET NEXT WITHIN PARENT Fornitori if DB_STATUS = 0 then if Fornitori.S# = "S1" then begin Found = TRUE write Parti.P# end end GET NEXT Parti end; Modello Introduzione ai DBMS Relazionale pag. 29 dal A differenza dei modelli reticolare e gerarchico, il modello relazionale ha avuto origine nei laboratori di ricerca e, solo successivamente, e’ stato supportato da sistemi commerciali. La definizione formale degli elementi del modello ha permesso lo sviluppo di una teoria in grado di supportare efficacemente il progetto logico di un DB. 1970: “A Relational Model of Data Shared Data Banks”, di E.F. Res. Lab., San Jose’, CA) 1974: prima versione (allora SEQUEL) del for Large Codd (IBM linguaggio SQL 1975-79: sviluppo del prototipo System R presso i laboratori IBM di San Jose’ 1981: SQL/DS, versione commerciale di SystemR 1983: IBM Database2 (DB2) Altri sistemi: SQL/SERVER ORACLE INFORMIX Introduzione ai DBMS Microsoft Oracle Informix pag. 30 La rappresentazione dei dati nel modello relazionale e’ in forma di relazioni. Piu’ formalmente: Definizioni: Un dominio e’ una collezione di valori. Il prodotto cartesiano dei domini D1, D2,...,Dn (non necessariamente distinti) e’ l’insieme di tutte le possibili n-ple (o tuple) ordinate t = (d1,d2,,...,dn), tali che d1__D1, d2__D2, ..., dn__Dn. Una relazione definita sui domini D1, D2,...,Dn e’ un sottoinsieme del prodotto cartesiano D1 x D2 x ... x Dn Il valore di n e' detto "arita'") della relazione. grado (o Esempi: D1 = { mela, pera }; D2 = { (10,12), (11,23), (4,20) } Una possibile relazione (binaria) su D1 e D2 e’ data dalle tuple R={ (mela, (11,23)), (mela, (10,17)) } (pera, (10,12)), Una relazione ternaria contenuta in D1 x D2 x D1 e': R' = { (mela,(11,23),pera), (pera,(11,23),mela) } Introduzione ai DBMS pag. 31 La rappresentazione piu' intuitiva di una relazione e' di tipo tabellare mela (11,23) mela (10,17) pera (10,12) ma e' anche possibile rappresentazione "spaziale" dimensioni a una n (11,23) (10,12) (10,17) mela 1 0 1 pera 0 1 0 o anche una insiemistico rappresentazione di (10,12) mela (11,23) pera (10,17) Introduzione ai DBMS pag. 32 tipo Attributi e Domini La definizione data di relazione e' ispirata direttamente al concetto matematico di relazione tra insiemi. In quanto tale: 1) e' un insieme, e quindi non possono esistere relazioni con tuple duplicate (anche se nei DBMS cio' e' normalmente tollerato!) 2) risulta dipendente dall'ordine dei domini o, considerando la rappresentazione tabellare, delle colonne. Es: La relazione R''={ ((11,23),mela), ( (10,12),pera), ((10,17),mela) } e' distinta da R vista in precedenza. Un dominio specifica unicamente un insieme di valori possibili, ma non dice nulla sull'uso che di tali valori viene fatto. Questo e' particolarmente importante nel caso di domini non distinti. Per poter trattare agevolmente relazioni con domini ripetuti, fornire un'intuizione sul significato dei valori del dominio, e rendere irrilevante l'ordine delle colonne, si introduce il concetto di attributo Un attributo e' una colonna relazione designata da un nome. Introduzione ai DBMS pag. 33 di una Data la tupla t = (d1,...,di,...,dn), di e' detta l'i-ma componente di t. Si supponga che l'i-ma colonna della relazione sia designata con il nome Ai. Allora ci si puo' riferire all'i-ma componente di t con la notazione t.Ai o t[Ai]. Frutto X_Y mela (11,23) mela (10,17) pera (10,12) Gli attributi della relazione sono Frutto definiti rispettivamente sui domini D1 e D2. e X_Y, Se t = (mela, (11,23)), allora t.X_Y = t[X_Y] = (11,23). Facendo uso degli attributi l'ordine delle colonne diventa irrilevante, a condizione che ogni attributo di una relazione abbia un nome distinto. Seconda definizione di relazione: Una relazione di grado n e' un insieme di tuple t, dove t e' una funzione t:Ai _ Di (i = 1,2,..,n) che assegna ad ogni (nome di) attributo Ai un valore del dominio Di. Esempio: La tupla (mela, (11,23)) mapping t(Frutto) = mela t(X_Y) = (11,23) Introduzione ai DBMS pag. 34 e' definita dai due Linguaggi di interrogazione procedurali e non L'uso di un linguaggio di programmazione procedurale convenzionale (Cobol, Basic, Pascal, C, etc.), che si appoggia ad un file system, comporta una conoscenza di dettaglio circa l'architettura dei file e la stesura di codice che "naviga" le strutture dati in modo esplicito. Pur utilizzando librerie di software è responsabilità del programmatore "cucire" i vari "pezzi" in modo opportuno. Un esempio dal Database ToolBox del TurboPascal: procedure ListaClienti(var Clienti:DataSet); var Contatore:longint; CodiceCliente:codice; begin Contatore:=0; TAReset(Clienti); repeat TANext(Clienti,RecordCliente,CodiceCliente); if Ok then begin Display(RecordCliente); Contatore:=succ(Contatore) end until not Ok; if Contatore >0 then begin writeln; writeln(Contatore,' clienti') end end; Un DBMS rende l'accesso ai file più semplice attraverso l'uso di un query language : il livello di dettaglio richiesto all'utente dipende dal tipo di modello dati adottato. Introduzione ai DBMS pag. 35 Esempio di query : trova il Direttore di ROSSI Modello Reticolare Il modello dei dati prevede strutture multilista che mettono in connessione gli impiegati ai propri dipartimenti e i dipartimenti ai direttori. IMPIEGATI.Nome := 'ROSSI' find IMPIEGATI record by CALC_KEY find owner of current IMP-DIP set find first Direttore record in current DIP-DIR set print Direttore.Nome Modello Relazionale IMPIEGATI(Nome,CodImp,CodDip,....) DIPARTIMENTI(CodDip,Direttore,......) in SQL : select Direttore from IMPIEGATI,DIPARTIMENTI where IMPIEGATI.Nome = 'ROSSI' and IMPIEGATI.CodDip = DIPARTIMENTI.CodDip Introduzione ai DBMS pag. 36 Gestione delle transazioni Un DBMS provvede alla gestione della concorrenza delle transazioni sulla base di dati. Si deve garantire infatti che gli accessi ai dati, da parte di diverse applicazioni, non interferiscano; al fine di conservare l'integrità dei dati è necessario far ricorso ad opportuni meccanismi di controllo della concorrenza. Esempio : transazione di prelievo di una quantità Q dal conto corrente con codice XXX memorizzato in un archivio C_Correnti. Se il nucleo della transazione fosse del tipo : leggi da C_Correnti il record CC con codice XXX; if CC.disponibile >= Q then begin CC.disponibile := CC.disponibile - Q; eroga la somma Q; aggiorna il record CC su C_Correnti end else messaggio('operazione non possibile'); potrebbe accadere che due transazioni T1 e T2 che vogliono prelevare, rispettivamente 80 e 50, dallo stesso conto corrente con disponibilità 100, vengano a sovrapporsi come segue, provocando un prelievo non corretto: CC.disponibil 100 e in C_Correnti T1 leggi T2 spazio di lavoro T1 100 100 spazio di lavoro T2 Introduzione ai DBMS 50 -80 leggi 100 100 20 aggiorn a -50 aggiorn a 100 20 20 20 100 100 50 50 pag. 37 20 T1 e T2 devono accedere in modo esclusivo al record: il DBMS deve rendere disponibili primitive per lock ed unlock a diversi livelli di granularità: la transazione si modifica come segue: leggi con lock da C_Correnti il record CC con codice XXX; if CC.disponibile >= Q then begin CC.disponibile := CC.disponibile - Q; eroga la somma Q; aggiorna il record CC su C_Correnti end else messaggio('operazione non possibile'); unlock il record CC; dove leggi con lock realizza un ciclo di attesa che termina se la risorsa record CC è disponibile per un accesso esclusivo. Naturalmente con un DBMS evoluto non è responsabilità del programmatore la gestione della concorrenza, (tale responsabilità è invece piena nel caso di uso diretto del file sytem da linguaggio di programmazione). Il query language svincola l'utente dall'esplicitare i meccanismi di locking, ad esempio in SQL interattivo T1 sarebbe: update C_Correnti set disponibile = disponibile - 80 where codice = 'XXX' and disponibile >= 80 Un altro problema che si può presentare, e che il DBMS deve essere in grado di gestire, è il deadlock (stallo). Ad esempio : T1 e T2 che necessitano dell'uso esclusivo di due risorse R1 ed R2, richiedendole come segue: T1 : lock R1; Introduzione ai DBMS T2 : lock R2; pag. 38 usa R1; lock R2; usa R1 e R2; unlock R1; unlock R2; usa R2; lock R1; usa R1 e R2; unlock R1 unlock R2; La concorrenza di T1 e T2 può comportare un'attesa infinita da parte di entrambe le transazioni. Il nucleo di gestione della concorrenza deve rilevare condizioni di deadlock e procedere ad un ripristino consistente del database. In caso di database distribuito su più computer il controllo e la gestione della concorrenza implicano il ricorso a tecniche molto sofisticate. Linguaggi di IV generazione Un ambiente di sviluppo di database deve consentire una elevata produttività e affidabilità del software, facilitare la prototipizzazione rapida, rendere semplice gli interventi di manutenzione e permettere il riuso per altre applicazioni. Le possibilità offere devono comprendere: * * * * * Simple Query Language Complex Query Language Report Generator Graphics Generator Application Generator Un linguaggio di IV generazione deve offrire caratteristiche di sistema di supporto alle decisioni e di modellizzazione concettuale. Deve inoltre consentire inter-operabilità fra database che si appoggiano a vari tipi di DBMS. Introduzione ai DBMS pag. 39 Sicurezza dei dati Oltre ad offrire protezione dei dati in caso di guasto, un DBMS deve garantire la base di dati da accessi non autorizzati. A tale scopo deve essere consentita la definizione di password e di particolari privilegi differenziati per classi di utenti. Ad esempio in SQL è possibile restringere, per certi utenti, la visibilità degli attributi di una relazione; infatti data la relazione: PERSONE(Cognome,Nome,CodFisc,Reddito,Indirizzo) si può definire una vista: create view ANAG as select Cognome,Nome,CodFisc from PERSONE La vista così definita è equivalente ad una relazione con solo gli attributi Cognome,Nome,CodFisc. ANAG(Cognome,Nome,CodFisc) e non corrisponde ad un vero file fisico, pur essendo interrogabile come se lo fosse: select Cognome,Nome from ANAG where CodFisc='TRLFLV51M27F839X' E' possibile dunque definire alcune classi di utenti, assegnando vari privilegi per ciò che concerne l'accesso all'archivio PERSONE, ad esempio: a) b) c) utenti con accesso in lettura e modifica alla relazione PERSONE utenti con accesso in lettura alla relazione PERSONE utenti con accesso in lettura alla vista ANAG Alcuni sistemi consentono anche la materializzazione delle viste. Il problema dell'aggiornamento delle viste in virtù di modifiche apportate allo schema del database Introduzione ai DBMS pag. 40 è normalmente compito del progettista ma in alcuni sistemi può essere parzialmente facilitato da strumenti automatici. In fig. 1.5 un esempio di schema E/R che descrive le inter-relazioni che intercorrono fra le entità STUDENTE, CORSO, PROFESSORE e DIPARTIMENTO. Uno studente, contraddistinto dagli attributi Cognome, Nome, Data di nascita, Matricola, può aver sostenuto esami in una certa Data esame riportando un certo Voto con riferimento ad un certo corso. Interessa memorizzare informazioni di uno studente anche se non ha sostenuto esami. Per ogni corso si dispone delle informazioni CodCorso e NomeCorso; un corso può esistere indipendentemente dal fatto che vi siano o meno studenti che abbiano già sostenuto esami. Per un corso dunque vi possono essere dunque zero, uno o più studenti che hanno sostenuto il relativo esame. Il legame associativo tra le entità studente e corso è dunque di tipo molti a molti non obbligatoria, ovvero 1 ad N parziale in entrambe le direzioni, ed è espresso in fig. 1.5 dalla relationship (associazione)ESAME . In fig. 1.5 si mostra anche un'altra associazione TITOLARITA' tra l'entità CORSO e l'entità PROFESSORE. Un professore è obbligatoriamente titolare di un corso ma può essere titolare anche di più corsi. Un corso invece può essere istituito, ma non attivato e quindi può non ancora avere un titolare. L'associazione è dunque totale di tipo 1 ad N nella direzione professore-corso e di tipo 1 ad 1 parziale nella direzione corso-professore. Analoghe considerazioni valgono per l'associazione AFFERENZA che mette in relazione le entità DIPARTIMENTO e PROFESSORE. La semantica della notazione grafica usata per esprimere quanto detto a parole sarà precisamente introdotta nel capitolo dedicato alla modellizzazione concettuale E/R. Introduzione ai DBMS pag. 41 Cognome, Nome Data di nascita Matricola STUDENTE Voto Data esame CodCorso NomeCorso CORSO ESAME TITOLARITA' DIPARTIMENTO AFFERENZA PROFESSORE CodProf CodDip Cognome,Nome Indirizzo Denominazione Figura 1.5 Lo schema E/R può essere mappato nel modello relazionale come segue: STUDENTE(Matricola,Cognome,Nome,DataNascita) ESAME(Matricola,CodCorso,Voto,DataEsame) CORSO(CodCorso,NomeCorso,CodProf) PROFESSORE(CodProf,Cognome,Nome,CodDip) DIPARTIMENTO(CodDip,Denominazione,Indirizzo) Anche se per l'esempio qui riportato può sembrare piuttosto intuitivo la realizzazione proposta nel modello relazionale, la fase di progetto logico, in generale, è piuttosto complessa e necessita di metodologie e strumenti appropriati. Introduzione ai DBMS pag. 42 Il Livello vista (esterno) Indipendenza dei dati Due sono i livelli di indipendenza che si possono realizzare in un database ben progettato. Il primo tipo di indipendenza, detto indipendenza fisica, consente di apportare modifiche all'organizzazione fisica dei dati senza alterare i programmi di interrogazione che sono stati scritti nel rispetto del modello dei dati concettuale messo a disposizione dal DBMS. La possibilità di costruire viste consente inoltre di realizzare un'indipendenza logica. Infatti a volte può essere necessario apportare modifiche allo schema concettuale (logico) ed è probabile che alcuni sottoschemi non debbano essere modificati, ovvero non è necessario modificare tutti i programmi applicativi. Solo quelli che visitano la porzione di dati interessata ai cambiamenti effettuati andranno rivisti ed eventualmente modificati. Introduzione ai DBMS pag. 43 1.4 Linguaggi dei database In un linguaggio di programmazione convenzionale le frasi di dichiarazioni dei dati e gli statement di computazione vengono espressi in una sintassi unica, quella del linguaggio. In un database, invece, si distinguono: . . . un linguaggio di definizione dei dati (DDL) un linguaggio di manipolazione dei dati (DML) un linguaggio per il controllo dei dati (DCL) D'altra parte, in un database, i dati indipendentemente dai programmi applicativi. esistono Linguaggio di definizione dei dati Il DDL non è un linguaggio procedurale ma piuttosto una notazione per creare e manuntenere la struttura di una base di dati; a seconda del modello concettuale adottato il DDL consente di descrivere i tipi di entità in gioco e le relazioni tra le entità. Ad esempio in SQL: create table Studenti ( Matricola char(5) not null, Cognome char(20) not null, Nome char(20) not null, Voto integer ); specifica gli attributi dell'entità Studente create unique index MatrStud on Studenti(Matricola); provoca la creazione di un indice sul campo Matricola Linguaggio di manipolazione dati Il DML consente di esprimere operazioni sulle strutture dati definite. Introduzione ai DBMS pag. 44 Ad esempio: insert into Studenti values ('20111','Bianchi','Mario',23); select Cognome,Nome from Studenti where Voto >= 18 order by Cognome; Linguaggio di controllo dei dati Il DCL consente di effettuare operazioni di controllo quali ad esempio: commit per terminare una transazione e rendere permanenti le modifiche effettuate alla base di dati; rollback per ripristinare la base di dati ad uno stato consistente annullando gli effetti prodotti da modifiche fatte dopo l'ultimo commit grant per informazioni assegnare privilegi revoke per rimuovere privilegi safepoint per creare un checkpoint Introduzione ai DBMS pag. 45 di accesso alle Linguaggi ospite Oltre alle istruzioni che consentono la manipolazione della base di dati è necessario, per realizzare applicazioni, disporre di linguaggi general purpose. A tale scopo sono percorribili tre alternative: a) il DBMS dispone di un linguaggio proprio, ad esempio in dBASE IV: * un esempio di istruzioni procedurali use Ordini do while .not. eof() clear list next 5 N_Ordine,Descr_Parte,Costo ? wait "Premi X:fine,B:indietro,spazio:continua" to Mstop do case case Mstop $ "Xx" .or. eof() exit case Mstop $ "Bb" skip -9 otherwise skip endcase enddo b) I comandi per la manipolazione dei dati vengono invocati all'interno di un linguaggio convenzionale (C, Cobol, Pl/I,...), ad esempio in ORACLE da linguaggio C è possibile invocare le procedure del gestore : /* si dichiarano due array */ int A[10]; char S[10][50]; /* si invocano istruzioni SQL */ osql3(cursor,"insert into T values(:var1,:var2)",-1) obndrv(cursor,":var1",-1,A[0],4,3,...); obndrv(cursor,":var2",-1,S[0],50,1,...); c) Si dispone di un linguaggio esteso e di un relativo precompilatore, ad esempio PRO*C in ambiente ORACLE: Introduzione ai DBMS pag. 46 /* frammento di programma in PRO*C */ #include <stdio.h> EXEC SQL BEGIN DECLARE SECTION; varchar uid[20]; varchar pwd[20]; /* altre dichiarazioni */ EXEC SQL END DECLARE SECTION; EXEC SQL INCLUDE SQLCA; main() { /* login ad ORACLE */ strcpy(uid.arr,"ROSSI");/* copia lo username */ uid.len=strlen(uid.arr); strcpy(pwd.arr,"NEMO");/* copia la password */ pwd.len=strlen(pwd.arr); EXEC SQL WHENEVER SQLERROR STOP; EXEC SQL CONNECT :uid IDENTIFIED BY :pwd; printf("Connessione utente:%s \n",uid.arr); /* altre istruzioni */ } Introduzione ai DBMS pag. 47 La fig. 1.6 illustra i componenti principali di un DBMS ed evidenzia le diverse modalità di interazione, corrispondenti a differenti responsabilità e ruoli. Componenti principali di un DBMS Interrogazione estemporanea Programma applicativo Schema DB Processore di istruzioni DML e DCL Compilatore DDL Tavole di autorizzazione Gestore DB Tavole per il controllo degli accessi concorrenti Tavole di descrizione DB Gestore file DB Figura 1.6 Introduzione ai DBMS pag. 48 1.5 Verso nuove applicazioni database Applicazioni VLSI, CAD, Software Engineering, GIS, DDS, etc. necessitano di strumenti concettuali sofisticati per modellare la realtà di pertinenza e di potenti meccanismi per le operazioni sulle informazioni. Per queste applicazioni la separazione tra DML e linguaggio ospite crea notevoli difficoltà; si pensi ad esempio alla memorizzazione di immagini costruite tramite un assemblaggio di immagini componenti ; in tal caso è necessario disporre di costrutti che consentano ricorsione (si noti ad esempio che in un DBMS relazionale non è possibile esprimere interrogazioni ricorsive). Si pensi, con riferimento alla fig. 1.7, ad uno zoom che comporta un'interrogazione ricorsiva sulla base di dati, se la figura è memorizzata come insieme di riferimenti a componenti. posacenere telefono 1 fotocopiatrice telefono 2 cestino Figura 1.7 Introduzione ai DBMS pag. 49 Integrazione tra DML e linguaggio ospite Il problema di combinare capacità di rapido accesso alle informazioni, tipiche di un DML, e caratteristiche general purpose di un linguaggio ospite, viene oggi affrontato secondo due approcci : * paradigma orientato agli oggetti uso di un linguaggio che consenta di definire tipi di dati astratti, che abbia capacità espressive, che possa rappresentare il comportamento degli oggetti, che faciliti l'uso di tecniche di ingegneria del software. Ad esempio in IRIS definita la classe Persona e la funzione Genitore è possibile definire la funzione Nonno come segue: Create function Nonno(Persona p) -> Persona as select n for each Persona n where n=Genitore(Genitore(p)); Si noti come questa funzione può essere espressa in SQL, come segue : select X.nome,Y.nome from Persona X, Persona Y where X.genitore = Y.nome immaginando di avere una relazione Persona(nome,genitore) e definendo un join fra X e Y sinonimi della stessa relazione Persona. Si noti che nel modello ad oggetti definito, la funzione corrisponde ad un metodo, ed il risultato è ancora una sottoclasse della classe Persona. Un altro esempio : "Trova tutti i superiori di Rossi", potrebbe essere espresso nel modello di ORION come : (select Impiegato Introduzione ai DBMS pag. 50 (recurse Superiore) (Nome = "Rossi")) dove Impiegato è una classe con attributo Nome e un attributo Superiore. Il dominio dell'attributo Nome è la classe Stringhe e il dominio dell'attributo Superiore è ancora la classe Impiegato. L'espressione (recurse Superiore) dice che, una volta trovata un'istanza della classe Impiegato che soddisfa al predicato (Nome ="Rossi"), devono essere trovati ricorsivamente i valori dell'attributo Superiore. Questa interrogazione non nell'algebra relazionale. Introduzione ai DBMS può pag. 51 essere espressa * paradigma logico usa un linguaggio che applica regole logiche del tipo if ...... then ...... Alcuni predicati sono considerati parte dello schema concettuale, altri consentono di definire viste, altri ancora possono essere usati per costruire programmi applicativi. Al contrario del paradigma ad oggetti, il paradigma logico offre un linguaggio essenzialmente dichiarativo. Ad esempio: manager(Imp,Dir) impiegato(Imp,Dip)&dirige(Dip,Dir) :- che asserisce : Dir è manager di Imp se sono verificati due fatti contemporaneamente, ovvero Imp è impiegato nel dipartimento Dip e Dir dirige il dipartimento Dip. E' immediato mostrare che è necessario un join in SQL. Un altro esempio di potenza espressiva della logica : Superiore(Imp,Sup):-Responsabile(Imp,Sup) Superiore(Imp,Sup):Responsabile(Imp,X)&Superiore(X,Sup) ovvero un Superiore di un impiegato Imp o è il suo responsabile diretto o è Superiore di qualcuno che è responsabile diretto di Imp. E ciò implica ricorsione, pertanto non esprimibile in algebra relazionale. Passato e futuro (secondo Ullman!?) Decade Sistemi Introduzione ai DBMS Orientato pag. 52 a Dichiarativ o? DML/host 1960 Gerarchici oggetti No Separ Reticolari 1970 Relazionale valore Sì Separ 1980 OO-DBMS oggetti No Integ 1990 KBMS valori Sì Integ La predizione di Ullman è che i KBMS sostituiranno gli OO-DBMS , rivestendo l'analogo ruolo svolto dai sistemi relazionali nei confronti dei sistemi gerarchici e reticolari. La ragione addotta è principalmente l'assenza di un linguaggio puramente dichiarativo e l'orientamento non a valori, un passo indietro rispetto ai sistemi relazionali. Personalmente questa affermazione così categorica mi lascia sconcertato e mi ricorda certe affermazioni di coloro che, difendendo a spada tratta l'approccio relazionale, dimenticavano lungo la strada le esigenze delle applicazioni. Insomma, l'intuito e l'esperienza mi fanno sospettare che la meta è ancora lontana e forse un approccio ibrido non è da sottovalutare. La differenza tra i tre livelli fisico,concettuale,vista può essere meglio compresa facendo un'analogia con i linguaggi di programmazione. In TurboPascal le dichiarazioni: const N = 100; type nomi = string[30]; data = string[6]; qualifiche = (operaio,impiegato,dirigente); persona=record cognome,nome:nomi; qualifica : qualifiche; data_nascita : data end; var Elenco : array[1..N] of persona; permettono di modellare a livello concettuale un elenco di persone, senza preoccuparsi di conoscere il formato interno di rappresentazione. A livello fisico, ovvero in Introduzione ai DBMS pag. 53 memoria principale, la dichiarazione porta come effetto l'allocazione di una struttura di 100 blocchi di byte consecutivi, ciascuno lungo 70 byte. L'indirizzo fisico calcolato come: di un elemento Elenco[i] verrà base + (i-1)*70 essendo base l'indirizzo in cui è stato allocato il primo elemento dell'array Elenco. Il programmatore fa semplicemente uso del nome simbolico Elenco[i], ad esempio può scrivere Elenco[i].qualifica:=impiegato per assegnare la qualifica di impiegato alla persona iesima dell'elenco,ignorando i dettagli del livello fisico. Una vista sull'array Elenco potrebbe essere dichiarando una funzione, ad esempio: definita function ContaImpiegati(m:integer):integer; var Conta:integer; i:integer; begin Conta:=0; for i:=1 to m do if Elenco[i].qualifica = impiegato then Conta:=succ(Conta); ContaImpiegati := Conta end; per calcolare quante persone tra le prime m in Elenco hanno la qualifica di impiegato. Introduzione ai DBMS pag. 54 In tal modo la chiamata della funzione realizza una visione diversa dell'array, come procedimento di calcolo di una quantità relativa solo ai primi m elementi di Elenco che godono di una certa proprietà. Alcuni sistemi consentono anche la materializzazione delle viste. Il problema dell'aggiornamento delle viste in virtù di modifiche apportate allo schema del database è normalmente compito del progettista ma in alcuni sistemi può essere parzialmente facilitato da strumenti automatici. Il livello esterno si riferisce al modo in cui le varie classi di utente percepiscono la base di dati: ad uno stesso schema concettuale (o ad uno stesso schema logico) possono corrispondere diverse viste esterne. Introduzione ai DBMS pag. 55 Ad esempio, con riferimento a database relazionali, allo scopo di differenziare questi due tipi di rappresentazione, se per il progetto di un database si è fatto uso di schemi basati sul modello EntityRelationship :E/R, si è soliti usare il termine schema concettuale per quest'ultimi ed il termine logical schema per gli schemi basati sul modello dei dati relazionale e derivati dagli schemi E/R. In altre parole lo schema logico coincide con lo schema concettuale che sarà poi disponibile effettivamente all'utente, in quanto i meccanismi di interrogazione sono fondati sul modello dei dati adottato dal DBMS e non sul modello concettuale impiegato per il progetto. Introduzione ai DBMS pag. 56 Modello ad oggetti Idoneo per applicazioni a carattere multimediale: GIS, CAD/CAM, CAE, CASE,CIM, OA, ES,DSS, ... concetti di base: oggetti, oggetti complessi , separazione tra interfaccia e stato (incapsulazione), classi, ereditarietà 6th Avenue 7th Avenue Road name:String; road type: {road, avenue, boulevard, lane, ...} segment list :sequence of Road segment| Intersection Road Segment in road:Road; shape of segment:Arc|Line start: Intersection end:Intersection direction:{one-way-SE, one-way-ES,two-way} address range:{Street Number,Street Number} odd side:{left,right} Intersection incoming roads:Set of Road Segment position:Coordinate Introduzione ai DBMS pag. 57