Informatica
Un sistema informativo è l’insieme di persone, strutture, regole e procedure
necessarie alla gestione dei dati automatica. La parte incentrata sulla
memorizzazione e sulla gestione dei dati e’ chiamata invece sistema
informatico. Un dato è un’informazione non priva di significato che può essere
memorizzata mentre un database e’ un insieme di dati strutturato.
Esistono diversi modi per archiviare dati, e questi sono:
● database statici, ovvero le variabili, che sono semplici da usare ma
dipendenti dal software.
● file, che sono strutturabili ma hanno problemi di concorrenza e
accessibilità.
I file vengono memorizzati su un disco fisso in modo da averli memorizzati
permanentemente in memoria di massa, il problema dei file è che non
permettono un accesso differenziato a seconda dell’utente, infatti si può
leggere, scrivere e fare quello che si vuole. I database nascono come
meccanismo per avere le informazioni memorizzate in maniera organica,
le informazioni sono sempre memorizzate sui file ma sono strutturate e i file
non vengono gestiti direttamente dal programmatore.
L’interazione con i DBMS avviene tramite il linguaggio SQL, una famiglia di 4
linguaggi, che si divide in:
● DDL, Data Definition Language, che si occupa della definizione della
struttura dei dati;
● DML, Data Manipulation Language, che si occupa di manipolare i dati;
● QL, Query Language, serve a prelevare i dati tramite interrogazione del
database;
● DCL, Data Control Language, permette di gestire i permessi.
DBMS
Un DBMS, acronimo di DataBase Management System, è un insieme di
hardware e software usati per la gestione dei database.
I DBMS sono stati introdotti per permettere di affidare la gestione di uno o più
database a un'unica interfaccia, ovvero i DBMS che si occupano di gestire i
dati e di garantire diverse proprietà come l’integrità e la sicurezza dei dati
autonomamente.
I compiti del DBMS sono:
● facilitare il recupero dei dati tramite indici che permettono la lettura di
una parte soltanto dei database, garantendo una maggiore efficienza
per la manipolazione dei dati;
● garantisce l’indipendenza dalla struttura logica e fisica;
● gestire la ridondanza e l’inconsistenza dei dati, ossia la presenza di
informazioni ripetute;
● permettere l’accesso a più utenti, in quanto i dati di un database
possono essere usati da più utenti con i loro programmi, consentendo
anche una visione solo parziale del database da parte di un singolo
utente, che può rimanere estraneo al resto dei dati contenuti nel
database;
● gestire la concorrenza, in quanto più utenti possono dover accedere a
dati del database nello stesso momento;
● gestire la sicurezza dei dati, ovvero impedire che il database venga
danneggiato da interventi accidentali o non autorizzati;
● gestire le transazioni, grazie ai DBMS infatti viene garantita la proprietà
Durability, ovvero dopo che i dati sono stati committati restano
permanenti, pur in caso di fallimento del sistema, fino a che non
vengono modificati da un'altra transazione.
Inoltre il DBMS deve essere in grado di:
● permettere la creazione di una nuova base dati, definendo gli archivi,
l’articolazione, le correlazioni logiche tra archivi, i limiti di accesso ai
dati e i permessi di modifica di questi ultimi. Questo viene fatto tramite il
DDL;
● facilitare gli utenti nel inserimento, modifica e cancellazione dei dati,
viene fatto tramite DML;
● rendere possibile l’estrazione delle informazioni del database,
interrogando la base dati, tramite QL;
● effettuare il tutto tramite un linguaggio semplice e standardizzato,
ovvero l’SQL.
Bisogna garantire inoltre la consistenza degli archivi, ovvero i dati devono
essere significativi e utilizzabili.
La descrizione dei dati è formata da metadati, cioè dati che descrivono i dati,
e prende il nome di dizionario dei dati o di catalogo dei dati.
Il dizionario dei dati viene memorizzato direttamente nel database
dimostrando l’indipendenza logica di quest’ultimo dai programmi.
Il DBMS attingendo a queste informazioni può:
● realizzare controlli per garantire l’integrità dei dati;
● autorizzare gli utenti all’accesso ai dati in base alle politiche di accesso
definite;
● fornire servizi per il controllo della consistenza.
Modello concettuale
Il modello concettuale viene definito attraverso lo schema dei dati, cioè una
rappresentazione sintetica 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;
La progettazione di un database si suddivide in:
● livello concettuale, rappresenta la realtà dei dati e le associazioni tra di
essi.
● livello logico, rappresenta il modo attraverso il quale i dati sono
organizzati negli archivi, quindi composizione e formato.
● livello fisico, rappresenta l’effettiva installazione degli archivi su disco.
Un modello concettuale deve essere:
● corretto, deve rispettare le regole di grammatica.
● completo, la realtà in analisi deve essere completamente modulata.
● chiaro, deve essere comprensibile.
● scalabile.
● indipendente dalle infrastrutture, non deve dipendere né dal modello
logico né dal modello fisico né dai software.
E inoltre gli attributi devono essere atomici, ovvero non più scomponibili,
tuttavia esistono attributi che possono essere lasciati non atomici come data
e indirizzi.
Entità
Le entità sono oggetti, concreti o astratti, che hanno significato se presi
singolarmente. Le entità possono essere descritte da attributi.
Le entità possono essere definite deboli quando hanno bisogno di attributi
esterni per essere identificate.
Due entità possono essere collegate da più associazioni in quanto le entità
possono assumere anche più ruoli.
Associazioni
Le associazioni sono corrispondenze o interazioni tra istanze di entità distinte
o tra le istanze di una stessa entità. Come le entità, anche le associazioni
possono essere descritte da attributi. A differenza delle entità, le associazioni
non hanno identificatori.
Le associazioni hanno un grado che indica il numero di entità che
partecipano all'associazione.
La molteplicità di un'associazione indica il numero di possibili istanze di
un'entità che viene messo in corrispondenza con una o più istanze dell’altra
entità che partecipa all’associazione. Troviamo un numero minimo,
solitamente 0(la partecipazione è facoltativa) o 1(la partecipazione è
obbligatoria) e un numero massimo, solitamente 1 o n, che definisce la
cardinalità.
Le associazioni si classificano in:
● uno a uno, quando ogni istanza di un'entità è in associazione con al
massimo un istanza dell’altra entità in associazione e viceversa.
● uno a molti, quando ogni istanza è in associazione con una o più
istanze dell’altra entità, ma le istanze della seconda entità sono in
associazione con al massimo un istanza della prima entità.
● molti a molti, non ci sono vincoli sulle cardinalità e quindi un istanza di
un'entità può essere in associazione con più istanze dell’altra entità e
viceversa.
Le associazioni possono anche essere ricorsive, ovvero associazioni tra
un'entità e se stessa.
Attributi
Gli attributi sono informazioni relative alle entità e alle associazioni.
Le caratteristiche degli attributi sono:
● formato, ovvero il tipo di valore che assume.
● dimensione, quantità massima dei caratteri o cifre inseribili.
● opzionalità, ovvero la possibilità o meno di non essere sempre
valorizzato
L’insieme dei possibili valori assunti da un attributo si chiama dominio.
Gli attributi possono essere identificatori, questi ultimi sono degli attributi o
un insieme di essi che permettono di identificare in modo univoco le istanze di
un entità.
In caso di entità deboli o di entità con identificatori troppo grandi si
aggiungono gli attributi virtuali, ovvero attributi che nella realtà non hanno
significato ma a livello concettuale permette di identificare in modo univoco
un istanza di un'entità.
Gli attributi possono essere soggetti a dei vincoli.
Vincoli
I vincoli sono delle restrizioni ai valori che possono assumere gli attributi.
Si suddividono in:
● statici, non variano nel tempo e per questo non necessitano di controlli
periodici. Si classificano in:
○ correttezza, chiamati anche di formato, servono per vedere se
l’informazione è corretta dal punto di vista del formato.
○ elenco, il valore deve appartenere a un elenco.
○ valore, condizione posta al valore di un attributo.
● dinamici, cambiano nel tempo e per questo vengono controllati
periodicamente.
Relazioni gerarchiche
Le relazioni gerarchiche prevedono che un entità figlia erediti gli attributi e gli
identificatori della entità madre.
Si classificano in:
● totale, ad ogni istanza di A, corrisponde almeno un'istanza nelle entità
figlie.
● parziale, ad ogni istanza di A può corrispondere o meno una o più
istanze delle entità figlie.
● esclusiva, ogni istanza di A corrisponde al massimo a un'istanza di una
sola entità figlia oppure a nessuna.
● sovrapposta, ogni istanza di A può corrispondere o meno a una o più
istanze delle entità figlie.
Modello logico
Si parla di modello relazionale dei dati che viene visto come un insieme di
relazioni sulle quali possono essere eseguite opportune operazioni, si dice
relazionale perché basato sul concetto matematico delle relazioni tra insiemi
di oggetti.
Gli attributi nel modello logico sono insiemi non vuoti e sono rappresentati
come: A1, …, An.
Gli schemi di relazione sono degli insiemi di attributi e vengono indicati con:
x = {A1, …, An}.
Una relazione su uno schema x è il sottoinsieme del prodotto cartesiano degli
attributi ed è indicata con: r(x).
Il prodotto cartesiano tra due insiemi A e B è l’insieme delle coppie (x, y) dove x
appartiene ad A e y appartiene a B.
Il grado di una relazione indica il numero di attributi della relazione.
La cardinalità di una relazione indica il numero di elementi di un insieme,
chiamati anche tuple.
L’insieme di valori che possono essere assunti da un attributo si chiama
dominio.
Una chiave primaria è un attributo o un insieme di attributi che determina
univocamente una tupla di una relazione. Le chiavi primarie devono essere
minimali.
I requisiti fondamentali di un modello relazionale sono:
● tutte le tuple di una tabella devono avere lo stesso numero di colonne;
● gli attributi devono rappresentare informazioni elementari o atomiche,
ovvero che non sono più scomponibili;
● i valori assunti in un campo devono essere dello stesso tipo, ovvero
omogenei;
● non possono esserci due o più tuple uguali in quanto ci deve essere
una chiave primaria univoca per ogni singola tupla;
● l’ordine delle tuple non è prefissato.
Regole di derivazione
Le regole di derivazione sono:
● ogni entità corrisponde a una relazione;
● ogni attributo di un entità viene derivato in un attributo della relazione
corrispondente;
● ogni attributo di una relazione deriva le caratteristiche dell’attributo da
cui deriva;
● ogni identificatore viene derivato in una chiave primaria;
● K è una chiave esterna da r(x) verso s(y) se è un insieme non vuoto di
attributi di x che è chiave primaria per s(y);
● un associazione 1:1 viene derivata in una relazione contenente gli
attributi delle entità in associazione e gli attributi dell’associazione. La
chiave primaria è composta dai valori degli identificatori delle entità in
associazione. Attenzione può non essere minimale;
● un associazione 1:n viene derivata in due relazioni rA e rB con gli attributi
di A e B rispettivamente. Le chiavi primari di rA e rB sono gli identificatori
di A e B. Si aggiunge a rB la chiave primaria di rA. Questo attributo
guadagna la proprietà di essere chiave esterna verso rA. A rB si
aggiungono anche gli attributi dell’associazione;
● un associazione n:m viene derivata in tre relazioni:
○ rA, contenente gli attributi di A;
○ rB, contenente gli attributi di B;
○ rR, contenente gli attributi di R e gli identificatori di A e B.
○ le pk di rA e rB sono gli identificatori di A e B;
○ le pk di rR sono composte dalle pk di rA e rB e possono essere
composti dagli attributi in R;
○ le pk di rA e rB in rR sono chiavi esterne verso rA e rB
Operatori
Gli operatori relazionali agiscono su una o più relazioni per ottenere una
nuova relazione.
Le operazioni relazionali consentono di effettuare le interrogazioni al
database per ottenere informazioni desiderate estraendo da una tabella una
sottotabella, oppure combinando tra loro due o più relazioni e generando
nuove relazioni.
Gli operatori si suddividono in:
● binari, data una coppia di relazioni produrranno una relazione;
● unari, data una relazione produrranno una relazione.
Binari
Tra gli operatori binari troviamo:
● prodotto cartesiano, rxs che stampa tutte le combinazioni possibili tra
le tuple delle relazioni r e s, il grado è la somma tra il grado di r e il
grado di s mentre la cardinalità è composta dal prodotto tra le
cardinalità di r e di s;
● join, r ⋈cond s, che combina due relazioni per crearne una nuova le cui
tuple sono ottenute abbinando le tuple di r e s che soddisfano una o
più condizioni di uguaglianza tra gli attributi di r e s, il grado
solitamente è uguale alla somma dei gradi di r e s mentre la cardinalità
non è prevedibile.
Unari
Tra gli operatori unari troviamo:
● proiezione, πA (r) che stampa le colonne relative a A di (r), la cardinalità
rimane la stessa di (r) mentre il grado è ≤ al grado della relazione di
partenza;
● selezione, σcond (r), che genera una nuova relazione costituita solo dalle
tuple della relazione di partenza che soddisfano una determinata
condizione, il grado rimane lo stesso mentre la cardinalità è ≤ a quella
della relazione di partenza;
● rinomina, ρA🠔B (r) che permette di rinominare gli attributi di (r);
Dipendenza funzionale
La dipendenza funzionale per una relazione r sullo schema x è un espressione
della forma A➝B; A,B ⊆ x.
La dipendenza funzionale è verificata da r se ∀ τ1,τ2 ∈ r ho τ1[A]=τ2[A] e
τ1[B]=τ2[B].
L’implicazione pratica della dipendenza funzionale porta alla seguente tabella
della verità:
A B A➝B
V V V
V F F
F V V
F F V
Esistono tre principali anomalie:
● anomalia di eliminazione, si verificano quando l’eliminazione di un
insieme di dati portano all’eliminazione di altri dati presenti nella stessa
tupla che dovrebbero rimanere memorizzati nel database, quindi si
possono perdere dati che non bisogna eliminare.
● anomalia di aggiornamento, in caso di modifica di un attributo atomico
bisogna modificare il valore di tale attributo su tutte le tuple
corrispondenti che lo contengono.
● anomalia di inserimento, nasce quando per inserire una nuova tupla è
necessario assegnare dei valori nulli (non disponendo di altri valori)
anche ad attributi che appartengono ad una chiave candidata della
tabella, quindi in certe condizioni non è possibile inserire dei dati di una
relazione senza inserire anche dati non associati alle relazioni di
riferimento.
Forme normali
Le relazioni possono essere in diverse forme normali, queste ultime sono delle
proprietà che devono essere soddisfatte dalle relazioni di uno schema. Tale
proprietà garantisce un certo livello di “qualità” di ciascuno schema.
Le forme normali sono:
● 1 N-F, per ottenerla c’è bisogno che gli attributi siano atomici, non ci
devono essere tuple doppie e ogni relazione deve avere pk.
● 2 N-F, per ottenerla bisogna essere in prima forma normale e non ci
devono essere dipendenze funzionali parziali, ovvero tra un attributo
della chiave primaria composta e un attributo.
● 3 N-F, per ottenerla bisogna essere in seconda forma normale e non ci
devono essere dipendenze funzionali transitive, ovvero dipendenze
funzionali nelle quali il determinante non è chiave primaria.
Un algoritmo vuole come input una relazione r(x) e una famiglia di dipendenze
funzionali Γ, e avrà come output una relazione in forma normale superiore a
quella di input.
L’algoritmo di normalizzazione è il seguente:
while(∃ A➝B ∈ Γ (parziali o transitive)){
da s rimuovo B;
creo una relazione(A, B);
A in r diventa FK;
}
Vincolo di integrità referenziale
È un vincolo posto su una coppia di PK e FK per ogni valore della FK o il valore
è nullo o deve esistere un valore presente nella relazione “madre” relazionata,
ovvero nella PK corrispondente.
Il legame con l’algoritmo di normalizzazione sta nel fatto che a ogni iterazione
aggiungo una coppia chiave primaria/chiave esterna sulle quali vige il vincolo
di integrità referenziale.
Boyce-Codd Normal Form
Una relazione è in BCNF quando rispetta le caratteristiche fondamentali della
prima forma normale e, dato un insieme di dipendenze funzionali, ogni
determinante è una superchiave.
La BCNF esclude che un determinante possa essere solo una parte della
chiave o che sia esterno alla chiave, quindi se si è in BCNF si è anche in 2NF e
3NF.
Questa forma normale è stata introdotta al fine di trattare le anomalie non
trattate dalla 3NF, ridurre la ridondanza e garantire l’integrità.
Modello fisico
Il modello fisico è l’implementazione del logico nel quale le relazioni vengono
sostituite con tabelle. Nel modello logico l’ordine delle righe delle tabelle è
importante e si possono avere righe doppie. Le tuple si chiamano record o
semplicemente righe. Ciò che si va a usare è proprio il modello fisico.
Transazioni
Le transazioni sono blocchi di operazioni SQL che vanno eseguiti insieme,
devono rispettare una politica ACID:
● Atomicity, i blocchi non vanno scomposti;
● Consistency, bisogna passare da uno stato consistente all’altro;
● Isolation, le varie transazioni non si devono influenzare a vicenda;
● Durability, alla fine delle transazioni le modifiche devono essere
permanenti.
Ci sono più livelli di isolabilità che si possono introdurre e si possono definire
più politiche di isolabilità.
Esistono 4 principali problemi dati da isolamenti sbagliati:
1. Lost Update, si verifica quando una modifica sui dati viene persa;
2. Dirty Read, quando ciò che viene letto è soggetto a roll-back;
3. Unrepeatable Read, quando per T1 si assumono due valori diversi nelle
due letture senza che questo dato sia stato modificato da T1.
4. Phantom Row, si devono fare due operazioni e l’ordine va a incidere sul
risultato, infatti in un determinato caso si va a effettuare l’operazione
prima di aver inserito una riga che avremmo dovuto successivamente
modificare, guardare l’esempio con Bologna→Firenze.
Troviamo poi anche 4 politiche di isolamento:
1. Serializable, nessuna transazione può inserire dati soggetti a lettura,
risolve tutte le problematiche;
2. Repeatable Read, tutti i dati letti durante una transazione non possono
essere modificati da altre operazioni, quindi non si può leggere i dati se
quest’ultimi sono soggetti a modifica, non risolve la problematica
Phantom;
3. Read Committed, non si possono leggere dati che sono stati modificati
da altre transazioni, solo dopo che sono stati committati, oltre alla
Phantom non risolve nemmeno la Unrepeatable Read;
4. Read Uncommitted, permette di leggere dati che non sono stati ancora
committati, risolve solo la Lost Update.