O introducere în MySQL 5 Vizualizări

Seria MySQL 5 a introdus câteva schimbări. Declanșatoarele și procedurile stocate au fost două dintre cele mai importante articole ale biletului. Una dintre cele mai puțin cunoscute adăugiri, cel puțin din cantitatea scrisă pe această temă, este introducerea de opinii. În timp ce, după o scurtă privire la vederile MySQL, s-ar putea să nu vedeți avantajele evidente, sunt acolo dacă vă grăbiți doar puțin.


Introducere: Ce este o vedere

"O vizualizare nu este altceva decât un pseudo-tabel care face munca unei interogări definite."

Pe scurt, cel mai simplu mod de a privi la o vizualizare este că este doar o interogare stocată care imită o masă. Nu este altceva decât un pseudo-tabel care face munca unei interogări definite. Nu adaugă nicio funcționalitate, cum ar fi schimbarea variabilelor, și nici alte întrebări atunci când se întâmplă altceva. Vedeți doar stai acolo, fii prost și fericit făcând ceea ce i-ai definit să facă.

La prima roșie, acest lucru nu suna așa de mare, dar dacă săci peste suprafață, puteți începe să vedeți o parte din puterea vederii inferioare. Nu voi spune că vederile vă vor schimba viața, dar vă voi spune că vor face mult mai ușor să lucreze cu interacțiunea bazei de date. Acestea vă vor face puțin mai ușor treaba atunci când veți efectua modificări majore ale versiunii în stratul de interacțiune. De asemenea, vor face unele sarcini dificile, cum ar fi raportarea dinamică, mai puțin eficientă și puțin mai ușor de utilizat. Voi lua ceva mai ușor în orice zi a săptămânii.

Cu ceva există compromisuri.

"Vizionările pot și probabil vă vor scădea performanța."

După cum am scris în trecut, sunt un credincios în a face compromisuri, atâta timp cât înțelegeți ce se află pe masă. Mai mult decât probabil, cineva va trece peste acest paragraf și va face un comentariu că nu ar trebui să folosiți niciodată o viziune din cauza loviturii de performanță. Nu sunt de acord. Ar trebui să utilizați fiecare instrument în caseta de instrumente, dar când acestea au sens. Nu utilizați un ciocan pentru a pune un șurub într-un perete, așa cum nu ați folosi o vedere când aveți într-adevăr nevoie de o masă de heap / memorie. Partea inversă este gradul de utilizare a dezvoltării pentru aplicațiile dvs. Când este logic să economisiți timp, efort și energie în ceea ce privește performanța pe care ați putea-o lua, alegeți-o. Dezvoltarea nu se referă numai la performanța aplicațiilor dvs., deoarece există și alte considerente, cum ar fi suportul, timpul pentru lansarea pe piață și valoarea globală a timpului.

Instrumentele cu care lucrez în acest tutorial sunt destul de standard. Folosesc phpMyAdmin pentru interacțiunea bazei de date în scopuri explicative. Voi folosi, de asemenea, structuri de masă foarte rudimentare, strict pentru ușurința explicării. Nu mă aștept ca aceste structuri de tabel să fie folosite vreodată într-un mediu de producție, pentru că le folosesc doar pentru ilustrare.

O notă suplimentară. Nu există o modalitate corectă sau greșită de a numi o viziune. Cu toate acestea, îmi numesc punctele de vedere cu sintaxa de view_ * primary_table * _ * what_the_view_is_used_for * dacă nu lucrez pentru modificări de compatibilitate înapoi. Deci, dacă creez o vizualizare pentru raportarea statistică în tabelul meu de vânzări, numele meu de vizualizare ar fi: view_salesforce_statistical_report. Acest lucru poate fi destul de lung și aveți doar 64 de caractere pentru a lucra cu, așa că țineți cont de asta. Ea funcționează pentru mine, și stilul meu, s-ar putea să nu funcționeze pentru tine.

"Nu voi spune că viziunile vă vor schimba viața, dar vă voi spune că vor face mult mai ușor să lucreze cu interacțiunea bazei de date. Ele vă vor face puțin mai ușor locul de muncă atunci când faceți modificări majore ale versiunii stratul de interacțiune, de asemenea, vor face anumite sarcini dificile, cum ar fi raportarea dinamică puțin mai eficientă și puțin mai ușor de utilizat. "


Definiții: Cum să definiți o vizualizare

