Quando usare una vista invece di una tabella?


108

Quando dovrebbe essere effettivamente utilizzata una vista su una tabella reale? Quali guadagni dovrei aspettarmi che questo produca?

Nel complesso, quali sono i vantaggi dell'utilizzo di una visualizzazione su una tabella? Non dovrei progettare il tavolo nel modo in cui dovrebbe apparire la vista in primo luogo?

Risposte:


80

Oh, ci sono molte differenze che dovrai considerare

Viste per la selezione:

  1. Le viste forniscono l'astrazione sulle tabelle. Puoi aggiungere / rimuovere facilmente i campi in una vista senza modificare lo schema sottostante
  2. Le viste possono modellare facilmente join complessi.
  3. Le visualizzazioni possono nascondere elementi specifici del database. Ad esempio, se è necessario eseguire alcuni controlli utilizzando la funzione SYS_CONTEXT di Oracles o molte altre cose
  4. Puoi gestire facilmente le tue SOVVENZIONI direttamente sulle visualizzazioni, anziché sulle tabelle effettive. È più facile da gestire se sai che un determinato utente può accedere solo a una visualizzazione.
  5. Le visualizzazioni possono aiutarti con la retrocompatibilità. È possibile modificare lo schema sottostante, ma le visualizzazioni possono nascondere questi fatti a un determinato cliente.

Viste per inserimento / aggiornamenti:

  1. È possibile gestire i problemi di sicurezza con le viste utilizzando funzionalità come la clausola "WITH CHECK OPTION" di Oracle direttamente nella vista

svantaggi

  1. Perdi informazioni sulle relazioni (chiavi primarie, chiavi esterne)
  2. Non è ovvio se sarai in grado di inserire / aggiornare una vista, perché la vista ti nasconde i suoi join sottostanti

3
Domanda veloce: le visualizzazioni sono "permanenti" o durano solo la vita della sessione? Motivo che chiedo: abbiamo un sistema che a volte non funziona nel mezzo di una lunga esecuzione del codice. Lo mitigo mordendo parti del codice in tabelle intermedie che salvano i risultati intermedi. Quindi, se il sistema si blocca prima che il codice sia completo, devo solo riprendere a partire dall'ultima tabella temporanea salvata. Potrei passare all'utilizzo delle visualizzazioni se offrissero la stessa permanenza. Altrimenti continuerò a fare lo stesso, abbassando le temperature alla fine della corsa. Grazie!
ouonomos

8
@ouonomos: una visualizzazione normale non contiene dati. È solo un'istruzione SQL memorizzata, ovvero una vista sui dati sottostanti. Alcuni database (ad esempio Oracle, PostgreSQL) supportano le viste materializzate, che memorizzano temporaneamente la "vista" in un'altra tabella per un accesso più rapido. Questo viene fatto per accelerare l'accesso in lettura quando la vista è complessa. Ma questo non ti aiuta nel tuo caso perché una vista materializzata è ancora una vista, non un dato di per sé. Il tuo approccio è probabilmente OK.
Lukas Eder

44

Le visualizzazioni possono:

  • Semplifica una complessa struttura della tabella
  • Semplifica il tuo modello di sicurezza consentendo di filtrare i dati sensibili e assegnare le autorizzazioni in modo più semplice
  • Consentono di modificare la logica e il comportamento senza modificare la struttura dell'output (l'output rimane lo stesso ma il SELECT sottostante potrebbe cambiare in modo significativo)
  • Aumentare le prestazioni (viste indicizzate Sql Server)
  • Offri l'ottimizzazione delle query specifiche con la vista che altrimenti potrebbe essere difficile da raccogliere

E non dovresti progettare tabelle per abbinare le viste . Il tuo modello di base dovrebbe occuparsi dell'archiviazione e del recupero efficienti dei dati. Le viste sono in parte uno strumento che mitiga le complessità che derivano da un modello efficiente e normalizzato, consentendo di astrarre tale complessità.

Inoltre, chiedersi "quali sono i vantaggi dell'utilizzo di una visualizzazione su una tabella?" Non è un grande confronto. Non puoi fare a meno dei tavoli, ma puoi fare a meno delle visualizzazioni. Ciascuno di essi esiste per una ragione molto diversa. Le tabelle sono il modello concreto e le viste sono una vista astratta.


1
Le visualizzazioni +1 sono in parte uno strumento che mitiga le complessità che derivano da un modello efficiente e normalizzato, consentendo di astrarre tale complessità.
metdos

34

Le visualizzazioni sono accettabili quando è necessario garantire che la logica complessa venga seguita ogni volta. Ad esempio, abbiamo una vista che crea i dati grezzi necessari per tutti i rapporti finanziari. Se tutti i rapporti utilizzano questa visualizzazione, tutti lavorano dallo stesso set di dati, anziché un rapporto che utilizza un insieme di join e un altro si dimentica di usarne uno che fornisce risultati diversi.

Le visualizzazioni sono accettabili quando si desidera limitare gli utenti a un particolare sottoinsieme di dati. Ad esempio, se non si eliminano i record ma si contrassegna solo quello corrente come attivo e le versioni precedenti come inattive, si desidera una visualizzazione da utilizzare per selezionare solo i record attivi. Ciò impedisce alle persone di dimenticare di inserire la clausola where nella query e di ottenere risultati negativi.

