IL LIVELLO LOGICO – Introduzione all’algebra relazionale Lezione di BASI DI DATI I del 16/10/2009 – PRIMA PARTE Come visto nelle lezioni precedenti, la progettazione di un database avviene su tre livelli denominati LIVELLO CONCETTUALE, LIVELLO LOGICO e LIVELLO FISICO. Per ogni livello si costruisce un MODELLO che contiene le informazioni da rappresentare e che è rivolto agli attori che partecipa alla progettazione. Nello specifico, si ha che il MODELLO CONCETTUALE, data la sua essenza molto “vicina all’utente”, è rivolto al COMMITTENTE, il MODELLO LOGICO è rivolto agli IMPLEMENTATORI e, infine, il MODELLO FISICO è una RAPPRESENTAZIONE 1:1 della realizzazione finale. Il Diagramma E/R (Entità/Relazioni) è una prima rappresentazione del livello concettuale e permette di disegnare in maniera semplice delle strutture dati anche molto complesse, come ad esempio quelle ricorsive (che permettono di rappresentare semplicemente costrutti come la SEQUENZA, l’ALBERO e la FORESTA, che con un linguaggio di programmazione richiederebbero molte righe di codice). La rappresentazione del livello logico, invece, si basa su una teoria nota come ALGEBRA RELAZIONALE; tale tipo di algebra permette di definire delle “espressioni” che vanno a rappresentare le INTERROGAZIONI che è possibile effettuare su un database, ossia le operazioni che consentono di estrarre da un database determinate informazioni di interesse e che vanno poi tradotte in SQL, il linguaggio di programmazione che opera sui database. Innanzitutto, secondo la teoria dell’algebra relazionale, un database è un insieme di RELAZIONI e VINCOLI, e si può rappresentare formalmente come: DB = {R,V} Una RELAZIONE può essere pensata in prima istanza come una tabella le cui righe non sono ordinate, o insieme non ordinato di tuple, dove ogni tupla è una riga della tabella. Ogni elemento della tabella prende il nome di ATTRIBUTO. Per esempio, la relazione "Studente" si può rappresentare come: STUDENTE SSN Nome Cognome Indirizzo Questa rappresentazione si chiama “INTENSIONALE”, ed è in contrapposizione alla cosiddetta forma “tabellare estesa” che è invece una rappresentazione “ESTENSIONALE”. STUDENTE SSN 123 456 … Nome Franco Mario … Cognome Quarta Rossi … Indirizzo Piazza Mazzini, 13 Piazza S. Oronzo, 23 … Nel modello relazionale ogni attributo è definito su un DOMINIO; per esempio il dominio di definizione dell’attributo “Nome” è l’insieme di tutti i nomi validi nel contesto all’interno del quale il database deve operare. Il dominio si può rappresentare formalmente come: dom(NOME) = {Insieme dei nomi validi nel CONTESTO in cui bisogna operare} Tale insieme è di dimensione FINITA e a valori DISCRETI, come ogni oggetto rappresentabile nella TEORIA DELL’INFORMAZIONE. In corrispondenza ad ogni dominio vengono anche definiti un DATA-TYPE e un DATA-FORMAT, che rappresentano rispettivamente il concetto di “tipo di dato” (Intero, Stringa, Data, ecc) e la validità sintattica del dominio: ad esempio il CODICE FISCALE è stringa (a livello di DATA TYPE) e deve avere la forma “LLLLLLNNLNNLNNNL” dove “L” indica una lettera e “N” un numero (quest’ultimo è il suo DATA-FORMAT). In generale il dominio, il data-type e il data-format definiscono completamente l’insieme dei valori possibili per ogni attributo. Si passa quindi a definire l’insieme degli STATI VALIDI di un database (detto anche “INSIEME POTENZA”) che può essere rappresentato come il prodotto cartesiano dei domini di definizione di ogni attributo, ad esempio per lo studente si ha: INSIEME_POTENZA = {dom(SSN) X dom(NOME) X dom(COGNOME) X dom(INDIRIZZO)} Per avere un database ben formato, ogni riga valida della rappresentazione estensionale deve appartenere all’insieme potenza. L’insieme dei valori possibili per ogni attributo deve essere esteso con un valore speciale, chiamato “NULL”, che rappresenta una MANCANZA DI INFORMAZIONE in riferimento ad uno specifico attributo: tale mancanza può presentarsi per svariati motivi, da errori in fase di memorizzazione nel database ad omissione volontaria da parte dell’utente nella compilazione di moduli i cui dati finiscono quindi per essere riversati in forma elettronica nel database stesso. I valori “NULL” rappresentano un grosso problema all’interno della teoria delle Basi Di Dati, poiché la loro presenza può dare luogo ad incoerenze logiche nei risultati delle interrogazioni e devono quindi essere opportunamente gestiti. Il concetto di valore “NULL” permette a sua volta di introdurre il concetto di VINCOLO: un vincolo è una condizione che il database deve soddisfare per essere corretto formalmente e ben definito. Si passa quindi ad elencare un insieme di vincoli (“CONSTRAINTS”) che ogni database deve soddisfare: 1) RELATION INTEGRITY – “PRIMARY KEY IS NOT NULL” Qualsiasi attributo di un database può assumere valore NULL, ma non la chiave primaria. 2) PRIMARY KEY - “PRIMARY KEY MUST BE UNIQUE AND NOT NULL” Il concetto di chiave primaria stesso è a sua volta un vincolo: considerando una relazione R = {A1,A2,…,An} si definisce una SUPER-KEY (“superchiave”) come l’insieme di tutti gli attributi che identificano univocamente ogni tupla. In generale, all’interno di una relazione, esistono molte superchiavi, ad esempio l’insieme stesso di tutti gli attributi (una singola riga) è una superchiave; alcune di queste superchiavi sono caratterizzate dal fatto di essere MINIMALI, cioè sono tali che non è possibile togliere un attributo e mantenere la condizione di chiave (cioè l’univocità). Siccome in una relazione è possibile avere più chiavi, bisogna introdurre il concetto di CANDIDATE KEY (“chiave candidata”), cioè le chiavi minimali fra le quali bisogna scegliere una e una sola chiave primaria. Ad esempio, si può considerare la relazione “CAR” e l’insieme delle sue superchiavi e chiavi minimali: CAR Targa Num. Telaio Cilindrata Tipo Marca SUPERKEY SUPERKEY MINIMAL KEY <=> CANDIDATE KEY Adottando la simbologia insiemistica si ha che: SUPERKEY כMINIMAL KEY = CANDIDATE KEY In generale risulta che il vincolo di “Chiave Primaria” è più forte del vincolo di “Relation Integrity”. 3) EXTERNAL KEY – REFERENTIAL INTEGRITY Avendo nel modello concettuale un tipo di relazione R, si dice che Ri è una coppia (aj,bk) e la relazione R è l’insieme delle istanze Ri della relazione. Questo insieme può esistere solamente a condizione che esistano sia aj che bk e si può fare l’esempio “STUDENTEFREQUENTA-FACOLTA’”: STUDENTE SSN Nome Cognome Indirizzo FACOLTA’ Nome Indirizzo FREQUENTA SSN_Studente NOME_Facoltà STUDENTE FREQUENTA FACOLTA’ Si definisce quindi il concetto di “FOREIGN KEY” (“chiave esterna”) e “REFERENTIAL INTEGRITY” (“Integrità referenziale”) imponendo che la chiave esterna sia un riferimento valido alla chiave primaria di un tipo di entità. Nell’esempio di cui sopra, la relazione è correttamente definita se SSN_Studente e NOME_Facoltà fanno riferimento a studenti e facoltà esistenti all’interno del database. Più in generale, date due relazioni A e B, si dice che si ha un vincolo di integrità referenziale su un attributo chiave esterna (FK) di una relazione poiché esso può assumere soltanto valori permessi ed esistenti per una chiave primaria di un’altra relazione. Quindi FK può assumere tutti e soli valori assunti da attributo A1 della relazione A; schematicamente si può rappresentare la condizione di integrità referenziale come: A A1 A2 … An B B1 B2 … Bk FK 4) SEMANTIC CONSTRAINTS Si tratta di vincoli SEMANTICI, che in contrapposizione ai vincoli SINTATTICI già visti, hanno a che fare con il significato di ciò che è contenuto nel database. Tali vincoli si dividono in due categorie: DI STATO Siccome i database sono delle macchine a stati, si ha che la macchina può passare da uno stato valido all’altro solo attraverso delle transizioni valide. I vincoli sullo stato riguardano uno stato specifico (ad esempio: “non può esistere una facoltà con meno di 1000 iscritti”) e riguardano uno specifico istante della vita del database. DI TRANSIZIONE Un esempio di vincolo sulla transizione può essere: “Non è possibile creare una riga se non sono soddisfatte determinate condizioni sulle altre righe”. In generale, mentre i vincoli sintattici possono essere verificati direttamente dalla macchina, poiché riguardano la forma degli attributi o delle relazioni, i vincoli di stato e di transizione riguardano la semantica, ovvero il significato di attributi e relazioni, e per gestirli è necessario definire all’interno del DBMS dei TRIGGER, cioè dei gestori di eventi che attivano determinate procedure al verificarsi di particolari eventi e condizioni. DATABASE LIFECYCLE Il “CICLO DI VITA” di un database è legato al ciclo di vita delle sue relazioni e dei suoi vincoli e di solito viene sintetizzato con l’acronimo CRUD, che comprende le iniziali delle quattro operazioni fondamentali che è possibile definire su un database: Create, Read, Update, Delete. Si ha quindi che, mentre i vincoli sono definiti staticamente, le relazioni possono evolvere nel tempo a seconda dell’esecuzione delle operazioni appena elencate: può succedere quindi che effettuando una operazione questa porti a delle violazioni dei vincoli sulla forma e il significato dei dati del database. Le possibili violazioni dovute ad ogni operazione possono essere riassunte in uno schema del tipo: OPERAZIONI Create Read Update (Delete/Create) SI’ NO NO SI’ NO SI’ NO NO SI’ NO SI’ NO SI’ SI’ SI’ SI’ NO SI’ SI’ SI’ VINCOLI RELATION INTEGRITY UNIQUE PRIMARY KEY REFERENTIAL INTEGRITY SEMANTIC CONSTRAINTS Delete In generale, quando effettua una qualsiasi operazione, il DBMS deve avvertire l’utente ed evitare la violazione dei vincoli. Un caso particolare è quello dell’operazione di UPDATE, che può essere vista come la sequenza di un’operazione di cancellazione e di un inserimento, e che quindi deve essere gestita come la somma di tali operazioni per ciò che concerne il rispetto dei vincoli. Per quanto riguarda il vincolo di “Integrità referenziale”, si hanno tre possibili modi di gestire le situazioni di cancellazione: CASCADE – Cancellando un oggetto vengono cancellati automaticamente anche gli oggetti ad esso collegati. REJECT – Prima di poter cancellare un oggetto è necessario cancellare gli oggetti collegati, altrimenti la cancellazione non può avvenire. CHANGE – Quando viene cancellato un oggetto, gli oggetti ad esso collegati sono assegnati ad un oggetto impostato di default. Le violazioni dei vincoli semantici, invece si gestiscono come già detto attraverso l’impostazione di determinati Trigger. Autore: MANCO MASSIMO ([email protected])