Așa cum am spus, o vizualizare este doar o interogare. Există câteva configurații ușoare pe care trebuie să le facem atunci când creăm o viziune, așa că mai întâi să discutăm asta. În phpMyAdmin, în pagina tabelului "Răsfoiți", veți vedea un link numit "Creare vizualizare".

Dacă faceți clic pe linkul respectiv, ar trebui să vedeți ceva care arată astfel:

Aceasta, prietenele mele, este locul unde se petrece magia. Nu este prea mult să explicăm pe pagină, dar să examinăm cu ușurință definițiile pe care trebuie să le înțelegem pentru a crea o viziune.

Mai întâi, există "Creare vizualizare" urmată de "SAU REPLACE". Dacă dați clic pe SAU REPLACE, va face exact așa cum credeți, ceea ce suprascrie o vizualizare existentă. Numele de coloane reprezintă numele coloanelor din tabel. Fiecare este separată de o virgulă, astfel încât aceasta ar putea arăta ca first_name, second_name, etc. AS este interogarea.

Există încă două elemente de explicat, dar conceptele nu sunt grele. ALGORITMUL are selecțiile tabelului nedefinit, îmbinare și temp. Dacă selectați "Îmbinare" atunci când există o relație unul la unu, acesta va combina interogarea primită cu vizualizarea. Tabelul Temp este mai puțin eficient, dar atunci când nu utilizați o relație unul la unu, cum ar fi o funcție de agregare cum ar fi SUM () sau dacă utilizați anumite cuvinte cheie cum ar fi GROUP BY sau HAVING sau UNION, trebuie să utilizați algoritmul tabelului temp. Acestea fiind spuse, poti face ca mine, si lasati algoritmul ca "nedefinit" si MySQL va selecta cel mai bun algoritm de utilizat.

În cele din urmă, avem opțiunile CASCADED CHECK OPTION și LOCAL CHECK. Opțiunile de verificare indică MySQL să valideze definiția vizualizării dacă există o condiție privind interogarea, cum ar fi WHERE. Dacă clauza WHERE exclude datele, aceasta va împiedica actualizarea sau inserarea acelor rânduri în care ar trebui să fie excluse. LOCAL CHECK se ocupă doar cu vizualizarea pe care o definiți, unde CASCADED CHECK este pentru vizualizările pe care le-ați definit din alte vizualizări. Acesta va cascada verificarea pentru aceleași.

Aceasta este o vedere pe scurt. Să aruncăm o privire asupra unor cazuri de utilizare pentru a le vedea în acțiune și unde pot ajuta eforturile dvs. de dezvoltare.


Compatibilitate înapoi: Pentru Procrastinator

M-am întâlnit de mai multe ori decât mi-ar plăcea să-i menționez atunci când desenez un tabel de o singură utilizare pe care niciodată nu cred că va trebui să-l normalizeze în mod inevitabil. Să luăm exemplul prezentat anterior cu câteva înregistrări.

Evident, abilitățile mele de normalizare lasă ceva în acest exemplu. Ce ar fi trebuit să fac atunci când am creat prima dată această masă, avea o masă separată pentru adrese, și apoi apela un address_id în tabelul meu de forță de vânzări. Problema este că, odată ce trec la o schimbare de baze de date, trebuie să revin în stratul de interacțiune logică și să fac numeroase schimbări de interogare. În loc să faci acea multă muncă, de ce nu lăsa o viziune să ajungă la salvare.

Mai întâi, să facem schimbarea la structura tabelului meu. Eu copiez structura tabelului și datele mele la noua mea tabelă, adresele și să fac masa meserală, cum ar fi adăugarea adresei_id și eliminarea structurii care nu este necesară:

Apoi, trebuie doar să șterg coloanele infracționale și să-mi adaug adresa de returnare la masa mea de vânzări.

Aceasta este o schimbare destul de comună pe care o faceți semi-regulat, deși destul de simplistă. Vă dați seama că puteți normaliza ceva din cauza unei noi trăsături. În acest caz, ne putem reutiliza adresele pentru clienți sau pentru alți angajați sau pentru orice am putea stoca adrese. Această lucrare nu este atât de dificilă, dar în funcție de reutilizarea interogării, găsirea tuturor locurilor pe care le numiți vechiul tabel sales_force ar putea fi o schimbare mult mai mare în domeniul de aplicare. A venit o viziune.

În loc să ne întoarcem prin codul nostru chiar acum și în loc să așteptăm un ciclu normal de eliberare, putem crea o viziune pentru a păstra intacta vechea noastră funcționalitate. Am schimbat numele tabelului sales_force la sales_force_normalized:

Acum putem crea punctul nostru de vedere pentru a menține compatibilitatea înapoi:

Și avem compatibilitatea noastră înapoi cu doar munca suplimentară de a crea o interogare care stă în MySQL:

Chiar și atunci când intru într-o persoană de vânzări nouă, punctul meu de vedere va reflecta schimbarea:

Și, presto:

Aproximativ două minute de lucru pentru a ne menține compatibilitatea înapoi cu structura noastră de date anterioară. Există neajunsuri la această metodă, prin faptul că nu puteți defini un index împotriva vizualizării dvs., care este important atunci când vizualizați cascadă. În plus, va trebui în continuare să vă modificați interogările pentru INSERT, DELETE și UPDATE, dar acest lucru vă va salva unele lucruri. Performanța dvs. ar putea scădea puțin, dar ca un decalaj de oprire, nu există nicio modalitate mai ușoară de a modifica structura datelor pentru a vă ușura baza de cod în acea schimbare. Întrebările dvs. din stratul dvs. de logică vor fi neatinsă deoarece, din câte știu, se uită la masa originală.


Interogări complexe: Realizarea greu de rulat

Acum, că avem dovada conceptului nostru sub centurile noastre, să ne uităm la o altă utilizare. Am creat un alt tabel pentru a captura datele de vânzări din tabelul meu de vânzări și l-am completat cu unele informații aleatorii. Se pare ca aceasta:

Este o masă extrem de simplificată pentru a captura vânzările forței de vânzări pentru ilustrare. Există întotdeauna lucruri pe care vrem să le extragem pentru măsurători pe o masă ca asta. Probabil vreau să cunosc vânzările totale. Probabil că aș vrea să cunosc vânzările totale de persoane. De asemenea, aș vrea să știu rangul performanței vânzărilor. Aș putea scrie interogări în logica bazei mele de date pentru a efectua fiecare dintre acestea atunci când am nevoie de ele sau aș putea să scriu pur și simplu o viziune pentru a apuca datele după cum este necesar. Deoarece acesta este un tutorial despre opinii, cred că alegerea este destul de simplă în acest moment pe care tactica să o iau.

Să începem prin evaluarea vânzărilor totale, împreună cu alte informații pertinente:

Ceea ce ne oferă o imagine a:

Am inclus, de asemenea, timpul de interogare pe aceasta, ca la 200 de inregistrari, acest lucru este rapid, dar performanta va varia. Observați că nu utilizez funcțiile CHECK deoarece nu discordez informațiile într-o clauză WHERE. Acum, că avem aceste informații ambalate în mod obișnuit, este doar o chestiune de construire a mecanismului nostru de raportare în logica noastră.

Obținerea acestor informații nu este atât de greu. Să facem acest lucru doar cu un pas mai departe și să folosim o funcție GROUP BY și o funcție de integrare împotriva forței de vânzări. Din nou, folosesc interogări simplificate pentru a ilustra. În acest caz, dorim să obținem aceleași informații pe care le-am avut din vânzările totale, dar de data aceasta ne-am împărțit de către persoana noastră de vânzări individuală.

Ceea ce ne oferă o imagine a:

Din nou, foarte simplu în cele din urmă pentru a obține aceste valori din baza dvs. de date. Să aruncăm o privire la încă un exemplu, care va combina cele două vederi. Vreau să comparăm totalurile cu individul și astfel vom crea o viziune a două puncte de vedere:

Ceea ce ne oferă o imagine a:


Concluzie

Un alt beneficiu al vizualizărilor este că oferă un nivel suplimentar de securitate pentru aplicațiile dvs. Nu expuneți structura tabelului la cererea dvs. În schimb, expuneți ceva care nu există cu adevărat, cu excepția unui pseudo-tabel. Nu aș numi o idee bună și să le folosesc în primul rând pentru scrierea de aplicații sigure, dar aș considera acest lucru ca un beneficiu suplimentar.

Eu folosesc opinii într-un mod limitat. În cazul în care folosesc opiniile sunt așa cum am demonstrat mai sus, în special în mecanismele de raportare din cererile mele. Scrierea unei interogări pentru efectuarea ridicării grele pentru mine este mult mai ușoară decât scrierea logicii în jurul unor cereri mai dificile. Îmi dau un pic de succes pe parcursul performanței mele, pe care am tendința să o depășesc prin optimizarea structurii de date originale. Nu am încă să fie un spectacol oprit în termeni de performanță, dar ziua este tânără. Mulțumesc mult pentru citire.

Cod