Le visualizzazioni possono essere utilizzate per garantire che gli utenti abbiano accesso solo a un set di record, ad esempio una visualizzazione delle tabelle per un particolare client e nessun diritto di sicurezza sulle tabelle può significare che gli utenti di quel client possono vedere solo i dati per quel cliente.

Le viste sono molto utili durante il refactoring dei database.

Le visualizzazioni non sono accettabili quando si utilizzano visualizzazioni per chiamare visualizzazioni che possono comportare prestazioni orribili (almeno in SQL Server). Abbiamo quasi perso un client multimilionario perché qualcuno ha scelto di astrarre il database in quel modo e le prestazioni erano orrende e i timeout frequenti. Abbiamo dovuto pagare anche per la correzione, non il cliente, poiché il problema delle prestazioni era completamente colpa nostra. Quando le visualizzazioni chiamano le visualizzazioni, devono generare completamente la visualizzazione sottostante. Ho visto questo in cui la vista chiamava una vista che chiamava una vista e così tanti milioni di record venivano generati per vedere i tre di cui l'utente alla fine aveva bisogno. Ricordo che una di queste visualizzazioni impiegò 8 minuti per fare un semplice conteggio (*) dei record. Le visualizzazioni che chiamano visualizzazioni sono un'idea estremamente scarsa.

Le visualizzazioni sono spesso una cattiva idea da utilizzare per aggiornare i record poiché di solito è possibile aggiornare solo i campi della stessa tabella (di nuovo questo è SQL Server, altri database possono variare). In tal caso, ha più senso aggiornare direttamente le tabelle comunque in modo da sapere quali campi sono disponibili.


1
Non sapevo che ci fosse un problema di prestazioni con la visualizzazione della chiamata. Sembra strano. Non è gestito correttamente dall'ottimizzatore di query? Quale versione di SQL Server è stata utilizzata nel tuo caso?
Patrick Honorez

7

Le visualizzazioni sono utili quando è necessario selezionare da più tabelle o semplicemente per ottenere un sottoinsieme di una tabella.

È necessario progettare le tabelle in modo tale che il database sia ben normalizzato (duplicazione minima). Ciò può rendere alquanto difficile l'esecuzione di query.

Le viste sono un po 'separate, consentendo di visualizzare i dati nelle tabelle in modo diverso da come sono memorizzati.


7

Una pratica comune è nascondere i join in una vista per presentare all'utente un modello di dati più denormalizzato. Altri usi riguardano la sicurezza (ad esempio nascondendo determinate colonne e / o righe) o le prestazioni (in caso di viste materializzate)


6

Dovresti progettare il tuo tavolo SENZA considerare le viste.
Oltre a salvare join e condizioni, le viste hanno un vantaggio in termini di prestazioni: SQL Server può calcolare e salvare il suo piano di esecuzione nella vista e quindi renderlo più veloce delle istruzioni SQL "al volo".
La visualizzazione può anche facilitare il tuo lavoro riguardo l'accesso degli utenti a livello di campo.


5

Prima di tutto, come suggerisce il nome, una vista è immutabile. questo perché una vista non è altro che una tabella virtuale creata da una query memorizzata nel DB. Per questo motivo hai alcune caratteristiche delle visualizzazioni:

  • puoi mostrare solo un sottoinsieme dei dati
  • puoi unire più tabelle in una singola vista
  • puoi aggregare i dati in una vista (seleziona conteggio)
  • la vista non contiene effettivamente dati, non hanno bisogno di alcun tablespace poiché sono aggregazioni virtuali di tabelle sottostanti

quindi ci sono un miliardo di casi d'uso per i quali le visualizzazioni sono più adatte delle tabelle, basti pensare a visualizzare solo gli utenti attivi su un sito web. una visualizzazione sarebbe migliore perché operi solo su un sottoinsieme di dati che effettivamente si trova nel tuo DB (utenti attivi e inattivi)

dai un'occhiata a questo articolo

spero che questo abbia aiutato ..


2

Secondo Wikipedia ,

Le viste possono fornire molti vantaggi rispetto alle tabelle:

  • Le viste possono rappresentare un sottoinsieme dei dati contenuti in una tabella.
  • Le viste possono limitare il grado di esposizione delle tabelle sottostanti al mondo esterno: un dato utente potrebbe avere il permesso di interrogare la vista, mentre negato l'accesso al resto della tabella di base.

  • Le viste possono unire e semplificare più tabelle in una singola tabella virtuale.

  • Le viste possono agire come tabelle aggregate , in cui il motore di database aggrega i dati (somma, media, ecc.) E presenta i risultati calcolati come parte dei dati.

  • Le visualizzazioni possono nascondere la complessità dei dati. Ad esempio, una vista potrebbe apparire come Sales2000 o Sales2001, partizionando in modo trasparente la tabella sottostante effettiva.

  • Le viste occupano pochissimo spazio per essere archiviate ; il database contiene solo la definizione di una vista, non una copia di tutti i dati che presenta.

  • Le viste possono fornire una protezione aggiuntiva , a seconda del motore SQL utilizzato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.