# 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
### Scopo delle viste

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

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

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

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

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

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

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.