La serie MySQL 5 ha introdotto alcune modifiche. I trigger e le stored procedure erano due dei grandi elementi del ticket. Una delle aggiunte meno conosciute, almeno dalla quantità di scritti sull'argomento, è l'introduzione delle visualizzazioni. Mentre dopo una rapida occhiata alle viste MySQL, potresti non vedere gli ovvi vantaggi, sono lì se li analizzi solo un po '.
"A View non è altro che una pseudo tabella che fa il lavoro di una query definita."
In breve, il modo più semplice per guardare una vista è che è solo una query memorizzata che riproduce una tabella. Non è altro che una pseudo tabella che fa il lavoro di una query definita. Non aggiunge alcuna funzionalità, come la modifica delle variabili, né attiva altre query quando accade qualcos'altro. Le viste si limitano a sedersi lì, stupide e felici facendo ciò che hai definito loro.
A prima vista, questo non suona come un grande affare, ma se scavate oltre la superficie, potete iniziare a vedere un po 'della potenza della vista bassa. Non dirò che i punti di vista cambieranno la tua vita, ma ti dirò che renderanno il lavoro di interazione con i database un po 'più facile con cui lavorare. Renderanno il vostro lavoro un po 'più semplice quando apportate modifiche importanti alla versione nel vostro livello di interazione. Faranno anche alcuni compiti difficili come il reporting dinamico un po 'più efficiente e un po' più facile da lavorare. Mi prenderò un po 'più facile ogni giorno della settimana.
Con qualsiasi cosa ci sono dei compromessi.
"Le visualizzazioni potrebbero e probabilmente ridurranno le tue prestazioni."
Come ho scritto in passato, sono un credente nel fare dei compromessi, purché tu capisca cosa c'è sul tavolo. Più probabilmente qualcuno sfiorerà questo paragrafo e farà un commento sul fatto che non si dovrebbe mai usare una vista a causa del colpo di performance. Non sono d'accordo. Dovresti usare tutti gli strumenti nella tua cassetta degli attrezzi, ma quando hanno un senso. Non usi un martello per mettere una vite in un muro, proprio come non useresti una vista quando hai veramente bisogno di un heap / tabella di memoria. Il rovescio della medaglia è l'usabilità dello sviluppo per le tue applicazioni. Quando è sensato risparmiare tempo, sforzi ed energia sul colpo di performance che potresti prendere, prendi questa scelta. Lo sviluppo non riguarda esclusivamente le prestazioni delle tue applicazioni, poiché ci sono altre considerazioni come supporto, time to market e valore complessivo del tuo tempo.
Gli strumenti con cui sto lavorando in questo tutorial sono piuttosto standard. Sto usando phpMyAdmin per l'interazione con il database a scopo esplicativo. Userò anche strutture da tavolo molto rudimentali, rigorosamente per facilitare la spiegazione. Non mi aspetto che queste strutture di tabelle vengano mai utilizzate in un ambiente di produzione, dato che le sto semplicemente utilizzando come illustrazione.
Un'ulteriore nota. Non esiste un modo giusto o sbagliato per nominare una vista. Tuttavia, do il mio nome alle viste con la sintassi di view_ * primary_table * _ * what_the_view_is_used_for * a meno che non stia lavorando per le modifiche alla retrocompatibilità. Quindi, se stavo creando una vista a fini di reporting statistico sulla mia tabella salesforce, il mio nome vista sarebbe: view_salesforce_statistical_report. Può essere piuttosto lungo e hai solo 64 caratteri con cui lavorare, quindi tienilo a mente. Funziona per me e il mio stile potrebbe non funzionare per te.
"Non dirò che i punti di vista cambieranno la tua vita, ma ti dirò che renderanno il lavoro di interazione con i database un po 'più facile da lavorare. Renderebbero il tuo lavoro un po' più semplice quando apporterai modifiche importanti alla versione in il tuo livello di interazione. Faranno anche alcune attività difficili come il reporting dinamico un po 'più efficiente e un po' più facile da lavorare. "
Come ho affermato, una vista è solo una domanda. Ci sono alcune lievi configurazioni che dobbiamo fare durante la creazione di una vista, quindi discutiamolo prima. In phpMyAdmin, nella pagina della tabella "Sfoglia", vedrai un collegamento chiamato "Crea vista".
Se fai clic su quel link dovresti vedere qualcosa che assomiglia a questo:
Questo, amici miei, è dove avviene la magia. Non c'è molto da spiegare sulla pagina, ma diamo una rapida occhiata alle definizioni che dobbiamo capire per creare una vista.
In primo luogo, c'è "Crea vista" seguito da "O SOSTITUISCI". Se fai clic su O SOSTITUI, farà esattamente ciò che pensi, sovrascrivendo una vista esistente. I nomi delle colonne sono il nome delle colonne nella tabella. Ognuno è separato da una virgola, quindi potrebbe apparire come first_name, second_name, ecc. AS è la query.
Ci sono altri due elementi da spiegare, ma i concetti non sono difficili. ALGORITHM ha le selezioni di tabella non definita, unione e temp. Se selezioni "Unisci" quando esiste una relazione uno a uno, combinerà la query in entrata con la vista. La tabella Temp è meno efficiente, ma quando non si utilizza una relazione uno a uno, come una funzione di aggregazione come SUM () o si utilizzano determinate parole chiave come GROUP BY o HAVING o UNION, è necessario utilizzare l'algoritmo della tabella temporanea. Detto questo, puoi fare come faccio io, e lasciare l'algoritmo come "non definito" e MySQL selezionerà il miglior algoritmo da usare.
Infine, abbiamo le opzioni CHECK OPTION CASCADED e CHECK LOCALI. Le opzioni di controllo indicano a MySQL di convalidare la definizione della vista se c'è una condizione nella query, come WHERE. Se la clausola WHERE esclude i dati, impedirà gli aggiornamenti o l'inserimento di quelle righe in cui dovrebbe essere escluso. Il CHECK LOCALE riguarda solo la vista che stai definendo, dove CASCADED CHECK è per le viste che hai definito da altre viste. Farà il controllo a cascata anche per quelli.
Questa è una visione in poche parole. Diamo un'occhiata ad alcuni casi d'uso per vederli in azione e dove possono aiutare i tuoi sforzi di sviluppo.
L'ho fatto accadere più volte di quanto mi piacerebbe menzionare quando progetto un tavolo monouso che non penso mai debba essere normalizzato, come inevitabilmente lo fa. Prendiamo l'esempio che abbiamo mostrato prima con alcuni altri record.
Ovviamente, le mie capacità di normalizzazione lasciano a desiderare in questo esempio. Quello che probabilmente avrei dovuto fare quando ho creato questa tabella per la prima volta, era avere una tabella separata per gli indirizzi, e quindi chiamare semplicemente un indirizzo_id nella mia tabella delle vendite forzate. Il problema è che, una volta passato a una modifica del database, devo tornare indietro nel mio livello di interazione logica e apportare numerose modifiche alle query. Invece di fare così tanto lavoro, perché non lasciare che una vista venga in soccorso.
Innanzitutto, facciamo la modifica alla mia struttura di tabella. Copio la mia struttura di tabella e i dati nella mia nuova tabella, gli indirizzi e rendono la tabella sana come l'aggiunta di address_id e la rimozione della struttura non necessaria:
Quindi ho solo bisogno di cancellare le colonne offensive e aggiungere il mio address_id alla mia tabella vendite.
Questo è un cambiamento piuttosto comune che fai su base semi-regolare, sebbene di natura piuttosto semplicistica. Capisci che puoi normalizzare qualcosa a causa di una nuova funzione. In questo caso, possiamo riutilizzare i nostri indirizzi per i clienti, o per altri dipendenti, o per qualsiasi cosa potremmo memorizzare gli indirizzi. Questo lavoro non è così difficile, ma a seconda del riutilizzo delle query, trovare tutte le posizioni che chiami la nostra vecchia tabella sales_force potrebbe essere una modifica molto più ampia dell'ambito. In viene una vista.
Invece di tornare indietro nel nostro codice proprio ora, e invece aspettare un normale ciclo di rilascio, possiamo creare una vista per mantenere intatte le nostre vecchie funzionalità. Ho cambiato il nome della nostra tabella sales_force in sales_force_normalized:
Ora possiamo creare la nostra vista per mantenere la retrocompatibilità:
E abbiamo la nostra retrocompatibilità con il solo lavoro extra di creare una query che risiede in MySQL:
Anche quando inserisco un nuovo addetto alle vendite, la mia opinione rifletterà il cambiamento:
E, presto:
Circa due minuti di lavoro per mantenere la nostra retrocompatibilità con la nostra precedente struttura di dati. Esistono alcuni svantaggi in questo metodo, in quanto non è possibile definire un indice rispetto alla propria vista che è importante quando si eseguono viste a cascata. Inoltre, dovrai ancora cambiare le tue query per INSERT, DELETE e UPDATE, ma questo ti farà risparmiare un po 'di lavoro. Le tue prestazioni potrebbero diminuire un po ', ma come un punto di interruzione, non c'è un modo più semplice per apportare modifiche alla struttura dei dati per semplificare la tua base di codice in quel cambiamento. Le tue query nel tuo livello logico non saranno toccate perché, per quanto ne sappiano, stanno guardando la tabella originale.
Ora che abbiamo la nostra dimostrazione di concetto sotto le nostre cinture, diamo un'occhiata a un altro uso. Ho creato un'altra tabella per acquisire i dati di vendita dalla mia tabella Salesforce e l'ho riempita con alcune informazioni casuali. Sembra questo:
È una tabella estremamente semplificata per catturare le vendite della forza vendita a scopo illustrativo. Ci sono sempre cose che vogliamo estrarre per misurare su una tabella come questa. Probabilmente voglio sapere le vendite totali. Probabilmente vorrei conoscere le vendite totali per persona. Potrei anche voler conoscere il rango delle prestazioni di vendita. Potrei scrivere query nella mia logica di database per eseguire ognuna di queste quando ne ho bisogno, oppure potrei semplicemente scrivere una vista per prendere i dati secondo necessità. Poiché questo è un tutorial sulle viste, suppongo che la scelta sia piuttosto semplice a questo punto che tattica da prendere.
Iniziamo valutando le vendite totali, insieme ad altre informazioni pertinenti:
Che ci dà una visione di:
Ho anche incluso il tempo di interrogazione su questo, poiché guardando 200 record, questo è un fulmine veloce, ma le prestazioni possono variare. Si noti che non sto utilizzando le funzioni CHECK perché non sto discriminando le informazioni in una clausola WHERE. Ora che abbiamo queste informazioni ordinatamente impacchettate, è solo questione di costruire il nostro meccanismo di segnalazione nella nostra logica.
Ottenere queste informazioni non è difficile. Facciamo un ulteriore passo avanti e usiamo una funzione GROUP BY e una funzione di join contro la forza vendita. Ancora una volta, sto usando query semplificate per illustrare. In questo caso, vogliamo ottenere le stesse informazioni ottenute dalle vendite totali, ma questa volta ripartite dal nostro singolo addetto alle vendite.
Che ci dà una visione di:
Ancora una volta, molto semplice alla fine per ottenere questi valori dal tuo database. Diamo un'occhiata a un altro esempio, che combinerà le due viste. Voglio confrontare i totali con l'individuo, quindi creeremo una vista di due viste:
Che ci dà una visione di:
Un altro vantaggio delle viste è che forniscono un ulteriore livello di sicurezza alle vostre applicazioni. Non stai esponendo la struttura della tabella alla tua applicazione. Invece, stai esponendo qualcosa che in realtà non esiste, tranne che come uno pseudo tavolo. Non definirei una view best practice e li userei principalmente per scrivere applicazioni sicure, ma la considererei un ulteriore vantaggio.
Uso le visualizzazioni in modo limitato. Dove utilizzo le viste sono come sopra dimostrato, in particolare nei meccanismi di segnalazione nelle mie applicazioni. Scrivere una query per eseguire il sollevamento pesi per me è molto più semplice che scrivere la logica su query più difficili. Di tanto in tanto prendo un po 'un colpo sulle mie prestazioni, che tendo a superare ottimizzando la struttura originale dei dati. Devo ancora averne uno da esibire in termini di prestazioni, ma il giorno è giovane. Grazie mille per la lettura.