IL MODELLO RELAZIONALE E i vincoli per le basi di dati relazionali 2 La storia Introdotto nel 1970 da E. F. Ted Codd http://en.wikipedia.org/wiki/edgar_f._codd (centro ricerche IBM) Codd, E.F. (1970). "A Relational Model of Data for Large Shared Data Banks, http://www.seas.upenn.edu/~zives/03f/cis550/codd.pdf Il modello usa il concetto di relazione matematica come suo componente elementare e ha il suo fondamento teorico nella teoria degli insiemi e nella logica dei predicati del primo ordine.
3 Le basi Il modello relazionale rappresenta la base di dati come una collezione di relazioni Pensiamo a una relazione come a una tabella di valori: ogni riga della tabella rappresenta una collezione di dati collegati. Una riga rappresenta un fatto che tipicamente corrisponde ad un entità o a un associazione del modello reale. 4 Un esempio
5 I termini giusti Una riga è detta tupla Un intestazione di colonna è detta attributo La tabella è detta relazione Il tipo di dati che descrive i tipi di valori che possono apparire in ogni colonna è rappresentato da un dominio di possibili valori 6 Dominio (1) Un dominio D è un insieme di valori atomici. Per atomici si intende che ogni valore nel dominio è indivisibile, per lo meno per quanto riguarda il modello relazionale. Bisogna specificare un nome per il dominio. Un metodo comune per indicare un dominio consiste nello specificare un tipo di dati, da cui sono tratti i valori dei dati che formano il dominio. Esempio: Nomi: l insieme delle stringhe di caratteri che rappresentano i nomi di persona. Età_impiegati: possibili età degli impiegati di un azienda; ogni età deve avere un valore compreso tra 15 e 80 anni. Nomi_dipartimenti_universitari: l insieme dei nomi dei dipartimenti universitari in un università (ad esempio: informatica, ingegneria )
7 Dominio (2) Per ogni dominio viene anche specificato un tipo di dati o formato. Esempio: Il tipo di dati di Nomi_dipartimenti_universitari è l insieme di tutte le stringhe di caratteri che rappresentano nomi validi di dipartimenti; Il tipo di dati di Età_impiegati è un numero intero compreso tra 15 e 80 8 Lo schema Uno schema di relazione R è indicato con R(A 1, A 2,, A n ), dove: R è il nome della relazione A 1, A 2,, A n è l elenco di attributi Ogni attributo A i fornisce il nome del ruolo interpretato da un certo dominio D nello schema di relazione R. D è detto dominio di A i ed è indicato con dom(a i ) Il grado (o arità) di una relazione è il numero n di attributi presenti nel suo schema di relazione.
9 Lo schema, un esempio STUDENTE(Nome, SSN, Telefono_di_casa, Indirizzo, Telefono_ufficio, Età, MV) oppure STUDENTE(Nome: string, SSN: string, Telefono_di_casa: string, Indirizzo: string, Telefono_ufficio: string, Età: integer, MV: real) dom(nome) = Nomi dom(ssn) = Numeri_previdenza_sociale 10 Relazione Una relazione (o stato di relazione) r dello schema di relazione R(A 1, A 2,, A n ) è indicato anche con r(r) ed è un insieme di n-tuple, r = {t 1, t 2,, t m } Ogni n-tupla t è un elenco ordinato di n valori t = < v 1, v 2,, v n > dove ogni valore v i con 1 i n è un elemento di dom(a i ) oppure è uno speciale valore null Il valore i-esimo nella tupla t, che corrisponde all attributi A i, è indicato con t[a i ] o t[i]
11 Esempio STUDENTE 12 Definizione formale Una relazione (o stato di relazione) r(r) è una relazione matematica di grado n sui domini dom(a 1 ), dom(a 2 ),, dom(a n ), cioè un sottinsieme del prodotto cartesiano dei domini che definiscono R: r(r) (dom(a 1 ) x dom(a 2 ) x x dom(a n ))
1. Ordinamento delle tuple di una relazione Dal punto di vista logico non c è alcuna preferenza per un ordinamento rispetto ad un altro (per definizione gli elementi di un insieme matematico non hanno ordine). Dal punto di vista fisico un ordine c è necessariamente (c è una riga prima/dopo un altra). 13 2. Ordinamento dei valori all interno di una tupla Dalla definizione sono valori ordinati ma, a livello logico, l ordine degli attributi e dei loro valori non è importante basta che si mantenga corrispondenza tra attributi e valori. 14
15 3. Valori e valori null nelle tuple Ogni valore nella tupla è un valore atomico, cioè non divisibile in parti componenti usando la struttura del modello relazionale di base. Non sono consentiti attributi composti e/o multivalore. I valori nulli vengono utilizzati per rappresentare i valori di attributi sconosciuti o non applicabili a una certa tupla. 4. Interpretazione (significato) di una relazione Lo schema di relazione può essere interpretato come una dichiarazione, ossia un tipo di asserzione. Ogni tupla nella relazione può perciò essere interpretata come un fatto o una particolare istanza dell asserzione. Le relazioni possono rappresentare: fatti su entità fatti su associazioni 16
17 Vincoli del modello relazionale In una base di dati ci sono generalmente molte relazioni e le tuple in esse contenute sono di solito collegate in vari modi. Lo stato dell intera base di dati corrisponde agli stati di tutte le sue relazioni in un particolare momento. Ci sono molti vincoli sui valori effettivi che caratterizzano uno stato della base di dati: 1. Vincoli intrinseci basati sul modello 2. Vincoli basati sullo schema 3. Vincoli basati sull applicazione 18 1. Vincoli intrinseci basati sul modello Sono vincoli intrinseci del modello dei dati Esempio: Il vincolo che una relazione non può avere tuple duplicate è un vincolo intrinseco.
19 2. Vincoli basati sullo schema Sono vincoli che possono essere espressi direttamente sugli schemi del modello dei dati specificandoli di solito nel linguaggio DDL Sono questi: a. Vincoli di dominio b. Vincoli di chiave e vincoli sui valori nulli c. Vincoli di integrità delle entità d. Vincoli di integrità referenziale 20 3. Vincoli basati sull applicazione Sono vincoli più generali e in genere non possono essere espressi direttamente negli schemi del modello dei dati Devono essere specificati e realizzati dai programmi applicativi Sono detti anche vincoli di integrità semantici o regole di business
21 2.a. Vincoli di dominio Stabiliscono che all interno di ciascuna tupla il valore di ogni attributo A deve essere un valore atomico del dominio dom(a). Ad ogni dominio è associato un tipo di dati. 2.b. Vincoli di chiave e vincoli sui valori nulli Abbiamo detto che: Una relazione è definita come un insieme di tuple [quindi] Tutti gli elementi di un insieme sono distinti per definizione [quindi] Le tuple di una relazione devono essere distinte [quindi] Nessuna coppia di tuple può assumere la stessa combinazione di valori per tutti gli attributi Di solito ci sono altri sottinsiemi di attributi di uno schema di relazione R con la proprietà che nessuna coppia di tuple in un qualsiasi stato di relazione r di R possa avere la stessa combinazione di valori per questi attributi. 22
2.b. Vincoli di chiave e vincoli sui valori nulli: la superchiave Denotiamo superchiave SK il sottinsieme di attributi per cui ogni coppia di tuple distinte, t 1 e t 2 : t 1 [SK] t 2 [SK] in uno stato di relazione r di R. Una superchiave definisce un vincolo di univocità secondo il quale nessuna coppia di tuple distinte in un stato r di R può avere lo stesso valore per SK. Ogni relazione ha almeno una superchiave di default: l insieme di tutti i suoi attributi. Una superchiave può avere attributi ridondanti 23 Quindi definiamo la chiave 2.b. Vincoli di chiave e vincoli sui valori nulli: la chiave Una chiave K di uno schema di relazione R è una superchiave di R, con la proprietà aggiuntiva che la rimozione di qualsiasi attributo A da K porta ad un insieme di attributi K che non è più una superchiave di R. Una chiave soddisfa quindi: 1. Due tuple distinte in qualsiasi stato della relazione non possono avere valori uguali per (tutti) gli attributi nella chiave [questo vale anche per le superchiavi] 2. Si tratta di una superchiave minimale, cioè una superchiave da cui non è possibile rimuovere alcun attributo mantenendo ancora valido il vincolo di univocità di 1. [questo non è richiesto alle superchiavi] 24
25 Esempio di chiave (1) In generale una superchiave formata da un solo attributo è anche chiave Una chiave formata da più attributi richiede che la proprietà di univocità sia verificata su tutti i suoi attributi 26 Chiavi candidate In generale uno schema di relazione ha più di una chiave. Ogni chiave è detta chiave candidata E comune indicare una delle chiavi candidate come la chiave primaria della relazione (i cui valori sono usati per identificare le tuple nella relazione)
27 Notazioni per uno schema di basi di dati Una base di dati in genere contiene molte relazioni, con tuple collegate tra loro S = {R 1, R 2,, R m }, schema di base di dati relazionale, è costituito da un insieme di relazioni e da un insieme di vincoli di integrità IC. DB = {r 1, r 2,, r m } di S, stato di base di dati relazionale, è un insieme di stati di relazione tali che ogni r i sia uno stato di R i e che gli stati di relazione r i soddisfino i vincoli specificati in IC. 28 Esempio di schema di base di dati
Stato di una base di dati 29 30 Stato di una base di dati [ZOOM a]
31 Stato di una base di dati [ZOOM b] 32 Attenzione ai nomi Attributi che rappresentano lo stesso concetto del mini-mondo possono avere o NON AVERE nomi uguali in relazioni diverse Inoltre attributi che rappresentano concetti diversi possono avere lo stesso nome in relazioni diverse
33 2.c. Vincoli di integrità delle entità Il vincolo di integrità delle entità stabilisce che nessuno dei valori della chiave primaria può essere nullo. Altrimenti come le distinguo? 34 2.d. Vincoli di integrità referenziale Il vincolo di integrità referenziale: è specificato tra due relazioni è usato per mantenere la consistenza fra tuple delle due relazioni Informalmente stabilisce che una tupla in una relazione che fa riferimento a un altra relazione deve far riferimento a una tupla esistente in quella relazione. Esempio: L attributo N_D di IMPIEGATO fornisce il numero del dipartimento per il quale ogni impiegato lavora; perciò il suo valore in ogni tupla di IMPIEGATO deve accordarsi con il valore di NUMERO_D di una qualche tupla nella relazione DIPARTIMENTO
2.d. Vincoli di integrità referenziale: la chiave esterna (1) Un insieme di attributi FK (foreign key) nello schema di relazione R 1, è una chiave esterna di R 1 che riferisce la relazione R 2 se soddisfa: gli attributi presenti in FK hanno gli stessi domini degli attributi di chiave primaria PK (primary key) di R 2 ; si dice che gli attributi di FK riferiscono alla relazione R 2 un valore di FK in una tupla t 1 dello stato corrente r 1 (R 1 ) o è presente come valore di PK in una qualche tupla t 2 dello stato corrente r 2 (R 2 ) o è nullo. Nel primo caso si ha t 1 [FK] = t 2 [PK] e si dice che la tupla t 1 riferisce alla tupla t 2. 35 In questa definizione: R 1 è detta relazione referenziante R 2 è detta relazione riferita si dice che sussiste il vincolo di integrità referenziale da R 1 a R 2. 2.d. Vincoli di integrità referenziale: la chiave esterna (2) In questa definizione: R 1 è detta relazione referenziante R 2 è detta relazione riferita si dice che sussiste il vincolo di integrità referenziale da R 1 a R 2. 36 In una base di dati con molte relazioni ci sono generalmente molti vincoli di integrità referenziale. I vincoli di IR nascono generalmente dalle associazioni fra le entità presenti negli schemi di relazione.
2.d. Vincoli di integrità referenziale: la chiave esterna (3) Una chiave esterna può fare riferimento alla sua stessa relazione di appartenenza I vincoli di IR possono essere rappresentati come archi orientati da ciascuna chiave esterna verso la relazione che essa riferisce. La punta della freccia punta alla chiave primaria della relazione riferita. 37 Diagramma di schema con vincoli di integrità referenziale 38
39 3. Vincoli basati sull applicazione Sono vincoli di integrità semantica che devono essere specificati nella base di dati Possono essere implementati tramite linguaggi di specifica dei vincoli oppure tramite meccanismi detti trigger e asserzioni Possono essere di due tipi: vincoli di stato (definiscono lo stato valido) vincoli di transizione (legati alla gestione dei cambiamenti della base di dati). Esempio: [stato] lo stipendio di un impiegato non dovrebbe superare lo stipendio del supervisore dell impiegato [transizione] lo stipendio di un impiegato può solo aumentare 40 Operazioni sulle relazioni Due tipi di operazioni: Operazioni di reperimento (retrieval) Operazioni di aggiornamento (update) Operazioni di reperimento: un espressione dell algebra relazionale produce una nuova relazione applicando operatori algebrici a un insieme di relazioni Operazioni di aggiornamento Inserimento Cancellazione Modifica Ogni volta che si eseguono operazioni di aggiornamento bisogna fare attenzione a non violare i vincoli di integrità specificati sullo schema della base di dati relazionale
41 Operazioni di inserimento Sono usate per inserire nuove tuple in una relazione Fornisce un elenco di valori di attributi per una nuova tupla t che deve essere inserita in una relazione R. Può violare tutti e 4 i vincoli: a. Vincoli di dominio b. Vincoli di chiave e vincoli sui valori nulli c. Vincoli di integrità delle entità d. Vincoli di integrità referenziale 42 Esempi di inserimento 1. Inserisci < Cecilia, F, Kolonsky, NULL, 1960-04-05, 6357 Windy Lane, Katy, TX, F, 28000, NULL, 4> in IMPIEGATO. 2. Inserisci < Alicia, J, Zelaya, 999887777, 1960-04-05, 6357 Windy Lane, Katy, TX, F, 28000, 987654321, 4> in IMPIEGATO. 3. Inserisci < Cecilia, F, Kolonsky, 677678989, 1960-04-05, 6357 Windy Lane, Katy, TX, F, 28000, 987654321, 7> in IMPIEGATO. 4. Inserisci < Cecilia, F, Kolonsky, 677678989, 1960-04-05, 6357 Windy Lane, Katy, TX, F, 28000, NULL, 4> in IMPIEGATO.
43 Esempi di inserimento 1. Inserisci < Cecilia, F, Kolonsky, NULL, 1960-04-05, 6357 Windy Lane, Katy, TX, F, 28000, NULL, 4> in IMPIEGATO. [NO, viola vincolo di integrità dell entità] 2. Inserisci < Alicia, J, Zelaya, 999887777, 1960-04-05, 6357 Windy Lane, Katy, TX, F, 28000, 987654321, 4> in IMPIEGATO. [NO, viola il vincolo di chiave] 3. Inserisci < Cecilia, F, Kolonsky, 677678989, 1960-04-05, 6357 Windy Lane, Katy, TX, F, 28000, 987654321, 7> in IMPIEGATO. [NO, viola il vincolo di integrità referenziale] 4. Inserisci < Cecilia, F, Kolonsky, 677678989, 1960-04-05, 6357 Windy Lane, Katy, TX, F, 28000, NULL, 4> in IMPIEGATO. [OK!] 44 Operazioni di cancellazione Sono usate per cancellare tuple da una relazione Deve essere specificata una condizione sugli attributi della relazione per specificare le tuple da cancellare Può violare solo il vincolo di integrità referenziale. In caso di violazioni 3 operazioni possibili: Restrict rifiuta la cancellazione Cascade tenta di far ricadere in cascata la cancellazione Set null/set default modifica i valori degli attributi referenziati
45 Esempi di cancellazione 1. Cancella la tupla di LAVORA _SU con SSN_I = 999887777 e N_P = 10. 2. Cancella la tupla di IMPIEGATO con SSN = 999887777. 3. Cancella la tupla di IMPIEGATO con SSN = 333445555. 46 Esempi di cancellazione 1. Cancella la tupla di LAVORA _SU con SSN_I = 999887777 e N_P = 10. [OK!] 2. Cancella la tupla di IMPIEGATO con SSN = 999887777. [NO, ci sono tuple in LAVORA_SU che riferiscono] 3. Cancella la tupla di IMPIEGATO con SSN = 333445555. [NO, ci sono tuple in IMPIEGATO, DIPARTIMENTO, LAVORA_SU E PERSONA_A_CARICO che riferiscono]
47 Operazioni di modifica Sono usate per cambiare i valori di uno o più attributi di tuple presenti in una relazione Deve essere specificata una condizione sugli attributi della relazione per specificare le tuple da modificare In genere la modifica di un attributo che non è né una chiave primaria né una chiave esterna non dà luogo ad alcun problema. 48 Esempi di modifica 1. Modifica a 28000 lo STIPENDIO nella tupla di IMPIEGATO con SSN = 999887777. 2. Modifica a 1 N_D per la tupla IMPIEGATO con SSN = 999887777. 3. Modifica a 7 N_D per la tupla IMPIEGATO con SSN = 999887777. 4. Modifica a 987654321 il valore di SSN per tupla di IMPIEGATO con SSN = 999887777.
49 Esempi di modifica 1. Modifica a 28000 lo STIPENDIO nella tupla di IMPIEGATO con SSN = 999887777. [OK!] 2. Modifica a 1 N_D per la tupla IMPIEGATO con SSN = 999887777. [OK!] 3. Modifica a 7 N_D per la tupla IMPIEGATO con SSN = 999887777. [NO, viola l integrità referenziale] 4. Modifica a 987654321 il valore di SSN per tupla di IMPIEGATO con SSN = 999887777. [NO, viola il vincolo di chiave primaria] 50 Esercizio
51 Esercizio Si consideri lo schema di base di dati relazionale COMPAGNIA_AEREA, che descrive una base di dati per le informazioni relative ai voli di una compagnia aerea. Ogni VOLO è identificato da un NUMERO del volo ed è composto da una o più tratte (TRATTA_VOLO) con NUMERO_TRATTA 1, 2, 3 ecc. Ogni tratta ha i suoi orari di partenza e di arrivo previsti nonché gli aeroporti interessati, e presenta tante ISTANZE_DI_TRATTA quante sono le DATE in cui il volo è programmato. 52 Esercizio Per ogni volo, sono presenti diverse TARIFFE. Per ogni istanza di tratta sono memorizzate le prenotazioni dei posti (PRENOTAZIONE_POSTI), l AEROPLANO usato su quella tratta e gli orari effettivi di partenza e arrivo, nonché gli aeroporti effettivamente utilizzati. Un AEROPLANO è identificato da un ID_AEROPLANO e possiede uno specifico TIPO_AEROPLANO. PUO _ATTERRARE collega un TIPO_AEROPLANO con l AEROPORTO su cui un aeroplano di quel tipo può atterrare. Un AEROPORTO è identificato da un CODICE_AEROPORTO.
53 Esercizio Si consideri un aggiornamento della base di dati COMPAGNIA_AEREA che permetta di inserire una prenotazione per uno specifico volo o tratta di volo in una certa data. a. Si forniscano le operazioni relative a questo aggiornamento. b. Quali tipi di vincoli è opportuno controllare? c. Quali di questi vincoli sono vincoli di chiave, di integrità dell entità e di integrità referenziale, e quali non lo sono? d. Si specifichino tutti i vincoli di integrità referenziale della Figura 3.8. 54 Esercizio a. Si forniscano le operazioni relative a questo aggiornamento. Una possibile sequenza di operazioni di aggiornamento è la seguente: INSERISCI IN PRENOTAZIONE_POSTI; MODIFICA la tupla di ISTANZA_DI_TRATTA con la condizione: impostando NUMERO_DI_POSTI_DISPONIBILI = NUMERO_DI_POSTI_DISPONIBILI 1; Queste operazioni devono essere ripetute per ogni TRATTA di volo sulla quale è eseguita la prenotazione. Si assume che la prenotazione valga per un unico posto. Per realizzare un sistema più realistico in cui sia possibile riservare più di un posto con un unica prenotazione sono necessarie operazioni più complesse.
55 Esercizio b. Quali tipi di vincoli è opportuno controllare? Dobbiamo verificare che il NUMERO_DI_POSTI_DISPONIBILI su ciascuna INSTANZA_DI_TRATTA prenotata sia maggiore di 1 prima di eseguire la prenotazione (a meno che sia consentito l overbooking) e che il NUMERO_POSTO riservato in PRENOTAZIONE_POSTI sia disponibile. 56 Esercizio c. Quali di questi vincoli sono vincoli di chiave, di integrità dell entità e di integrità referenziale, e quali non lo sono? L operazione di INSERIMENTO in PRENOTAZIONE_POSTI dovrà verificare tutti i vincoli di chiave, integrità dell entità e integrità referenziale della relazione. La verifica che il NUMERO_DI_POSTI_DISPONIBILI su ciascuna ISTANZA_DI_TRATTA prenotata sia maggiore di 1 non ricade in nessuna delle precedenti tipologie di vincolo (si tratta di un generico vincolo di integrità semantica).
57 Esercizio d. Si specifichino tutti i vincoli di integrità referenziale della Figura 3.8. Scriveremo un vincolo di integrità referenziale nella forma R.A --> S (rispettivamente, R.(X) --> T) per denotare che un attributo A (rispettivamente, un insieme di attributi X) della relazione R costituisce una chiave esterna che referenzia la chiave primaria della relazione S (rispettivamente T). TRATTA_VOLO.NUMERO_VOLO --> VOLO TRATTA_VOLO.CODICE_AEROPORTO_PARTENZA --> AEROPORTO TRATTA_VOLO. CODICE_AEROPORTO_ARRIVO --> AEROPORTO ISTANZA_DI_TRATTA.(NUMERO_VOLO, NUMERO_TRATTA) --> TRATTA_VOLO ISTANZA_DI_TRATTA.CODICE_AEROPORTO_PARTENZA --> AEROPORTO ISTANZA_DI_TRATTA. CODICE_AEROPORTO_ARRIVO --> AEROPORTO ISTANZA_DI_TRATTA.ID_AEROPLANO --> AEROPLANO TARIFFE.NUMERO_VOLO --> VOLO PUO _ATTERRARE.NOME_TIPO_AEROPLANO --> TIPO_AEROPLANO PUO _ATTERRARE.CODICE_AEROPORTO --> AEROPORTO AEROPLANO.TIPO_AEROPLANO --> TIPO_AEROPLANO PRENOTAZIONE_POSTI.(NUMERO_VOLO, NUMERO_TRATTA, DATA) --> ISTANZA_DI_TRATTA