dato: immediatamente presente alla conoscenza, prima di ogni elaborazione informazione: notizia o elemento che consente di avere conoscenza di fatti, situazioni e modi di essere I dati codificano le informazioni.
Una base di dati è un insieme organizzato, persistente e condiviso di dati utilizzati per lo svolgimento delle attività automatizzate dell’organizzazione.
I basi di dati sono gestiti da DBMS (Data Management System)
Modello dei dati = insieme di construtti utilizzati per organizzare i dati e descriverne la dinamica Usiamo il modello relazionale.
L’insieme $D_{1}\times…\times D_{n}$ è relazione matematica $\begin{array}{ccccc}\text{Partite}\subseteq&\text{string}\times&\text{string}\times&\text{int}\times&\text{int}\&\text{Juve}&\text{Lazio}&3&1\&\text{Lazio}&\text{Milan}&2&0\end{array}$
La relazione in basi di dati è simile a quella matematica ma non è posizionale (3.); ogni dominio/colonna è associato a un nome unico (attributo)
I riferimenti fra dati in relazioni diverse sono per valore. $R(A_{1},…A_{n})$ relazione R su attributi $A_{1},…,A_{n}$ $R={R_{1}(X_{1}),…,R_{k}(X_{k})}$ schema di base di dati, ovvero insieme di relazioni
null
per valore sconosciuto, inesistente o senza informazione
chiave primaria chiave esterna, vincolo di integrità relazionale
Operatori insiemistici
Altri operatori Ridenominazione (p), modifica lo schema lasciando inalterate le istanze
Selezione $(\sigma)$, decomposizione orizzontale: ottengo un sottoinsieme delle tuple che soddisfano una condizione
Proiezione $(\pi)$, decomposizione verticale: restituisce relazione con una parte di attributi sottoinsieme delle tuple (eliminazione duplicati)
Join $(\bowtie)$, prodotto cartesiano tra relazioni mantenendo quelli con valori uguali su attributi uguali. Può risultare completo, non completo, vuoto o nxm (prodotto cartesiano). In generale $0\leq|R_{1}\bowtie R_{2}|\leq|R_{1}|\times|R_{2}|$
Join esterno, mette null in attributi quando non ha un relativo nell’altra tabella. Può essere sinistro $(\bowtie_{\text{left}})$, destro $(\bowtie_{\text{right}})$ o completo $(\bowtie_{\text{full}})$ a seconda di quali tuple mantiene. Risolve il problema dei join non completi e la perdita di informazioni.
Semi-join, restituisce le tuple che contribuiscono allo join Theta_join: $\sigma_{\text{condition}}(R_{1}\bowtie R_{2})\quad\Longleftrightarrow\quad R_{1}\bowtie_{\text{condition}}R_{2}$ Equi-join è un theta-join con condizione di equivalenza
In algebra relazione, due espressioni sono equivalenti se producono lo stesso risultato per qualunque istanza delle relazioni della base di dati. Il DBMS cerca sempre di eseguire espressioni equivalenti ma più efficienti.
Viste (relazioni derivati) Rappresentazioni diverse per gli stessi dati. Non hanno contenuto autonomo ma si basano sulle relazioni di base. Vengono usati per mascherando informazioni in base ai diversi utenti o per semplificare la scrittura di interrogazioni complesse.
Possono essere di due tipi
Si possono riversare i cambiamenti dalle viste alle relazioni base solo in caso di join completo.
Ci sono due linguaggi
DDL Definisce lo schema di relazione e crea un’istanza vuota. Specifica attributi, domini e vincoli.
CREATE TABLE NomeTabella (
Id VARCHAR(6) PRIMARY KEY,
A CHAR(10),
B NUMERIC(9) DEFAULT 0,
Ref VARCHAR(6),
UNIQUE(A,B),
FOREIGN KEY(Ref)
REFERENCES Tab2(Id) ON DELETE CASCADE
)
Politiche di reazione su delete/update
Vincoli di CHECK(condizione)
DML
INSERT INTO NomeTabella(attr1,attr2,...)
VALUES(val1,val2,...)
DELETE FROM NomeTabella
WHERE condizione /* senza condizione, tutto viene cancellato */
UPDATE NomeTabella
SET attributo = espressione
WHERE condizione
Condizione LIKE _ qualsiasi carattere % qualsiasi sequenza anche vuota
Operatori aggregati COUNT, MIN, MAX, AVG, SUM spesso usati con GROUP BY
CREATE VIEW NomeVista[(ListaAttributi)]
AS SELECT ... FROM ...
Viste che possono essere usate come tabelle. Vengono ricalcolate ogni volta. Aggiornamenti sulle viste sono possibili se fanno riferimento a una sola relazione.
Controllo dell’accesso Il creatore ha tutti i privilegi su di essa: INSERT, UPDATE, DELETE, SELECT, REFERENCES, USAGE
CREATE VIEW Stadi_Italia(NomeStadio, NumeroPartite) AS SELECT NomeStadio, COUNT(*) FROM Incontro WHERE Squadra1=’Italia’ OR Squadra2=’Italia’ GROUP BY NomeStadio
SELECT Citta FROM Stadi_Italia, Stadio WHERE Nome=NomeStadio AND NumeroPartite = (SELECT MAX(NumeroPartite) FROM Stadi_Italia)
CREATE VIEW SpeseCitt(Cittadinanza, SpeseTotali) AS SELECT Cittadinanza, SUM(Costo) FROM Viaggio JOIN (SELECT CodViaggio, Cittadinanza FROM Effettua JOIN Cliente ON Effettua.CF=Cliente.CF) AS a ON Viaggio.CodViaggio=a.CodViaggio GROUP BY Cittadinanza
SELECT Cittadinanza, MAX(SpeseTotali) FROM SpeseCitt
CREATE VIEW Viaggi_G(CF, NViaggi) AS SELECT CF, COUNT(*) FROM Viaggio, Effettua WHERE Viaggio.CodViaggio=Effettua.CodViaggio AND Paese=’Giappone’ GROUP BY CF
SELECT CF FROM Viaggi_G WHERE NViaggi = (SELECT MAX(NViaggi) FROM Viaggi_G)
CREATE VIEW X(Paese, Cittadinanza, CostoMedio) AS SELECT Paese, Cittadinanza, AVG(Costo) FROM Viaggio, Effettua, Cliente WHERE Viaggio.CodViaggio=Effettua.CodViaggio AND Viaggio.CF=Cliente.CF GROUP BY Paese, Cittadinanza
CREATE VIEW Y(Paese, CostoMedioMax) AS SELECT Paese, MAX(CostoMedio) FROM X GROUP BY Paese
SELECT Paese, Cittadinanza FROM X JOIN Y ON X.Paese=Y.Paese WHERE CostoMedio = CostoMedioMax
Parte del ciclo di vita dei Sistemi Informativi
In questo corso ci soffermeremo nei punti 2. 3. 4. per una base di dati.
Modello Entity-Relationship Detto anche Entità-Relazione. E’ il modello concettuale per base di dati più diffuso.
Costrutti | |
---|---|
Entità | ![]() |
Attributo | ![]() |
Relazione (relationship) sostantivi invece di verbi, non hanno direzione |
![]() |
Cardinalità (min occorrenze, max occorrenze) possibile associare anche ad attributi |
![]() |
Identificatore interno o esterno (in tal caso cardinalità deve essere (1,1)) |
![]() |
Generalizzazione mette in relazione più entità come sue specializzazioni |
![]() |
Nello schema concettuale rappresentiamo le entità e non le singole istanze.
Le entità specializzate di una generalizzazione ereditano tutte le relazioni dell’entità generale.
E’ importare affiancare un dizionario all’ER anche per descrivere vincoli non esprimibili in ER.
Requisiti da
Reificazione: prendere l’astratto per concreto
Qualità di uno schema ER
“Tradurre” lo schema concettuale in uno schema logico. Da considerare ottimizzazioni e ristrutturare costrutti non rappresentabili.
Rindondanze Vantaggi: semplificare le interrogazioni Svantaggi
Eliminazione delle generalizzazioni Quattro possibilità
Partizionamento/accorpamento entità e relationship Ristrutturazione per rendere più efficienti le operazioni; da analizzare con la frequenza di operazioni e il carico. In specifico se si accedono agli attributi insieme o no.
Scooter (identificativo, modello, cilindrata, locazione) Scooter.locazione -> Parcheggio Noleggio (id, cliente, data_prelievo, luogo_prelievo, data_restituzione, luogo_restituzione) Noleggio.cliente -> Cliente Noleggio.luogo_prelievo -> Parcheggio Noleggio.luogo_restituzione -> Parcheggio Rent (Noleggio, Scooter) Rent.Scooter -> Scooter Rent.Noleggio -> Noleggio Parcheggio (id, dimensione) Cliente (codice fiscale, data_registrazione, punti*)
Specie (nome) Terriccio (tipo) Adatto (specie, terreno) Adatto.specie -> specie.nome Aldatto.terreno -> terriccio.tipo AltoFusto (id, età, clima, nome, specie, terriccio) AltoFusto.specie -> specie.nome AltoFusto.terriccio -> terriccio.tipo Fiorita (nome, num_esemplari, costo, fiorituraDa, fiorituraA, durata_fioritura) Vendita (id, data, grossista*) Vendita.grossista -> Grossista.pIva Vendita_AltoFusto (id, altofusto, prezzo) Vendita_AltoFusto.id -> Vendita.id Vendita_AltoFusto.altofusto -> AltoFusto.id Vendita_Fiorita (id, fiorita, numero) Vendita_Fiorita.id -> Vendita.id Vendita_Fiorita.fiorita -> Fiorita.nome Grossista (pIva, CF, nome, cognome)
Evento (nome, inizio, fine, sito_web*) Padiglione (codice, tipo) Espositore (pIva, nome, email) Assegnazione (evento, padiglione, inizio, fine, espositore) Assegnazione.evento -> evento.nome Assegnazione.padiglione -> Padiglione.codice Sessione (evento, titolo, padiglione, data) Sessione.evento -> Evento.nome Sessione.padiglione -> Padiglione.codice Partecipante (email, cognome, nome) Iscrizione (evento, email, cognome) Iscrizione.evento -> Evento.nome Iscrizione.(cognome, email) -> Partecipante.(cognome, email) NonSpeaker (email, cognome) Speaker (email, cognome) Biglietto (codice, costo, evento, email, cognome) Biglietto.evento -> Evento.nome Biglietto.(email, cognome) -> NonSpeaker.(email, cognome) Relazione (titolo, evento, email, cognome) Relazione.evento -> Evento.nome Relazione.(email, cognome) -> Speaker.(email, cognome)
Ci sono
Forma normale di Boyce e Codd (BCNF) Una relazione R con chiavi $K_{1},…,K_{n}$ è in forma normale di Boyce e Codd: se ogni dipendenza funzionale non banale $X\rightarrow Y$ è “buona” cioè $\exists i, K_{i}\subseteq X$ (X è superchiave)
La normalizzazione è l’eliminazione delle dipendenze funzionali decomponendo la tabella in più tabelle in forma normale di Boyce e Codd. Non è sempre possibile scomporre in BCNF.
Terza forma normale (3NF) Una relazione R con chiavi $K_{1},…,K_{n}$ è in Terza Forma Normale se: per ogni dipendenza funzionale non banale $X\rightarrow Y$, almeno una delle seguenti condizioni sono valide
- X è superchiave (BCNF)
- ogni attributo in Y è contenuto in almeno una tra le chiavi $K_{1},…K_{n}$
Dipendenze violano 3NF se parte sinistra non è chiave e la parte destra non è parte della chiave. E’ sempre possibile scomporre nella terza forma normale.
Chiusura transitiva di un insieme di attributi A->B, A->C allora B->C Prendendo uno ad uno le dipendenza funzionali aggiungiamo gli attributi a destra nella chiusura quando quelli a sinistra sono già nella chiusura. Questa chiusura è chiave.
R(A, B, C, D, E, F)
dipendenze | ridondante | 3NF | |
---|---|---|---|
CE -> A | C->A |
||
C -> D | |||
A -> B | viola | ||
D -> BE | D->B D->E |
viola | |
B -> F | viola | ||
AD -> CF | AD->C |
A->B, B->F |
$C^{+}={C,D,B,E,A,F}$ candidato chiave $A^{+}={A,B,F}$ $D^{+}={B,E,F}$ $B^{+}={F}$ $AD^{+}={A,D,C,F,B,E}$ candidato chiave
R1(C, A, D) R2(A, B) R3(U,B, E) R4(B, F)
begin-transaction;
<operazioni SQL>
commit work;
Principio dell’atomicità Garantisce che le operazioni al suo interno vengano tutte compiute all’avvenuta del commit. Nel caso di un abort, nessuna delle operazioni vengono eseguite sulla base di dati.
Consistenza I vincoli del db vengono verificati alla fine della transazione. Se sono violati, non avviene il commit.
Isolamento Le transazioni non risentono degli effetti delle transazioni concorrenti. I loro stadi intermedi sono inaccessibili.
Persistenza (durabilità) gli effetti di una transazione andata a buon fine non vanno più perduti
(atomicità e persistenza) Usa un file log che archivia le operazioni svolte permanentemente
Il log continua dall’attivazione del db e può andare indietro anche di anni. Cosa fare quando c’è stato un guasto e si vogliono riprendere le transazioni? Checkpoint, registra quali transizioni sono attive in un certo istante
Classifichiamo le transazioni
Ripresa a caldo
Modalità immediata: db è scritto immediamente dopo il log, REDO non necessario Modalità differita: db è scritto solo dopo un commit, UNDO non necessario
Modalità ibrida possibile che viene fatto undo di operazioni che non hanno più effetto sul db, undo(undo(A))=undo(A) possibile che viene fatto redo di operazioni che hanno già effetto sul db, redo(redo(A))=redo(A)
Guasti
Utile fare una copia totale del db su memoria stabile Ripresa a freddo per guasti di dispositivo
Dump, copia completa della base di dati Prodotta e salvata in memoria stabile mentre il sistema non è operativo
Concorrenza da problemi Schedule, sequenza di operazioni di I/O di transazioni concorrenti Scheduler è un sistema che accetta o rifiuta (o riordina) le operazioni richieste dalle transazioni Schedule seriale, transazioni separate, una alla vota Schedule serializzabile producono gli stessi risultati di uno schedule seriale sulle stesse transazioni view conflict Uno schedule è CSR (conflict serializzabile) se e solo se il suo grafo è aciclico
libera | r_locked | w_locked | |
---|---|---|---|
r_lock(x) | OK / r_locked conta(x)++ |
OK / r_locked conta(x)++ |
NO / w_locked |
w_lock(x) | OK / w_locked | NO / r_locked | NO / w_locked |
unlock(x) | error | OK / if(–conta(x)=0) libera else r_locked |
OK / not w_locked |
Locking a due fasi (2PL): in una transazione, dopo aver rilasciato un lock non può acquisirne altri
Dopo checkpoint i commit sono scritti sul disco
S=r1(x) w2(x) r3(x) w1(u) w3(v) r3(y) r2(y) w3(u) w4(t) w3(t)
\2. r1(x) w1(x) w1(y) r2(y) r2(x) w2(x) \3. r1(x) r1(y) w1(z) r2(y) w2(z) w3(z) w3(x) VSR