Vista (basi di dati)
Le viste sono un elemento utilizzato dalla maggior parte dei DBMS. Si tratta, come suggerisce il nome, di "modi di vedere i dati".
Una vista è rappresentata da una query (SELECT
), il cui risultato può essere utilizzato come se fosse una tabella. Da un punto di vista fisico esistono diversi modi di fare questo. Generalmente i DBMS rielaborano le query sulle viste in modo che agiscano sulle tabelle che fanno parte della vista stessa. Ad esempio possono farlo trattando la SELECT
che compone la vista come se fosse una subquery delle query eseguite su di essa (questo è il modo più semplice, ma essendo poco prestante i DBMS dovrebbero farlo solo in casi particolari).
Una vista può essere composta da una o più tabelle; alcuni DBMS, come MySQL, consentono anche di basare la vista su un'espressione SQL che non coinvolge alcuna tabella (ad esempio SELECT 1 1 AS somma
).
Descrizione
[modifica | modifica wikitesto]Scopo delle viste
[modifica | modifica wikitesto]Le viste generalmente vengono utilizzate per semplificare le query. Se il database è realmente relazionale, leggere un insieme di dati avente un significato potrebbe essere complesso, perché potrebbe richiedere eccessive JOIN fra tabelle; con una vista è possibile semplificare molto la stesura di query che leggono le informazioni.
Un altro scopo delle viste potrebbe essere semplificare o potenziare la gestione dei permessi. Ad esempio si potrebbe creare una query che legge solo alcuni dati da una tabella (tramite la clausola WHERE
), per poi assegnare il permesso in lettura ad un certo utente sulla vista, ma non sulla tabella di base. In questo modo l'utente non vedrà i dati che non vengono estratti dalla vista.
Viste aggiornabili
[modifica | modifica wikitesto]Le viste possono essere aggiornabili, cioè è possibile eseguire su di esse comandi DML come INSERT
, UPDATE
e DELETE
. Non tutti i DBMS supportano questa possibilità. Poiché una vista non è altro che un'interfaccia su una o più tabelle, questi comandi andranno a modificare le tabelle sottostanti. Non tutte le viste sono aggiornabili e scrivibili. Si parla di viste updatable (sulle quali cioè si può eseguire UPDATE
e DELETE
) solo quando il DBMS è in grado di stabilire una mappatura inversa tra i record presenti nella vista e quelli nelle tabelle. Si parla di viste insertable (sulle quali si può eseguire INSERT
) quando il DBMS è in grado di inserire il record nella tabella corretta. Ad esempio non è insertable una vista che mostra i valori massimi di una certa tabella o che raggruppa i record con una clausola GROUP BY
, perché tali dati non sono fisicamente scritti su una qualche tabella, ma rielaborati tramite una query. Se anche tutti i dati contenuti nella vista sono scritti fisicamente nelle tabelle, qualora la vista coinvolga diverse tabelle è necessario che tra esse vi sia una relazione uno a uno. Inoltre generalmente non è modificabile una vista basata su una UNION
.
La sesta legge formale recita: "tutte le viste che sono aggiornabili in teoria, dovrebbero esserlo anche in pratica".
Viste materializzate
[modifica | modifica wikitesto]Alcuni sistemi di gestione di database (come Oracle) supportano una vista materializzata. Si tratta di una vista i cui dati vengono registrati su una memoria di massa (di norma su disco rigido), per una lettura più rapida. A intervalli regolari, i dati ivi contenuti vengono aggiornati dal sistema (DBMS). In genere queste viste sono usate per applicazioni di data warehousing.
Alternative alle viste
[modifica | modifica wikitesto]Le viste servono a risolvere problemi che, spesso, possono essere risolti anche in altri modi. Un buon DBA deve quindi scegliere di caso in caso la soluzione più efficiente.
Colonne virtuali e indici funzionali
[modifica | modifica wikitesto]A volte si creano delle viste solo per aggiungere a una tabella una colonna, calcolata sulle altre, senza che questa sia registrata fisicamente nel database. Le query sulla vista potranno quindi leggere la colonna aggiuntiva senza dover includere la formula necessaria per calcolarne il valore.
Se il DBMS supporta le colonne virtuali (MariaDB, Oracle...) o gli indici funzionali (PostgreSQL), è sufficiente aggiungere alla tabella uno di questi oggetti.
Trigger
[modifica | modifica wikitesto]A volte le viste vengono usate per aggiungere una colonna (vedi paragrafo sulle colonne virtuali) o per modificare un valore al momento della visualizzazione (per esempio, rendendo tutti i caratteri di un campo minuscoli). Un altro modo per ottenere lo stesso risultato sono i trigger. Usando i trigger è possibile scrivere su disco il valore desiderato, rendendo più veloce la lettura (ma occupando più spazio).
Tabelle riassuntive
[modifica | modifica wikitesto]A volte si desidera raggruppare i dati non solo logicamente, ma anche fisicamente. Una tecnica consiste nel creare delle tabelle denormalizzate, contenenti dati ricavati da altre tabelle. Queste tabelle riassuntive devono essere aggiornate periodicamente, preferibilmente in un momento in cui il database non viene utilizzato (di solito di notte). Questa tecnica permette prestazioni migliori nelle query di tipo OLAP.
Voci correlate
[modifica | modifica wikitesto]- Base di dati
- Modello relazionale
- Colonna virtuale
- Trigger (basi di dati)
- Stored procedure
- Vista materializzata
Collegamenti esterni
[modifica | modifica wikitesto]- Tables and views in SQL-99 standard, su kb.askmonty.org. URL consultato il 21 giugno 2013 (archiviato dall'url originale il 9 settembre 2012).
- PostgreSQL views, su postgresql.org.
- MariaDB views [collegamento interrotto], su kb.askmonty.org.
- FirebirdSQL views, su firebirdsql.org.
- MySQL views tutorial, su mysqltutorial.org.
- MariaDB: How to create a Black Hole when BLACKHOLE is disabled, su falseisnotnull.wordpress.com.
- Passing arguments to PostgreSQL views, su postgresql.1045698.n5.nabble.com. URL consultato il 21 giugno 2013 (archiviato dall'url originale il 21 maggio 2013).
- Updateable Views in PostgreSQL 9.1 using INSTEAD OF Trigger, su vibhorkumar.wordpress.com.
- PostgreSQL Tricks: Writable Views, su legitimatesounding.com.