Crea una vista o usa innerjoins?

Ho un database normalizzato, con chiavi esterne / chiavi primarie che forniscono uno a molti database.

Ho in programma di accedere a questo database con PHP per il display di frontend / backend di base. Ora, la mia domanda viene da queste due query esemplificate:

CREATE VIEW `view` AS SELECT functiondetails.Detail, functionnames.ID, functionnames.FunctionName, functionnames.Catogory FROM functiondetails INNER JOIN functionnames ON functiondetails.AsscID = functionnames.ID 

o

 SELECT functiondetails.Detail, functionnames.ID, functionnames.FunctionName, functionnames.Catogory FROM functiondetails INNER JOIN functionnames ON functiondetails.AsscID = functionnames.ID 

Non vi è alcun errore nella query poiché ho eseguito entrambi senza esito negativo, ma la mia domanda generale è questa:

se ho intenzione di fare costantemente riferimento a molte informazioni dal mio database. Non sarebbe più facile creare una vista, che aggiornerà continuamente con le nuove informazioni aggiunte, o sarebbe meglio avere la seconda query sul mio php reale. Esempio:

 $Query = $MySQli->prepare(" SELECT functiondetails.Detail, functionnames.ID, functionnames.FunctionName, functionnames.Catogory FROM functiondetails INNER JOIN functionnames ON functiondetails.AsscID = functionnames.ID ") $Query->execute(); $Results = $Query->fetch_results(); $Array = $Results->fetch_arrays(MYSQLI_ASSOC); 

O per select dalla mia vista?

 $Query = $MySQLi->prepare("SELECT * FROM `view`"); $Query->execute(); $Results = $Query->fetch_results(); $Array = $Results->fetch_arrays(MYSQLI_ASSOC); 

Quindi quale sarebbe un metodo migliore da usare per interrogare il mio database?

Le viste sono un livello di astrazione e la solita ragione per creare un livello di astrazione è darti uno strumento per semplificarti la vita.

Alcuni dei grandi vantaggi dell'utilizzo delle visualizzazioni includono:

  1. Sicurezza
    Puoi controllare chi ha accesso alla vista senza concedere loro l'accesso alle tabelle sottostanti.

  2. Una precisazione
    Spesso, le intestazioni delle colonne non sono così descrittive come possono essere. Le viste consentono di aggiungere chiarezza ai dati che vengono restituiti.

  3. Prestazione
    Per quanto riguarda le performance, i punti di vista non ti fanno male negativamente. Tuttavia, non vedrai un guadagno in termini di performance utilizzando le viste in quanto MySQL non support visualizzazioni materializzate .

  4. Facilità nella codifica
    Le viste possono essere utilizzate per riutilizzare query complesse con less spazio per l'errore dell'utente.

  5. Facilità di gestione
    Ti semplifica la vita each volta che lo schema della tua tabella cambia.

    Ad esempio, homes_for_sale avere un tavolo che contiene le case che hai in vendita, homes_for_sale , ma in seguito decidi che vuoi che quel tavolo gestisca tutte le case che hai mai avuto in vendita / in vendita al momento, tutte le all_homes . Ovviamente, lo schema della nuova tabella sarebbe molto diverso dal primo.

    Se hai una tonnellata di query che homes_for_sale da homes_for_sale , ora devi esaminare tutto il codice e aggiornare tutte le query. Questo ti apre agli errori degli utenti e a un incubo gestionale.

    Il modo migliore per affrontare la modifica è sostituire la tabella con una vista con lo stesso nome. La vista restituirebbe lo stesso schema della tabella originale, anche se lo schema attuale è cambiato. Quindi puoi passare il tuo codice al tuo ritmo, se necessario, e aggiornare le tue chiamate di query.

Si può presumere che MySQL memorizzi i risultati di una vista da qualche parte e gli aggiornamenti risultanti dal cambiamento dei dati nelle tabelle sottostanti. MySQL non lo fa. Interrogare una vista è esattamente come eseguire la query.

Ma può anche essere una prestazione peggiore rispetto alla semplice esecuzione della query SQL, poiché MySQL può accumulare i risultati della query di base in una tabella temporanea, in modo da poter utilizzare ulteriori clausole SQL nella query rispetto alla vista. Dico "può" perché varia in base all'algorithm della vista.

Vedere http://dev.mysql.com/doc/refman/5.6/en/view-algorithms.html per una descrizione di come MySQL utilizza l'algorithm "merge" o l'algorithm "temptable" per l'esecuzione di una vista.

Se vuoi delle visioni materializzate, c'è uno strumento chiamato FlexViews che mantiene viste materializzate:

Flexviews è un'implementazione di viste materializzate per MySQL. Include una semplice API che viene utilizzata per creare viste materializzate e per aggiornarle. Il vantaggio dell'utilizzo di Flexviews è che le viste materializzate vengono aggiornate in modo incrementale, ovvero le visualizzazioni vengono aggiornate in modo efficiente utilizzando log speciali che registrano le modifiche alle tabelle del database. Flexviews include strumenti che creano e gestiscono questi registri. Le viste create da Flexviews includono il supporto per JOIN e per tutte le principali funzioni di aggregazione.

Una vista è semplicemente una query di text memorizzata. Puoi applicare WHERE e ORDER contro di esso, il piano di esecuzione sarà calcolato con quelle clausole prese in considerazione. Penso che sarebbe utile se si desidera mantenere il proprio codice "pulito". Quello che devi tenere a mente è che è un po 'più difficile modificare la vista, quindi se non sei abbastanza sicuro delle colonne, o cambierà quest'ultimo, segui una query.

A proposito di performance è lo stesso!

I migliori saluti!

Creare la vista è preferibile se sei:

  • Sicuro delle colonne richieste
  • Vuoi riutilizzare la tua vista anche da un'altra parte
  • Ti piace programmare in modo astratto. (Nascondere dettagli tecnici)
  • Hai bisogno di un accesso rapido creando indice su di esso.
  • Accesso specifico a pochi utenti (il punto è stato preso dai commenti)

Per quanto riguarda le performance dovrebbero essere uguali, ma la vista è migliore per alcune ragioni pratiche.

Preferisco le visualizzazioni perché incoraggia un migliore riutilizzo e refactoring delle query complesse modificandole in un unico posto invece di wherer copiare e incollare una versione più recente ovunque se si utilizza la query in più punti.

Anche l'esecuzione di una query di aggiornamento su una vista può sembrare molto più semplice e intuitiva, ma tenere presente che a volte non è ansible aggiornare più colonne in una vista che appartengono a tabelle sottostanti diverse. Quindi, se devi aggiornare 2 diverse colonne, dovrai eseguire due diverse query di aggiornamento.

L'utilizzo di una vista ha anche senso perché si scarica la complessa logica del database nel database a cui appartiene invece di costruirla nel codice dell'applicazione.

Sul lato negativo dell'utilizzo di una vista, che può richiedere un po 'più tempo per l'installazione se non hai lo strumento di gestione del database pronto. Inoltre, se hai molti punti di vista, probabilmente dovrai trovare un modo per organizzarli e documentarli tutti. Questo diventa più complesso se le viste iniziano a build su altre viste. Quindi dovrai pianificare in anticipo e mantenere le dependencies.